51单片机带整点报时
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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();//发声}}
结束