完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
首先本人是个才学会了数码管60秒钟的计时,
买了一块单片机开发板学习,STC89C52RC。想学怎样写一个钟表程序 ,买板子的时候送个很多资料 有个计时器程序 ,强烈想弄懂它是怎样编的 详细的分析一下这个程序 ,,,虽然这是个不合理的要求。。有兴趣或热心的朋友帮忙分析一下 /**********************HJ-3G实验开发板例程************************ * 平台:HJ-3G V6.0 + Keil U3 + STC89C52 * 名称: * 公司:慧净电子科技有限公司 * 编写: * 日期:2008-8-08 * QQ : 121350852 398115088 * 晶振:11.0592MHZ * 说明:免费开源,不提供源代码分析,有问题直接到慧净论坛交流 ******************************************************************/ // S17 继续计时 S18 设置定时 // S19 取消定时 S6--S15 分别为数字键0--9 /******************************************************************** 该例程为数码管显示可定时计时器,用到HJ-3G开发板中矩阵键盘的上三排(不包括S16)与第四排前两个按键。 若要设置定时时间,可先按下S18(第四排第一个), 然后按数字键S6--S15设置定时时间(设置顺序是由高位到低位的顺序), 设置完定时后,按下S17可恢复到正常计时状态 定时时间到,蜂鸣器会持续响一分钟报时。 若要取消定时,或者蜂鸣器响时想对其关闭,可以按下S19功能键。 注意晶振需为11.0592M。 若为其他数值晶振,请合理改变TH0与TL0参数值,否则计时会有很大误差 。 ***********************************************************************************************************************/ #include #define uchar unsigned char ***it dula=P2^6; ***it wela=P2^7; ***it beep=P2^3; unsigned char j,k,a1,a0,b1,b0,c1,c0,s,f,m,key=10,temp,qq; uchar shi20,shi10,fen20,fen10,miao20,miao10,ok=1,wei,dingshi,yidingshi; uchar baoshi,baoshijieshu; unsigned int pp; unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delay(unsigned char i) { for(j=i;j>0;j--) for(k=125;k>0;k--); } void display(uchar shi2,uchar shi1,uchar fen2,uchar fen1,uchar miao2,uchar miao1) { dula=0; P0=table[shi2]; dula=1; dula=0; wela=0; P0=0xfe; wela=1; wela=0; delay(5); P0=table[shi1]|0x80; dula=1; dula=0; P0=0xfd; wela=1; wela=0; delay(5); P0=table[fen2]; dula=1; dula=0; P0=0xfb; wela=1; wela=0; delay(5); P0=table[fen1]|0x80; dula=1; dula=0; P0=0xf7; wela=1; wela=0; delay(5); P0=table[miao2]; dula=1; dula=0; P0=0xef; wela=1; wela=0; delay(5); P0=table[miao1]; dula=1; dula=0; P0=0xdf; wela=1; wela=0; delay(5); } void keyscan0() { P3=0xfb; //1111 1011 INT0 下降沿有效 / unsigned char j,k,a1,a0,b1,b0,c1,c0,s,f,m,key=10,temp,qq; //uchar baoshi,baoshijieshu; temp=P3; // uchar shi20,shi10,fen20,fen10,miao20,miao10,ok=1,wei,dingshi,yidingshi; temp=temp&0xf0; // temp 1111 1011与0xf0= 1111 0000 按位进行与运算得1111 0000 //uchar baoshi,baoshijieshu; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0x7b: ok=1; dingshi=0; break; } } } P3=0xf7; // 1111 0111 T0=0; temp=P3; temp=temp&0xf0;//0xf0= 1111 0000 if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xe7: ok=0; dingshi=1; break; case 0xd7: yidingshi=0; //取消定时 break; } } } } void keyscan() { { P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xee: key=0; wei++; break; case 0xde: key=1; wei++; break; case 0xbe: key=2; wei++; break; case 0x7e: key=3; wei++; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; } } P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xed: key=4; wei++; break; case 0xdd: key=5; wei++; break; case 0xbd: key=6; wei++; break; case 0x7d: key=7; wei++; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; } } P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb: key=8; wei++; break; case 0xdb: key=9; wei++; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; } } } } void main() { TMOD=0x01; TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。 TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12 ET0=1; EA=1; while(1) { keyscan0(); if(ok==1) { TR0=1; wei=0; display(a1,a0,b1,b0,c1,c0); if(pp==20) { pp=0; m++; if(m==60) { m=0; f++; if(f==60) { f=0; s++; if(s==24) //为24h一个循环,若要12h,只需在此改为12即可。 { s=0; } } } } a0=s%10; a1=s/10; b0=f%10; b1=f/10; c0=m%10; c1=m/10; display(a1,a0,b1,b0,c1,c0); } else { if(dingshi==1) { TR0=0; display(shi20,shi10,fen20,fen10,miao20,miao10); keyscan(); if(key!=10) { switch(wei) { case 1: if(key<3) //小时最高位为2 shi20=key; else wei--; break; case 2: if(a1==1|a1==0) shi10=key; else if(key<5) a0=key; //当小时最高位为2时,低位最高为4 break; case 3: if(key<6) //分钟最高位为5 fen20=key; else wei--; break; case 4: fen10=key; break; case 5: if(key<6) //秒最高位为5 miao20=key; else wei--; break; case 6: miao10=key; break; } key=10; } yidingshi=1; display(shi20,shi10,fen20,fen10,miao20,miao10); } } if(yidingshi==1) { if((a1==shi20)&&(a0==shi10)&&(b1==fen20)&&(b0==fen10)&&(c1==miao20)&&(c0==miao10)) beep=0; } if(((a1==shi20)&&(a0==shi10)&&(b1==fen20)&&(b0==fen10+1)&&(c1==miao20)&&(c0==miao10))||(yidingshi==0))//一分钟报时提示 beep=1; } } void time0() interrupt 1 { TH0=(65536-46080)/256; TL0=(65536-46080)%256; pp++; }
|
|
相关推荐 |
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
238 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
629 浏览 0 评论
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
552 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
552 浏览 0 评论
1074 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11763 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 23:13 , Processed in 0.467543 second(s), Total 73, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号