完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
绿70秒,黄3秒,红60秒
使用软件Proteus和Keil uVision4 代码如下: #include char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80 ,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//把数组放入ROM中 ***it green=P1^0; ***it yellow=P1^1; ***it red=P1^2; //设计绿灯70s,黄灯3s,红灯60s,所以时间周期是133s char tmp=0,sec=133;//红黄绿灯都是倒计时 main() { //定时器的初始化 TMOD=0x01;//定时器方式一的设置 TR0=1;//time run ET0=1;//定时器的使能 EA=1; //总中断打开 TH0=(65536-50000)/256;//50ms定时一次,高8位 TL0=(65536-50000)%256;//50ms定时一次,低8位 P3=0;//一开始,把所有的P3口都置0,相当于把所有的三极管都关闭 while(1) { if(sec==0)//说明一个周期已经运行完了,进入下一个周期 { sec=133; } if(sec>63)//绿灯时间点,数码管显示的数字70-1,133>=sec>=64 { green=0;//绿灯亮 yellow=1;//黄灯灭 red=1;//红灯灭 P2=table[(sec-63)/10]; P3=table[(sec-63)% 10]; } else if(sec>60)//此时sec满足63>=sec>=61 { green=1;//绿灯灭 yellow=0;//黄灯亮 red=1;//红灯灭 P2=table[(sec-60)/10];//显示的数字3到1 P3=table[(sec-60)% 10];//显示的数字3到1 } else { green=1;//绿灯灭 yellow=1;//黄灯灭 red=0;//红灯亮 P2=table[sec/10];//显示的数字60到1 P3=table[sec%10];//显示的数字60到1 } } } void time0()interrupt 1//interrupt是中断标志号1一定要与中断类型对应上,50ms进入一次中断函数 //CPU接收到了中断的请求后,会自动执行这个函数,不要在main函数中调用 //定时器与延时相比,延时是需要调用,定时就像后台自动执行 //定时器的CPU工作效率比较高 { TH0=(65536-50000)/256;//50ms定时一次,高8位 TL0=(65536-50000)%256;//50ms定时一次,低8位 //如果不重置TH0和TL0,那下一轮的中断就变成了65.536ms tmp++;//每隔50ms加一,加到多少就变成1s,20次 if(tmp==20)//这逻辑成立,代表是1s到 { tmp=0;//计算下一轮的1s,让tmp置0 sec--;//每隔一秒要减一 } }//时间处理 |
|
|
|
只有小组成员才能发言,加入小组>>
2514 浏览 0 评论
1094浏览 2评论
705浏览 1评论
458浏览 0评论
200浏览 0评论
341浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 08:04 , Processed in 1.122609 second(s), Total 47, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号