完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include "reg51.h"
***it smg1=P1^6; //数码管十位的位选端 ***it smg0=P1^7; //数码管个位的位选端 ***it EW_R_Lamp=P1^5; ***it EW_Y_Lamp=P1^4; ***it EW_G_Lamp=P1^3; ***it SN_R_Lamp=P1^2; ***it SN_Y_Lamp=P1^1; ***it SN_G_Lamp=P1^0; #define uchar unsigned char #define uint unsigned int #define EW_R_Lamp_ON EW_R_Lamp=1 //东西红灯亮 #define EW_R_Lamp_OFF EW_R_Lamp=0 #define EW_Y_Lamp_ON EW_Y_Lamp=1 //东西黄灯亮 #define EW_Y_Lamp_OFF EW_Y_Lamp=0 #define EW_G_Lamp_ON EW_G_Lamp=1 //东西绿灯亮 #define EW_G_Lamp_OFF EW_G_Lamp=0 #define SN_R_Lamp_ON SN_R_Lamp=1 #define SN_R_Lamp_OFF SN_R_Lamp=0 #define SN_Y_Lamp_ON SN_Y_Lamp=1 #define SN_Y_Lamp_OFF SN_Y_Lamp=0 #define SN_G_Lamp_ON SN_G_Lamp=1 #define SN_G_Lamp_OFF SN_G_Lamp=0 uchar smg_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管段选 uchar kk,aa; void smg_display(uchar n) //数码管显示程序 { uchar i,j; i=n/10; //显示数字的十位 j=n%10; //显示数字的个位 smg1=1; P0=smg_duan[i]; smg0=1; P1=smg_duan[j]; } void delay_50us(uint t) //延时50us { uchar j; for(;t>0;t--) for(j=19;j>0;j--); } void EW_G_Lamp_SS() //东西绿灯闪烁 { EW_G_Lamp_ON; delay_50us(200); EW_G_Lamp_OFF; delay_50us(200); } void SN_G_Lamp_SS() { SN_G_Lamp_ON; delay_50us(200); SN_G_Lamp_OFF; delay_50us(200); } void init() //初始化 { EA=1; //开总中断开关 EX0=1; //打开外部中断0中断允许开关 IT0=0; //设置外部中断0的触发方式为低电平触发 TMOD=0x01; //设置定时器0为工作方式1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; //赋初值 ET0=1; //打开定时器中断0 TR0=0; //先不启动定时器 } void main() { init(); EW_R_Lamp_OFF; EW_Y_Lamp_OFF; EW_G_Lamp_OFF; SN_R_Lamp_OFF; SN_Y_Lamp_OFF; SN_G_Lamp_OFF; while(1); //等待外部中断触发 } void int0() interrupt 0 { /*进入中断,开始计时*/ TR0=1; /*南北红灯维持25S,在南北红灯亮的同时东西绿灯也亮,并维 持20S,到20S时,东西绿灯闪烁,闪烁3S后熄灭。在东西绿灯熄灭 时,东西黄灯亮,并维持2S。2S到后,东西黄灯熄,东西红灯亮。 同时,南北红灯熄灭,南北绿灯亮。*/ if(aa<25) { smg_display(aa); SN_R_Lamp_ON; if(aa<20) EW_G_Lamp_ON; else if(aa<23) EW_G_Lamp_SS(); else { EW_G_Lamp_OFF; EW_Y_Lamp_ON; } } /*3)东西红灯维持30S,南北绿灯维持25S,然后闪烁3S,熄灭,同时 南北黄灯亮,维持2S后熄灭,这时南北红灯亮,东西绿灯亮。*/ else if(aa<55) { smg_display(aa-25); EW_Y_Lamp_OFF; EW_R_Lamp_ON; SN_R_Lamp_OFF; if(aa<50) SN_G_Lamp_ON; else if(aa<53) SN_G_Lamp_SS(); else { SN_G_Lamp_OFF; SN_Y_Lamp_ON; } } else aa=0;//当aa大于或等于55时,清零 } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; //赋初值 kk++; if(kk>=20)//kk每50ms加一,则aa每1S加一 { kk=0; aa++; } }
|
|
相关推荐
1个回答
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
5050 浏览 3 评论
6347 浏览 1 评论
6607 浏览 0 评论
Protues中自己封装的芯片元件无Program File、Clock Frequency选项怎么解决,求求大神了!
8359 浏览 1 评论
基于51单片机的车辆倒车雷达报警系统,HC-SR04超声波测距,全套资料
1248 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 06:46 , Processed in 0.647928 second(s), Total 73, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号