完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 toya 于 2012-7-14 20:45 编辑
用数码管(8位)显示的数字时钟,由于是在开发板上写的程序,所以51单片机的一些I/O口设定并不完全一样,以下程序仅供参考 #include ***it dula=P2^6; //段选锁存器 ***it wela=P2^7; //位选锁存器 ***it key1=P3^2; //INT0 选择键 ***it key2=P3^4; //T0 时间增加 ***it key3=P3^6; //S4 时间减少 char a=0,hour=0,minute=0,seconed=0; char h1,h2,m1,m2,s1,s2; char num=0; char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay(char z) { char x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void display_hour(char h) //显示小时 { h1=h/10; h2=h%10; wela=1; P0=0xfe; //1111 1110 wela=0; P0=0xff; dula=1; P0=table[h1]; dula=0; delay(5); wela=1; P0=0xfd; //1111 1101 wela=0; P0=0xff; dula=1; P0=table[h2]; dula=0; delay(5); } void display_minute(char m) //显示分钟 { m1=m/10; m2=m%10; wela=1; P0=0xf7; //1111 0111 wela=0; P0=0xff; dula=1; P0=table[m1]; dula=0; delay(5); wela=1; P0=0xef; //1110 1111 wela=0; P0=0xff; dula=1; P0=table[m2]; dula=0; delay(5); } void display_seconed(char s) //显示秒 { s1=s/10; s2=s%10; wela=1; P0=0xbf; //1011 1111 wela=0; P0=0xff; dula=1; P0=table[s1]; dula=0; delay(5); wela=1; P0=0x7f; //0111 1111 wela=0; P0=0xff; dula=1; P0=table[s2]; dula=0; delay(5); } void init() //初始化函数 { TMOD=0x01; //定时器0工作方式1 TH0=(65536-45872)/256; //装初值晶振11.0592 50ms为45872 TL0=(65536-45872)%256; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; //开启定时器0 } void key() //按键函数,功能为对时间进行调整 { if(key1==0) //key1键按下进入选择并停止定时器 { delay(10); while(!key1); //松手检测 TR0=0; num++; //没按一次key1 num自加1 } if(num==1) //key1按一次进行“小时”调整 { if(key2==0) //key2按下时间增加 { delay(10); while(!key2); hour++; if(hour==24) hour=0; } if(key3==0) //key3按下时间减少 { delay(10); while(!key3); hour--; if(hour<0) hour=23; } } if(num==2) //按下key1两次进行“分钟调整” { if(key2==0) { delay(10); while(!key2); minute++; if(minute==60) minute=0; } if(key3==0) { delay(10); while(!key3); minute--; if(minute<0) minute=59; } } if(num==3) //key1按下三次对“秒”进行调节 { if(key2==0) { delay(10); while(!key2); seconed++; if(seconed==60) seconed=0; } if(key3==0) { delay(10); while(!key3); seconed--; if(seconed<0) seconed=59; } } if(num==4) //key1按下四次认为调节完毕开启定时器并将num清0 { num=0; TR0=1; } } void main() { init(); while(1) { display_seconed(seconed); //显示“秒,分,时” display_minute(minute); display_hour(hour); if(a==20) //判断定时器是否到1s { a=0; seconed++; if(seconed>59) { seconed=0; minute++; if(minute>59) { minute=0; hour++; if(hour>23) { hour=0; } } } } key(); } } void time() interrupt 1 { TH0=(65536-45872)/256; TL0=(65536-45872)%256; a++; } 51单片机的原理图附后
|
|
相关推荐
101 个讨论
|
|
学习中,谢谢分享
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 20:13 , Processed in 0.442175 second(s), Total 47, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号