完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
使用软件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 con1=P3^0; ***it con2=P3^1; ***it con3=P3^2; ***it con4=P3^3; ***it con5=P3^4; ***it con6=P3^5; char tmp=0,sec,min,hour;//-128-127 void delay(char ms) { char x,y; for(x=ms;x>0;x--) for(y=110;y>0;y--); } void display(char s,char m,char h)//把显示的功能封装成子函数 { P2=table[h/10]; con1=1; delay(10); con1=0; P2=table[h%10]; con2=1; delay(10); con2=0; P2=table[m/10]; con3=1; delay(10); con3=0; P2=table[m%10]; con4=1; delay(10); con4=0; P2=table[s/10]; con5=1; delay(10); con5=0; P2=table[s%10]; con6=1; delay(10); con6=0; } 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) { display(sec,min,hour); if(sec==60) { sec=0; min++; if(min==60) { min=0; hour++; if(hour==24) { hour=0; } } } } } 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++; } }//时间处理 电路仿真效果 定时供水:规定晚上9点-晚上12点供水 #include char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80 ,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//把数组放入ROM中 ***it con1=P3^0; ***it con2=P3^1; ***it con3=P3^2; ***it con4=P3^3; ***it con5=P3^4; ***it con6=P3^5; ***it relay=P1^0; char tmp=0,sec=50,min=59,hour=23;//-128-127 void delay(char ms) { char x,y; for(x=ms;x>0;x--) for(y=110;y>0;y--); } void display(char s,char m,char h)//把显示的功能封装成子函数 { P2=table[h/10]; con1=1; delay(10); con1=0; P2=table[h%10]; con2=1; delay(10); con2=0; P2=table[m/10]; con3=1; delay(10); con3=0; P2=table[m%10]; con4=1; delay(10); con4=0; P2=table[s/10]; con5=1; delay(10); con5=0; P2=table[s%10]; con6=1; delay(10); con6=0; } 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,相当于把所有的三极管都关闭 relay=0; while(1) { if(hour>20)//如果时间是20:59:59,电机都不会运转,到了21:00:00后,if条件成立 { relay=1; } //到了晚上12点需要关闭,晚上12点其实是00:00:00,如果还是23:59:59继电器都不关闭 else { relay=0; } display(sec,min,hour); if(sec==60) { sec=0; min++; if(min==60) { min=0; hour++; if(hour==24) { hour=0; } } } } } 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++; } }//时间处理 电路仿真效果(注意继电器的变化) |
|
|
|
只有小组成员才能发言,加入小组>>
3148 浏览 9 评论
2841 浏览 16 评论
3349 浏览 1 评论
8736 浏览 16 评论
3944 浏览 18 评论
9563浏览 3评论
906浏览 3评论
466浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
465浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2187浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-28 16:24 , Processed in 1.483353 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号