51单片机带整点报时

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

sbit BUZ =P3^3;

sbit HOURADD=P3^0;//小时加1

sbit MITADD=P3^1;//分钟加1

sbit change=P3^2;//进制转换

unsigned int h=0,m=59,s=50;//h为小时,m为分钟,s为秒钟

unsigned char code seg7[]=

//{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管0-9码值

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管0-9码值unsigned char code disp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位扫描

unsigned char data disdata[6];

void Delayms(int ms)//延时函数{while(ms){unsigned char i;

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

ms--;}}

void display()//扫描显示

{unsigned char i;

disdata[0]=h/10;//数据处理,小时高位

disdata[1]=h%10;//小时低位

disdata[2]=m/10;//分钟高位

disdata[3]=m%10;//分钟低位

disdata[4]=s/10;//秒钟高位

disdata[5]=s%10;//秒钟低位

for(i=0;i<6;i++)//循环显示{P1=0xff;

P1=seg7[disdata[i]];

P2=disp[i];

Delayms

(2);//显示xx}}

void time0(void)interrupt 1 using 0 //时间计数函数{TH0=0xfc;//(65536-200)/256;

TL0=0x18;//(65536-200)%256;

s++;

if(s==60){s=0;

m++;

if(m==60){m=0;

h++;

if(change==0&&h==12)//按下进制转换键为12进制

{h=0;}

if(change==1&&h==24)//未按下进制转换键为24进制

{h=0;}}}}}

void voice()//发声函数{if((m==59)&&(s==51))//判断时间符合低音条件{BUZ =~BUZ;

Delayms

(80);}if((m==59)&&(s==53))//判断时间符合低音条件{BUZ =~BUZ;

(80);}if((m==59)&&(s==55))//判断时间符合低音条件{BUZ =~BUZ;

Delayms

(80);}if((m==59)&&(s==57))//判断时间符合低音条件{BUZ =~BUZ;

Delayms

(80);}if((m==59)&&(s==59))//判断时间符合高音条件{BUZ =~BUZ;

Delayms

(55);}}

void keyscan()//键盘扫描{if(change==0)//判断是否按下进制转换键,{Delayms

(10);

if(change==0&&h>=12)//若h>12,则执行h-12,转换成12进制

{ h=h-12;}}if(HOURADD==0)//判断是否按下小时加1键{Delayms

(10);

if(HOURADD==0){while(HOURADD==0);

h++;

if(h==24)

{h=0;}}}

if(MITADD==0)//判断是否按下分钟加1键{Delayms

(10);

if(MITADD==0){while(MITADD==0);

m++;

{m=0;}}}}main()

{ unsigned int time();

TMOD=0x01;//软件启动计数器、工作方式为方式1 EA=1;

ET0=1;//允许定时计数器xx

TR0=1;//启动计数

while

(1)

{ keyscan();//扫描键盘

display();//显示

voice();//发声}}

结束

相关文档
最新文档