单片机红绿灯仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
仿真图片
带左转灯
单片机源程序如下:
- #include "use.h"
- #include "main.h"
- uchar code seg_du[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //七段管段码真值表 共阴 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
- uchar code seg_we[]={0x01,0x02,0x04,0x08}; //共阴位码 0x01,0x02,0x04,0x08 0xfe,0xfd,0xfb,0xf7
- uchar BackupGreen,BackupRed,CopyLight,CopyLLight,backupLGreen;
- void Seg_Display(uchar number,uchar wei) //数码管动态显示程序
- {
- P0=0X00; //0XFF
- we=1; //2.7
- we=0;
- P0=seg_du[number];
- du=1; //2.6
- du=0;
- P0=seg_we[wei];
- we=1;
- we=0;
- }
- void UrgentScan() //设置 ???情况运行扫描
- {
- Seg_Display(BackupGreen/10,0);
- Seg_Display(BackupGreen%10,1);
- Seg_Display(BackupRed/10,2);
- Seg_Display(BackupRed%10,3);
- }
- void SetLGreen()
- {
- Seg_Display(backupLGreen/10,0);
- Seg_Display(backupLGreen%10,1);
- }
- void SetModel() //红绿灯设置模式
- {
- if(StaSysterm==NormalRun) //正常情况下修改为设置状态
- {
- StaSysterm=ResetGreen;
- BackupGreen=GreenTime;
- BackupRed=RedTime;
- backupLGreen = GreenLTime;
- CopyLight=P2; //对数据进行备份
- CopyLLight = P1;
- P2=0X09;
- }
- else if(StaSysterm==ResetGreen) //优先设置绿灯时间
- {
- StaSysterm=ResetRed;
- }
- else if(StaSysterm==ResetRed) //后设置红灯时间 设置完成后按键退出设置状态
- {
- StaSysterm=ResetLGreen;
- }
- else if(StaSysterm==ResetLGreen) //后设置红灯时间 设置完成后按键退出设置状态
- {
- StaSysterm=NormalRun;
- P2=CopyLight; //恢复数据
- P1=CopyLLight;
- }
- }
- void ADDTime() //红绿灯时间加
- {
- if(StaSysterm==ResetGreen)
- {
- BackupGreen++;
- if(BackupGreen>=BackupRed) BackupGreen=BackupRed; //绿灯时间不能大于红灯时间
- }
- else if(StaSysterm==ResetRed)
- {
- BackupRed++;
- }
- else if(StaSysterm==ResetLGreen)
- {
- backupLGreen++;
- }
- }
- void SUBTime() //红绿灯时间减
- {
- if(StaSysterm==ResetGreen)
- {
- BackupGreen--;
-
- }
- else if(StaSysterm==ResetRed)
- {
- BackupRed--;
- if(BackupGreen>=BackupRed) BackupRed=BackupGreen;
- }
- else if(StaSysterm==ResetLGreen)
- {
- backupLGreen--;
- }
- }
- void UrgentModel() //紧急模式
- {
- if(StaSysterm==NormalRun)
- {
- StaSysterm=UrgentRun;
- CopyLight=P2; //对数据进行备份
- CopyLLight=P1;
- P0=0XFF; //关闭数码管
- we=1; //产生下降沿 锁存数据
- we=0;
- }
- else if(StaSysterm==UrgentRun)
- {
- StaSysterm=NormalRun;
- P2=CopyLight; //恢复数据
- P1=CopyLLight;
- }
- else if(StaSysterm==ResetGreen || StaSysterm==ResetRed ||StaSysterm==ResetLGreen)
- {
- StaSysterm=NormalRun;
- GreenTime=BackupGreen;
- RedTime=BackupRed;
- GreenLTime = backupLGreen ; //重新设置红绿灯时间
- }
- }
复制代码- #include "use.h"
- #include "time.h"
- sbit KEY1=P3^4; //设置 退出设置
- sbit KEY2=P3^5; //加
- sbit KEY3=P3^6; //减
- sbit KEY4=P3^7; //紧急情况 退出紧急情况
- uchar keystr[]={1,1,1,1},backup[]={1,1,1,1};
- void KeyScan() //键盘扫描
- {
- static uchar keybuf[4]={0XFF,0XFF,0XFF,0XFF};
- uchar i;
- keybuf[0]=(keybuf[0]<<1)|KEY1;
- keybuf[1]=(keybuf[1]<<1)|KEY2;
- keybuf[2]=(keybuf[2]<<1)|KEY3;
- keybuf[3]=(keybuf[3]<<1)|KEY4;
- for(i=0;i<4;i++)
- {
- if(keybuf[i]==0X00) keystr[i]=0; //连续8次扫描值为0
- else if(keybuf[i]==0XFF) keystr[i]=1;
- }
- }
- void KeyAction(uchar key) //键盘执行
- {
- switch(key)
- {
- case 0: SetModel(); break;
- case 1: ADDTime(); break;
- case 2: SUBTime(); break;
- case 3: UrgentModel(); break;
- default:break;
- }
- }
- void KeyDriver() //键盘驱动
- {
- uchar i;
- for(i=0;i<4;i++)
- {
- if(keystr[i]!=backup[i])
- {
- if(keystr[i]==0)
- KeyAction(i);
- }
- backup[i]=keystr[i];
- }
- }
复制代码
全部资料51hei下载地址:
Proteus 仿真.rar
(150.83 KB, 下载次数: 84)
|