求89c52单片机 C语言实现数字时钟程序

作者&投稿:长善 (若有异议请与网页底部的电邮联系)
用C语言编写程序使89C52单片机实现数字时钟功能,显示时分秒的数码管,求程序和图~

你好!
你的功能没有描述清楚,是这样的效果吗,私。信。说。明。一。下。

这个是简单的数码管时钟显示如果有需要,我写过比较完善的1602显示时钟.显示控制年月日等等.#include
sbit Begin=P2^0;
sbit Hour=P2^1;
sbit Mus=P2^2;
sbit End=P2^3;
unsigned char code Tab[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
unsigned char code num[]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char Time[]={0,0,16,0,0,16,0,0};
unsigned char a;
unsigned int x,m,th;
void init()
{
TMOD=0x01;
TH0=(65535/50000)/256;
TL0=(65535/50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
unsigned char keyboard()
{
if(Begin==0){
delay(5);
if(Begin==0)
return 1;
}
if(Hour==0){
delay(30);
if(Hour==0)
return 2;
}
if(Mus==0)
return 3;
if(End==0)
return 4;
}
void display()
{
unsigned char i; for(i=0;i<8;i++)
{
P3=num[i];
P0=Tab[Time[i]];
delay(5);
}
}
void main()
{
unsigned char Key;
init();
Key=keyboard();
if(Key==1)
{
while(1){
Key=keyboard();
display();
if(Key==2)
x+=3600;
if(Key==3)
x+=1;
if(Key==4)
return;
}
}}
void holes() interrupt 1 using 2
{
TH0=(65535/50000)/256;
TL0=(65535/50000)%256;
a++;
if(a>=20)
{
x++;
m=x;
th=m/3600; //设置小时
Time[0]=th/10;
Time[1]=th%10;
m=m%3600; Time[2]=16; th=m/60; //设置分钟
Time[3]=th/10;
Time[4]=th%10;
m=m%60; Time[5]=16; th=m; //设置秒
Time[6]=th/10;
Time[7]=th%10; a=0;
}
}

#include <AT89X52.H>

#include <intrins.h>

#define REST P3_4

#define SCLK P3_7

#define DATA P3_6 

unsigned char code displayCode[]={0xc0,0xf9,0xa4,0xb0,0x99,

            0x92,0x82,0xf8,0x80,0x90};

unsigned char code controladdress[]={0x80,0x82,0x84,0x86,0x88,

               0x8a,0x8c,0x8e,0x90,0xbe};

unsigned char hour,minute,second;

unsigned char day,month,week,year;

unsigned char clockhour,clockminute;

unsigned int num;

unsigned char select,oneminute;

bit bdata modeselect;

void delay();

void writetime();

void display(unsigned char temp,unsigned char  mode);

void sound()

{    

  while(num<2000)

    {

    P3_0=0;  

   }

   P3_0=1;

}

void initial()

{

 P0=0;

 TMOD=0x22;

 IE=0xCF;

 IT0=1;

 IT1=1;

 T2CON=0;

 RCAP2L=0xf0;

 RCAP2H=0x1f;

 TH2=0x1c;

 TL2=0xf0;

 

 IP=0X06;

 TH0=0x48;

 TL0=0x48;

 TH1=0X48;

   TR0=1;

   PCON=0x01;

 hour=12;

 minute=0;

 second=0;

 num=0;

 select=0;

 clockhour=12;

 clockminute=0;

 modeselect=0;

 day=16;

 month=8;

 week=7;

 year=9;

}

void interrupt0()interrupt 0 using 3

{  

  TR1=1;

  select++;

  if(select==8)

   {  

   select=0;

   }

  if(select==1)

   ET2=1;

  oneminute=second-1;

}

void timer0()interrupt 1 using 3

{

 num++;

 if(num==5000)

  {

   num=0;

   second++;

  }

  if(second>=60)

   {

   minute++;

   second=0;

  }

  if(minute>=60)

    {

   hour++;

   minute=0;

  }

  if(hour>=24)

      hour=0;

}

void interrupt1()interrupt 2 using 3

{  

  oneminute=second-1;

  switch(select)

   {

   case 4:{

      hour++;

      if(hour>=24)

       hour=0;

       break;

      }

   case 5:{

      minute++;

      if(minute>=60)

       minute=0;

       break;

      }

   case 6:{

      second++;

      if(second>=60)

       second=0;

       break;

      }

    case 2:{

      clockhour++;

      if(clockhour>=24)

       clockhour=0;

       break;

      }

   case 3:{

      clockminute++;

      if(clockminute>=60)

       clockminute=0;

       break;

      }

    default:{

        modeselect=0;

        ET2=!ET2;  

        break;

        }

  }

  }

void timer1()interrupt 3 using 3

{

 

 if(select)

  {

   

   if(second==oneminute)

    {

     select=0;

     TR1=0;

    }

  }

}

void timer2()interrupt 5 using 3

{

 

 sound();

 TF2=0;

 if(minute!=clockminute||hour!=clockhour)

  TR2=0;

}

void delay()

{

 unsigned char i=255;

 while(--i)

  {

   ;

  }

}

void display(unsigned char temp,unsigned char  mode)

{

  if(temp==4||temp==2)

  P0=0;

  else

  P0=1;

  if(mode)

    P1=displayCode[hour/10];

  else

  P1=displayCode[clockhour/10];

  delay();

  

  if(temp==4||temp==2)

  P0=0;

  else

  P0=2;

  if(mode)

    P1=displayCode[hour%10];

  else

  P1=displayCode[clockhour%10];

  delay();

  

  if(temp==1||temp==2||temp==3)

  P0=0;

  else  

  P0=4;

  P1=0xbf;

  delay();

  if(temp==5||temp==3)

  P0=0;

  else

  P0=8;

  if(mode)

  P1=displayCode[minute/10];

  else

  P1=displayCode[clockminute/10];

  delay();

  if(temp==5||temp==3)

  P0=0;

  else

  P0=16;

  if(mode)

  P1=displayCode[minute%10];

  else

  P1=displayCode[clockminute%10];

  delay();

 

    if(temp==1||temp==2||temp==3)

  P0=0;

  else

  P0=32;

  P1=0xbf;

  delay();

  if(temp==6)

  P0=0;

  else

  P0=64;

  if(mode)

  P1=displayCode[second/10];

  else

  P1=displayCode[0];

  delay();

  if(temp==6)

  P0=0;

  else

  P0=128;

   if(mode)

   {

  if(ET2)

    P1=displayCode[second%10]+128;

   else

    P1=displayCode[second%10];

    }

  else

    P1=displayCode[0];

  delay();

}

void write(unsigned char Bdata)

{  

 unsigned char i=8;

   for(;i>0;i--)

  {  

   if(Bdata&0x01)

   DATA=1;

   else

   DATA=0;

   SCLK=1;

   SCLK=0;

   Bdata>>=1;

  } 

}

void  writedata(unsigned char address,Bdata)

{

 REST=0;

 SCLK=0;

 _nop_();

 REST=1;

 write(address);

 write(Bdata);

 REST=0;

}

unsigned char read(unsigned char Bdata)

{

 unsigned char tdata=0,i=8;

 REST=0;

 SCLK=0;

 _nop_();

 REST=1;

 write(Bdata);

   for(;i>0;i--)

  {  

     tdata>>=1;

     if(DATA)

     tdata=tdata|0x80;

     else

     tdata|=0x00;

     SCLK=1; 

       SCLK=0;

    

   }   

  return tdata;

}

void writetime()

{

 unsigned char i,time,temp[3];

 temp[0]=second;

 temp[1]=minute;

 temp[2]=hour;

 for(i=0;i<3;i++)

 {

  time=temp[i]%10;

  time|=(temp[i]/10)<<4;

  writedata(controladdress[i],time);

 }

}

void writeyear()

{

 unsigned char i,year0,temp[4];

 temp[0]=day;

 temp[1]=month;

 temp[2]=week;

 temp[3]=year;

 for(i=0;i<4;i++)

 {

  year0=temp[i]%10;

  year0|=(temp[i]/10)<<4;

  writedata(controladdress[i+3],year0);

 }

}

void readtime()

{

 unsigned char i,time,temp[3];

 for(i=0;i<3;i++)

  {

   temp[i]=read(1+controladdress[i]);

   time=temp[i]&0x0f;

   time+=(temp[i]>>4)*10;

   temp[i]=time;

  }

 second=temp[0];

 minute=temp[1];

 hour=temp[2];

}

void readyear()

{

 unsigned char i,year0,temp[4];

 for(i=0;i<4;i++)

 {

   temp[i]=read(1+controladdress[i+3]);

   year0=temp[i]&0x0f;

   year0+=(temp[i]>>4)*10;

   temp[i]=year0; 

 }

 day=temp[0];

 month=temp[1];

 week=temp[2];

 year=temp[3];

}

void main()

 initial();

 sound();

 writedata(0x8e,0x00);

 writedata(0x84,0x12);

 writedata(0x8f,0x00);

 readtime(); 

 writeyear();

 readyear();

 while(1)

  {

  switch(select)

   {

   case 0:{

       display(0,1);

       break;

      }

   case 1:{

      if(num<=2500)

       {  

        display(1,0);    

       }

       else

        {

        display(0,0);

       }

        break;

      }

   case 2:{

      if(num<=2500)

       {  

        display(2,0);    

       }

       else

        {

        display(0,0);

       }

        break;

      }

   case 3:{

      if(num<=2500)

       {  

        display(3,0);    

       }

       else

        {

        display(0,0);

       }

        break;

      }

   case 4:{

      if(num<=2500)

       {  

        display(4,1);    

       }

       else

        {

        display(0,1);

       }

        break;

      }

   case 5:{

      if(num<=2500)

       {  

        display(5,1);    

       }

       else

        {

        display(0,1);

       }

        break;

      }

   case 6:{

      if(num<=2500)

       {  

        display(6,1);    

       }

       else

        {

        display(0,1);

       }

        break;

      }

   case 7:{   

       

        writetime(); 

        writetime();  

        writetime();

        select=0;

        break;

      }

   default:break;

  }

 

  if(second==0)

   {

    if(minute==0||minute==30)

    sound();

    }

   if(minute==clockminute&&hour==clockhour)

    {

     TR2=1;

     modeselect=1;

   }

   if(modeselect==1&&hour==clockhour&&!((minute-clockminute)%5)) 

     TR2=1; 

  }

}



result equ 40h
one equ 41h
ten equ 42h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 0000h
jmp main
org 001bh
jmp change
org 0040h
main:
MOV IE,#88H ;;;;;;;;;;;;;;T1 中断 允许
mov r2,#10h ;;;;;;;;;;;;;;设置 X 秒中断一次
mov result,#00h
mov one,#00h
mov ten,#00h
mov dptr,#0bfffh
mov a,#80h
movx @dptr,a ;;;;;;; 8255工作方式
mov Tmod,#10h ;;;;;;;;定时器 工作方式
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
acall timer
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
show:
mov r1,#02h
mov r0,#41h
loopLed:
mov a,r1
mov dptr,#con
movc a,@a+dptr ;;;;;;;;;;;;;;送给 B口 的数据 以 选择 led
mov dptr,#9fffh
movx @dptr,a
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov dptr,#tab
mov a,@r0
movc a,@a+dptr
cpl a ;;;;;;;;;;;查表取得 相应位数上的 数值
mov dptr,#8fffh ;;;;A口
movx @dptr,a
inc r0
call delay
djnz r1,loopLed ;;;;;;;;;;循环 3 次 ,显示完 三个 led
mov a,result
cjne a,#3ch,next
jmp main
next:
jmp show
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 中断 相应程序
change:
dec r2
mov a,r2
jnz ignore
inc result
call Display
mov r2,#10h ;;;;;;;;;;;;;;;;;;;
ignore:
call timer
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
tab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h ;;;;;;;;;; 0-9 的数据 表
con: db 00h,40h,80h ;;;;;修改 LED 选择的表
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
timer:
mov tl1,#0cfh
mov th1,#03ah ;;;;;;;;;;;;;;;;;定时50ms
setb tr1 ;;;;;;;;;;;;;;;;;启用T1定时器
ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Display: ;;;;;;;;;;;;;;;;将采集到得数分解成2个 数
mov a,result
mov b,#0ah
div ab
mov ten,a ;;;;;;;;;;;;十位
mov one,b ;;;;;;;;;;;;个位
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
delay: mov r6,#05h ;;;;;;;;;;;;;;不用解释了、
delay1:mov r5,#0ffh
djnz r5,$
djnz r6,delay1
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
end


睢宁县17274997561: 用C语言编写程序使89C52单片机实现数字时钟功能,急求! -
致庞外科: /*---------------------------------------------------------------*/ /* 文件名称:SZ01.c */ /* 程序功能:带定时闹铃时钟 */ /*---------------------------------------------------------------*/ #include <AT89X51.H> /*包含器件配置文件*/ #define uchar unsigned char #define uint ...

睢宁县17274997561: 求89c52单片机 C语言实现数字时钟程序 -
致庞外科: result equ 40h one equ 41h ten equ 42h ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h jmp main org 001bh jmp change org 0040h main: MOV IE,#88H ;;;;;;;;;;;;;;T1 中断 允许 mov r2,#10h ;;;;;;;;;;;;;;设置 X 秒中断一次 mov result,#...

睢宁县17274997561: STC89C52RC单片机控制两个继电器并且在数码管显示数字的C语言代码 -
致庞外科: sbit Q2 Px^x; sbit Q1 Px^x; uchar KEY;//键盘输入或程序给出0-3 switch(KEY){ case 0:Q1=0;Q2=0; case 1:Q1=1;Q2=1; case 2:Q1=1;Q2=0; case 3:Q1=0;Q2=1; }//将KEY显示输出,或查表或判断输出显示 是不是我理解有误?但愿有用.为什么不用模拟开关呢?

睢宁县17274997561: 求89c52单片机实现数字钟的汇编语言程序 -
致庞外科: S_SET BIT P3.2 ;数字钟秒控制位 M_SET BIT P3.3 ;分钟控制位 H_SET BIT P3.4 ;小时控制位 SECOND EQU 30H MINUTE EQU 31H HOUR EQU 32H TCNT EQU 34H ORG 0000H SJMP START ORG 000BH LJMP INT_T0 START:MOV ...

睢宁县17274997561: 怎么编写C语言程序使STC89C52RC单片机数码管从0显示到10,然后全灭,再从10减到0,全灭 -
致庞外科: 这个东西还是根据板子怎么控制数码管来写,如果是锁存控制,就开一次,显示一个数 延时 下一个数 全没就是0xff或0x00

睢宁县17274997561: 单片机(型号89C52)之简易数字电压表的设计 -
致庞外科: ///暂存转换结果 CLR OE ;/,R5 DA A ,A LCALL DISP ;///这个是最基本的,R4 DA A MOV R4;/存放转换后的数据,A MOV R5;数码管字形码表//,LED_1 MOVC A;/延时子程序//// ORG 0000H AJMP START ORG 0030H;/################...

睢宁县17274997561: 希望朋友们帮忙,给一下STC89C52单片机 C语言实现数字时钟的程序,初学单片机,请多关照 6个8位数码管显示 -
致庞外科: 使用方法:1.长按SETEN(P3.3,(S3))键1.5s,进入时间设置状态, 首先秒位会闪动2.按时间+1(P3.4,(S6)),或者时间-1(P3.5,(S9)) 来对闪动的部分进行时间设置3.再按SETEN键,调整分钟,分钟位会闪烁,重复步骤2,设置好分钟.4.再按...

睢宁县17274997561: AT89S52单片机0~999计数显示C语言程,起始显示000,一直到999 -
致庞外科: /*************************************/#include //通用89C52头文件 sbit Axs=P3^4;//个位 sbit Bxs=P3^5;//十位 sbit Cxs=P3^6;//百位 sbit Dxs=P3^7;//千位 char table[10]={0xd7,0x14,0xcd,0x5d,0x1e,0x5b,0xdb,0x15,0xdf,0x5f};//数码管显示编码 ...

睢宁县17274997561: 单片机(型号89C52)之简易数字电压表的设计 -
致庞外科: 数字电压表...

睢宁县17274997561: 89c52单片机求编程 -
致庞外科: #include<reg51.h> #define uchar unsigned char uchar num=0; sbit pulse=P1^0; void t0isr() interrupt 1{ num++; if(num<6)pulse=1; else pulse=0; if(num>80)num=0; } main() { TMOD=0x02; TH0=6; TL0=6; ET0=1; TR0=1; EA=1; while(1); }

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网