標(biāo)題:
帶左轉(zhuǎn)的單片機(jī)紅綠燈proteus仿真與源碼分享
[打印本頁(yè)]
作者:
doudou2292
時(shí)間:
2018-1-4 14:24
標(biāo)題:
帶左轉(zhuǎn)的單片機(jī)紅綠燈proteus仿真與源碼分享
單片機(jī)紅綠燈仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
]@2[8$WP{QLJ39GOH`UW2JJ.png
(115.25 KB, 下載次數(shù): 78)
下載附件
仿真圖片
2018-1-4 14:24 上傳
帶左轉(zhuǎn)燈
單片機(jī)源程序如下:
#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) //數(shù)碼管動(dòng)態(tài)顯示程序
{
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() //設(shè)置 ???情況運(yùn)行掃描
{
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() //紅綠燈設(shè)置模式
{
if(StaSysterm==NormalRun) //正常情況下修改為設(shè)置狀態(tài)
{
StaSysterm=ResetGreen;
BackupGreen=GreenTime;
BackupRed=RedTime;
backupLGreen = GreenLTime;
CopyLight=P2; //對(duì)數(shù)據(jù)進(jìn)行備份
CopyLLight = P1;
P2=0X09;
}
else if(StaSysterm==ResetGreen) //優(yōu)先設(shè)置綠燈時(shí)間
{
StaSysterm=ResetRed;
}
else if(StaSysterm==ResetRed) //后設(shè)置紅燈時(shí)間 設(shè)置完成后按鍵退出設(shè)置狀態(tài)
{
StaSysterm=ResetLGreen;
}
else if(StaSysterm==ResetLGreen) //后設(shè)置紅燈時(shí)間 設(shè)置完成后按鍵退出設(shè)置狀態(tài)
{
StaSysterm=NormalRun;
P2=CopyLight; //恢復(fù)數(shù)據(jù)
P1=CopyLLight;
}
}
void ADDTime() //紅綠燈時(shí)間加
{
if(StaSysterm==ResetGreen)
{
BackupGreen++;
if(BackupGreen>=BackupRed) BackupGreen=BackupRed; //綠燈時(shí)間不能大于紅燈時(shí)間
}
else if(StaSysterm==ResetRed)
{
BackupRed++;
}
else if(StaSysterm==ResetLGreen)
{
backupLGreen++;
}
}
void SUBTime() //紅綠燈時(shí)間減
{
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; //對(duì)數(shù)據(jù)進(jìn)行備份
CopyLLight=P1;
P0=0XFF; //關(guān)閉數(shù)碼管
we=1; //產(chǎn)生下降沿 鎖存數(shù)據(jù)
we=0;
}
else if(StaSysterm==UrgentRun)
{
StaSysterm=NormalRun;
P2=CopyLight; //恢復(fù)數(shù)據(jù)
P1=CopyLLight;
}
else if(StaSysterm==ResetGreen || StaSysterm==ResetRed ||StaSysterm==ResetLGreen)
{
StaSysterm=NormalRun;
GreenTime=BackupGreen;
RedTime=BackupRed;
GreenLTime = backupLGreen ; //重新設(shè)置紅綠燈時(shí)間
}
}
復(fù)制代碼
#define _MAIN_C
#include "use.h"
#include "main.h"
#include "time.h"
#include "key.h"
bit flag1s; //0時(shí)時(shí)間不變 1時(shí)時(shí)間減小
uchar count1s,NS_time,WE_time;
uchar GreenTime=30,RedTime=50,GreenLTime = 10; //30s和35s
uchar index=0; //狀態(tài)
enum eStaSysterm StaSysterm=NormalRun;
void main()
{
EA=1; //開(kāi)總中斷
InintTimer0(); //初始化定時(shí)器0
while(1)
{
LEDScan(); //數(shù)碼管即LED掃描
KeyDriver(); //鍵盤(pán)驅(qū)動(dòng)掃描
if(flag1s) //判斷時(shí)間是否到 1s
{
flag1s=0;
NS_time--; //紅綠燈倒計(jì)時(shí)時(shí)間減
WE_time--;
}
}
}
void InintTimer0() //初始化T0定時(shí)器
{
TMOD=0X01;
TH0=0X4C; // 初始化為50ms
TL0=0X00;
ET0=1; //開(kāi)TO中斷
TR0=1; //開(kāi)始計(jì)數(shù)
}
void Timer0() interrupt 1
{
TH0=0XB8; //0.019 s 約為20ms
TL0=0X00;
KeyScan();
if(++count1s<50) return; //判斷定時(shí)是否到1S
count1s=0;
if(StaSysterm==NormalRun) flag1s=1; //非正常運(yùn)行時(shí),不紅綠燈數(shù)值不減一
}
void LEDScan()
{
if(StaSysterm==NormalRun) //正常運(yùn)行
{
if(NS_time==0 || WE_time==0)
{
switch(index) //改變紅綠燈的狀態(tài),狀態(tài)機(jī)
{
case 0:
{
index = 1; //東西紅燈
NS_time = GreenTime; //南北綠燈30
WE_time = RedTime; //紅燈50
P2 = 0X09;
P1 = 0X0C; //輸出
}break;
case 1:
{
index = 2;
NS_time=5; //南北黃燈東西紅燈
P2 = 0X0A;
P1 = 0X0C;
}break;
case 2:
{
index = 3;
NS_time=GreenLTime; //南北左轉(zhuǎn)東西紅燈
P2 = 0X0C;
P1 = 0X09;
}break;
case 3:
{
index = 4;
NS_time=5; //南北黃燈東西紅燈
P2 = 0X0C;
P1 = 0X0A;
}break;
case 4:
{
index=5;
NS_time = RedTime;
WE_time = GreenTime;
P2 = 0X24;
P1 = 0X0C;
}break;
case 5:
{
index = 6;
WE_time=5;
P2 = 0X14;
P1 = 0X0C;
}break;
case 6:
{
index = 7;
WE_time = GreenLTime;
P2 = 0X0C;
P1 = 0X24;
}break;
case 7:
{
index = 0;
WE_time=5; //南北黃燈東西紅燈
P2 = 0X0C;
P1 = 0X14;
}break;
default:break;
}
}
Seg_Display(NS_time/10,0);
Seg_Display(NS_time%10,1);
Seg_Display(WE_time/10,2);
Seg_Display(WE_time%10,3);
}
else if(StaSysterm==UrgentRun)
{ //緊急情況運(yùn)行 黃燈閃爍
P2=0x12;
P1 = 0X12; //所有黃燈亮
Delayms(200); //延遲200毫秒
P2=0x00;
P1 = 0X00; //所有黃燈滅
Delayms(200);
}
else if(StaSysterm==ResetGreen || StaSysterm==ResetRed) //設(shè)置調(diào)整紅綠燈時(shí)間
{
index=0;
NS_time=0;
WE_time=0; //重新初始化紅綠燈并運(yùn)行
UrgentScan();
}
else
{
SetLGreen();
}
}
復(fù)制代碼
#include "use.h"
#include "time.h"
sbit KEY1=P3^4; //設(shè)置 退出設(shè)置
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() //鍵盤(pán)掃描
{
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; //連續(xù)8次掃描值為0
else if(keybuf[i]==0XFF) keystr[i]=1;
}
}
void KeyAction(uchar key) //鍵盤(pán)執(zhí)行
{
switch(key)
{
case 0: SetModel(); break;
case 1: ADDTime(); break;
case 2: SUBTime(); break;
case 3: UrgentModel(); break;
default:break;
}
}
void KeyDriver() //鍵盤(pán)驅(qū)動(dòng)
{
uchar i;
for(i=0;i<4;i++)
{
if(keystr[i]!=backup[i])
{
if(keystr[i]==0)
KeyAction(i);
}
backup[i]=keystr[i];
}
}
復(fù)制代碼
全部資料51hei下載地址:
Proteus 仿真.rar
(150.83 KB, 下載次數(shù): 84)
2018-1-4 14:22 上傳
點(diǎn)擊文件名下載附件
仿真文件
下載積分: 黑幣 -5
作者:
51heidian23
時(shí)間:
2018-3-22 13:26
東西不錯(cuò),代碼也很工整,給老哥打電話(huà)
作者:
Keil是我爸爸
時(shí)間:
2018-3-22 19:35
東西挺好的,謝謝分享
作者:
ftmovie
時(shí)間:
2018-3-25 20:50
學(xué)習(xí)學(xué)習(xí) 支持一下
作者:
公羽木水
時(shí)間:
2019-9-4 23:40
很好,辛苦了,謝謝
作者:
公羽木水
時(shí)間:
2019-9-4 23:42
感激不盡
作者:
18339196096
時(shí)間:
2019-12-28 13:44
總說(shuō)code前少分號(hào),怎么回事?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1