欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機交通燈 用lcd1602顯示 帶proteus仿真和源程序
[打印本頁]
作者:
51hei學習技術中
時間:
2016-10-23 19:39
標題:
單片機交通燈 用lcd1602顯示 帶proteus仿真和源程序
給大家分享一個用lcd1602顯示的交通燈,下面是仿真原理圖:
0.png
(25.44 KB, 下載次數: 84)
下載附件
2016-10-23 19:36 上傳
0.png
(54.04 KB, 下載次數: 100)
下載附件
2016-10-23 19:35 上傳
proteus仿真工程文件和程序源碼下載:
交通燈.rar
(102.65 KB, 下載次數: 60)
2016-10-23 19:37 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
單片機源程序(部分預覽):
#include<reg51.h>
#include"lcd.h"
#define NORMAL_MODE 0 //正常運行模式
#define NIGHT_MODE 3 //夜間模式
#define URGENCY_MODE 6 //緊急模式
#define NORMAL_MODE_STEP1 0
#define NORMAL_MODE_STEP2 1
#define NORMAL_MODE_STEP3 2
#define NORMAL_MODE_STEP4 3
sbit BUT1=P1^0;
sbit BUT2=P1^1;
sbit BUT3=P1^3;
sbit LED_EW_RED = P2^0; //東西紅燈
sbit LED_EW_GREEN = P2^2; //東西綠燈
sbit LED_EW_YELLOW = P2^1; //東西黃燈
sbit LED_SN_RED = P2^3; //南北紅燈
sbit LED_SN_GREEN = P2^5; //南北綠燈
sbit LED_SN_YELLOW = P2^4; //南北黃燈
unsigned char WorkMode = 0;
unsigned char DisplayTime = 0;
unsigned char DisplayTime1 = 4; //黃燈顯示時間
unsigned char SD_DisplayTime = 0; //紅綠燈顯示時間
unsigned char NormalModeStep = 0;
unsigned char fag=0,k=0;
unsigned char djs1[]="Daojishi:";
unsigned char djs2[]="SN-Daojishi:";
int a=0;
void Delay1ms(uint y);
void InitTimer0(void);
void LcdDisplay1(int a);
void Work_Night_Mode();
void Work_NORMAL_Mode();
void Work_Urgency_Mode();
void SetBtn_Check_Work(void);
void delay10ms(unsigned char num);
/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main(void)
{
unsigned char i;
LcdInit();
for(i=0;i<9;i++)
{
LcdWriteData(djs1[i]);
}
InitTimer0();
SD_DisplayTime = 15;
DisplayTime = SD_DisplayTime;
WorkMode = NORMAL_MODE;
NormalModeStep=NORMAL_MODE_STEP1;
while(1)
{
switch(WorkMode) //工作模式判斷
{
case NORMAL_MODE: //正常模式
Work_NORMAL_Mode();
break;
case NIGHT_MODE: //夜間模式
Work_Night_Mode();
break;
case URGENCY_MODE: //緊急模式
Work_Urgency_Mode();
break;
}
SetBtn_Check_Work();
LcdDisplay1(DisplayTime);
}
}
void Work_NORMAL_Mode() //正常工作模式
{
switch(NormalModeStep) //工作步段判斷
{
case NORMAL_MODE_STEP1: //步段1, 南北綠燈,東西紅燈
LED_SN_RED = 0; //南北紅燈滅
LED_SN_GREEN = 1; //南北綠燈亮
LED_SN_YELLOW = 0; //南北黃燈滅
LED_EW_RED = 1; //東西紅燈亮
LED_EW_GREEN = 0; //東西綠燈滅
LED_EW_YELLOW = 0; //東西黃燈滅
if(DisplayTime ==0 ) //如果通行時間走完,即等于0
{
NormalModeStep = NORMAL_MODE_STEP2; //設置工作步段為步段2,南北黃燈,東西紅燈
DisplayTime = DisplayTime1; //南北增減s黃燈時間
}
break;
case NORMAL_MODE_STEP2: //步段2, 南北黃燈,東西紅燈
LED_SN_RED = 0; //南北紅燈滅
LED_SN_GREEN = 0; //南北綠燈滅
LED_SN_YELLOW = 1; //南北黃燈亮
LED_EW_RED = 1; //東西紅燈亮
LED_EW_GREEN = 0; //東西綠燈滅
LED_EW_YELLOW = 0; //東西黃燈滅
if(DisplayTime == 0) //如果通行時間走完,即等于0
{
NormalModeStep = NORMAL_MODE_STEP3; //設置工作步段為步段3,南北紅燈,東西綠燈
DisplayTime = SD_DisplayTime; //南北加5s黃燈時間
}
break;
case NORMAL_MODE_STEP3: //步段3, 南北紅燈,東西綠燈
LED_SN_RED = 1; //南北紅燈亮
LED_SN_GREEN = 0; //南北綠燈滅
LED_SN_YELLOW = 0; //南北黃燈滅
LED_EW_RED = 0; //東西紅燈滅
LED_EW_GREEN = 1; //東西綠燈亮
LED_EW_YELLOW = 0; //東西黃燈滅
if(DisplayTime == 0) //如果通行時間走完,即等于0
{
NormalModeStep = NORMAL_MODE_STEP4; //設置工作步段為步段4,南北紅燈,東西黃燈
DisplayTime = DisplayTime1; //東西增減若干s黃燈時間
}
break;
case NORMAL_MODE_STEP4: //步段4, 南北紅燈,東西黃燈
LED_SN_RED = 1; //南北紅燈亮
LED_SN_GREEN = 0; //南北綠燈滅
LED_SN_YELLOW = 0; //南北黃燈滅
LED_EW_RED = 0; //東西紅燈滅
LED_EW_GREEN = 0; //東西綠燈滅
LED_EW_YELLOW = 1; //東西黃燈亮
if(DisplayTime == 0) //如果通行時間走完,即等于0
{
NormalModeStep = NORMAL_MODE_STEP1; //設置工作步段為步段1,南北綠燈,東西紅燈
DisplayTime = SD_DisplayTime; //南北同行時間重賦值
}
break;
}
}
void Work_Urgency_Mode() //緊急模式
{
LED_SN_RED = 1; //南北紅燈亮
LED_SN_GREEN = 0; //南北綠燈滅
LED_SN_YELLOW = 0; //南北黃燈滅
LED_EW_RED = 1; //東西紅燈亮
LED_EW_GREEN = 0; //東西綠燈滅
LED_EW_YELLOW = 0; //東西黃燈滅
DisplayTime =SD_DisplayTime; //南北顯示時間為0xff,在顯示函數里判斷時間為0xff時不做顯示,會顯示“-”
}
void Work_Night_Mode() //夜間模式
{
LED_SN_RED = 0; //南北紅燈滅
LED_SN_GREEN = 0; //南北綠燈滅
LED_SN_YELLOW = 1; //南北黃燈亮
LED_EW_RED = 0; //東西紅燈滅
LED_EW_GREEN = 0; //東西綠燈滅
LED_EW_YELLOW = 1; //東西黃燈亮
DisplayTime = DisplayTime1; //南北顯示時間為0xff,在顯示函數里判斷時間為0xff時不做顯示,會顯示“-”
}
void SetBtn_Check_Work(void) //設置按鍵檢測函數
{
if(BUT1 == 0) //設置鍵按下 ,夜間模式 ,緊急模式 ,恢復正常模式
{
delay10ms(5); //50ms去抖
fag=0;
while(fag==0)
{ while(BUT1==0)
{ fag=1;
}
k++;
}
if(k%3 == 1)
{
TR0 = 0; //計時器停止
WorkMode = NIGHT_MODE; //夜間模式
DisplayTime=DisplayTime1;
}
else if(k%3==2)
{
TR0 = 0; //計時器停止
WorkMode = URGENCY_MODE; //緊急模式
DisplayTime = SD_DisplayTime;
}
else
{ TR0 = 1;
DisplayTime = SD_DisplayTime;
WorkMode = NORMAL_MODE;
}
}
else if(BUT2 == 0) //設置鍵按下 ,燈的時間加一 控制
{
delay10ms(10); //50ms去抖
if(BUT2 == 0)
{
TR0 = 0;
if(k%3==2) //紅燈時間加一
{ SD_DisplayTime = SD_DisplayTime+1;
DisplayTime = SD_DisplayTime;
delay10ms(10);
//WorkMode = URGENCY_MODE;
}
else if(k%3==1) //黃燈時間加一
{
DisplayTime1=DisplayTime1+1;
DisplayTime=DisplayTime1;
delay10ms(10);
// WorkMode = NIGHT_MODE;
}
}
}
else if(BUT3 == 0) //設置鍵按下, 燈的時間減控制
{
delay10ms(5); //50ms去抖
if(BUT3 == 0)
{
TR0 = 0;
if(k%3==2)
{SD_DisplayTime = SD_DisplayTime-1; //按鍵使紅燈時間減一
DisplayTime = SD_DisplayTime;
WorkMode = URGENCY_MODE;
}
else if(k%3==1)
{
DisplayTime1=DisplayTime1-1; //按鍵使黃燈時間減一
DisplayTime=DisplayTime1;
WorkMode = NIGHT_MODE;
}
}
}
}
void LcdDisplay1(int a) //lcd顯示
{
LcdWriteCom(0x8A);
LcdWriteData('0'+a/10);
LcdWriteCom(0x8B);
LcdWriteData('0'+a%10);
}
void InitTimer0(void) //初始化定時器0
{
TMOD = 0x01; //模式1
TH0 = 0x3C; //定時器裝載值
TL0 = 0xB0;
EA = 1; //使能總中斷
ET0 = 1; //使能定時器0中斷
TR0 = 1; //啟動定時器0
}
void Timer0Interrupt(void) interrupt 1 //定時器0中斷處理函數
{
static unsigned char TimeOutNum = 0;
TH0 = 0x3C; //重新裝載值
TL0 = 0xB0;
TimeOutNum++; //中斷次數++, 即50ms的次數
if(TimeOutNum>=20) //達到50ms * 20 = 1s條件
{
TimeOutNum = 0; //中斷次數清0
DisplayTime--; //南北顯示時間-1
}
}
void Delay1ms(uint y)
{
uint x;
for( ; y>0; y--)
{
for(x=110; x>0; x--);
}
}
void delay10ms(unsigned char num) //誤差 0us
{
unsigned char i,a,b,c;
for(i=0;i<num;i++)
for(c=5;c>0;c--)
for(b=4;b>0;b--)
for(a=248;a>0;a--);
}
復制代碼
作者:
滴~電子小白
時間:
2016-10-24 09:03
感謝樓主分享,謝謝
作者:
下從文
時間:
2016-11-14 21:33
很不錯,很有用。
作者:
-想不出好網名
時間:
2018-1-9 14:20
為什么我這個顯示不出來
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1