單片機紅綠燈仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
]@2[8$WP{QLJ39GOH`UW2JJ.png (115.25 KB, 下載次數: 78)
下載附件
仿真圖片
2018-1-4 14:24 上傳
帶左轉燈
單片機源程序如下:
- #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)
2018-1-4 14:22 上傳
點擊文件名下載附件
仿真文件 下載積分: 黑幣 -5
|