|
使用的Proteus軟件來實現交通燈的仿真變化,系統的軟件設計分為三個模塊:動態顯示模塊、 交通燈工作模塊、定時/計數器模塊,初次實驗有些問題,再次仿真又ok了,各位大佬看看什么問題。
以單片機AT89C51為核心,12 個發光二極管分成 4 組紅綠黃三色燈構 成交通信號燈指示模塊,4 個 LED 以西北方向各 1個分成 2 組構成倒計時顯示模塊選型如下
使用keil 4編程
結果如下
還望各位大佬指正,小白一枚,共同學習進步!
#include <reg51.h> //51單片機頭文件
#define uint unsigned int
#define uchar unsigned char //定義數據類型
#define ON 0 //定義狀態開
#define OFF 1
char led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰極數碼管賦值
sbit N_R=P3^7; //輸出端口定義//南北紅燈
sbit N_G=P3^6; //南北綠燈
sbit N_Y=P3^4; //南北黃燈
sbit W_R=P3^3; //東西紅燈
sbit W_G=P3^2; //東西綠燈
sbit W_Y=P3^0; //東西黃燈
sbit LED_C1=P2^0; //南北方向數碼管個位控制端口
sbit LED_D1=P2^1;
sbit LED_A1=P2^2; //東西方向數碼管個位控制端口
sbit LED_B1=P2^3;
uchar EW=30,NS=25,X=30,Y=25,Z=30,SHU=30;
uchar flag;
void init(void) //定時器 T0初始化
{
TMOD=0x01;
TH0=0x3C;
TL0=0xB0;
EA=1; //開總中斷
ET0=1;
TR0=1; //啟動T0
}
void timer0() interrupt 1 //倒計時函數
{ TMOD=0x01; //設置 T0定時方式1
TH0=0x3C; //高八位初值 5ms 初值
TL0=0xB0; //低八位初值
EA=1;
ET0=1;
TR0=1;
flag++;
if(flag==20) //1秒計時每1s時間減一
{
EW--;
NS--;
X--;
Y--;
Z--; SHU--;
flag=0;
}
}
void delay(uchar z) //延時函數
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display1(uchar num1,uchar num2) //南北數碼管顯示函數
{
P0=led_mod[num1]; //顯示
LED_C1=ON; //個位顯示開
delay(1); //延時
LED_C1=OFF; //個位顯示關
P0=led_mod[num2];
LED_D1=ON; //十位顯示開
delay(1);
LED_D1=OFF;
}
void display2(uchar num3,uchar num4) //東西數碼管顯示函數
{
P1=led_mod[num3];
LED_A1=ON;
delay(1);
LED_A1=OFF;
P1=led_mod[num4];
LED_B1=ON;
delay(1);
LED_B1=OFF;
}
void main() //主函數
{
int i;
N_R=ON;W_R=ON; //初始南北東西紅燈均亮
for(i=0;i<210;i++)
{
delay(10);
}
N_R=OFF;W_R=OFF; //南北東西紅燈關
while(1)
{
while(1) { init();
N_G=ON;W_R=ON; //開始南北綠燈亮 東西紅燈亮
while(EW!=0)
{
display1(EW/10,EW%10); //東西方向紅燈 20s
display2(NS/10,NS%10); //南北方向綠燈 25s
while(EW==5)
{
while(X!=0)
{
display1(EW/10,EW%10); //東西方向紅燈 5s
display2(X/10,X%10); //南北方向黃燈 5s
N_G=OFF;N_Y=ON; //南北紅燈關,黃燈開
}
}
}
W_R=OFF;N_G=OFF;N_Y=OFF; //東西方向紅燈關閉 南北方向綠燈關 南北方向黃燈關
閉
EW=30,NS=25,X=30,Y=25,Z=30,SHU=30; //計數重新賦值
while(1)
{ init();
N_R=ON;W_G=ON; //南北紅燈開 東西綠燈開 kai
while(Z!=0)
{
display1(Z/10,Z%10); //東西方向紅燈 30s
display2(Y/10,Y%10); //南北方向綠燈25s
while(Z==5)
{
while(SHU!=0)
{
display1(Z/10,Z%10); //東西方向紅燈 5s
display2(SHU/10,SHU%10); //南北方向黃燈 5s
W_G=OFF;W_Y=ON; //東西紅燈關閉 東西黃燈打開
}
}
}
N_R=OFF;W_G=OFF;W_Y=OFF;
EW=30,NS=25,X=30,Y=25,Z=30,SHU=30;
break; //跳出當前循環語句
}
}
}
}
|
|