|
這是六月份做的設計實現的功能是十字路口的交通燈在設定時間進行紅綠黃的切換,并設有數碼管顯示時間
主要用到的工具是Protues,原理圖繪制以及最終仿真都是在上面進行
程序撰寫用到的是keil,附件中有具體的原理圖文件及實現的程序
原理圖.JPG (213.13 KB, 下載次數: 56)
下載附件
2019-9-16 12:18 上傳
1、進行東西方向、南北方向秒計時倒數(分紅綠燈)
2、實現時間的LED數碼管顯示
3、具有手動輸入的時間調整功能
4、具有黃燈3秒計時功能
設計流程圖
明確電路實現的功能
↓
分模塊畫出電路
↓
將各模塊連接起來
↓
使用Keil C51編寫控制程序
↓
將程序Hex文件導入Proteus實現仿真
↓
將仿真結果與設計要求進行對比
↓
改進
設計所需器件:
(1)共陰數碼管4個(兩位)
(2)紅黃綠LED燈各4個
(3)AT89C51芯片1塊
(4)晶振1個
(5)電阻2個
(6)電容3個
(7)按鍵4個
(8)排阻1個
實現的程序如下:
#define shuma P0
#include "reg52.h"
#define ON 0
#define OFF 1
typedef unsigned int u16; //對數據類型進行聲明定義
typedef unsigned char u8;
sbit NS_G=P1^5; // 南北綠燈
sbit NS_Y=P1^4; // 南北黃燈
sbit NS_R=P1^3; // 南北紅燈
sbit EW_G=P1^2; // 東西綠燈
sbit EW_Y=P1^1; // 東西黃燈
sbit EW_R=P1^0; // 東西紅燈
sbit LED_D1=P2^3; // 南北方向數碼管位控制
sbit LED_C1=P2^2; // 南北方向數碼管位控制
sbit LED_B1=P2^1; // 東西方向數碼管位控制
sbit LED_A1=P2^0; // 東西方向數碼管位控制
u8 count;
void Timer0Init()
{
TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
TH0=0XFC; //給定時器賦初值,定時1ms
TL0=0X18;
ET0=1;//打開定時器0中斷允許
EA=1;//打開總中斷
TR0=1;//打開定時器
}
void Delay10us(u8 z)
{
u8 x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
unsigned table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};//顯示0~9的值
void display1(u8 num1,u8 num2) //控制東西方向數碼管顯示
{
shuma=table[num1];
LED_A1=ON;
Delay10us(1);
LED_A1=OFF;
shuma=table[num2];
LED_B1=ON;
Delay10us(1);
LED_B1=OFF;
}
void display2(u8 num3,u8 num4) //控制南北方向數碼管顯示
{
shuma=table[num3];
LED_C1=ON;
Delay10us(1);
LED_C1=OFF;
shuma=table[num4];
LED_D1=ON;
Delay10us(1);
LED_D1=OFF;
}
void main()
{
count=0;
Timer0Init();//初始化計數器
NS_R=OFF; //南北方向紅燈關閉
EW_R=OFF; //東西方向紅燈關閉
while(1)
{
if(count==46) //重新計數
{
count=0;
}
if(count<20)
{
display1((20-count)/10,(20-count)%10);//東西方向綠燈(20s)
display2((23-count)/10,(23-count)%10);//南北方向紅燈(23s)
EW_G=ON;
NS_R=ON;
EW_R=OFF;
NS_Y=OFF;
}
else if(count<23)
{
display1((23-count)/10,(23-count)%10);//東西方向黃燈(3s)
display2((23-count)/10,(23-count)%10);//南北方向紅燈倒計時(3s)
EW_Y=ON;
NS_R=ON;
EW_G=OFF;
}
else if(count<43)
{
display1((46-count)/10,(46-count)%10);//東西方向紅燈(23s)
display2((43-count)/10,(43-count)%10);//南北方向綠燈(20s)
EW_R=ON;
NS_G=ON;
EW_Y=OFF;
NS_R=OFF;
}
else
{
display1((46-count)/10,(46-count)%10);//東西方向紅燈倒計時(3s)
display2((46-count)/10,(46-count)%10);//南北方向黃燈(3s)
NS_Y=ON;
EW_R=ON;
NS_G=OFF;
}
}
}
void Timer0() interrupt 1
{
static u16 i;
TH0=0XFC; //給定時器賦初值,定時1ms
TL0=0X18;
i++;
if(i==1000)
{
i=0;
count ++;
}
}
僅供有需要的師兄學習參考,請不要有其他用途,謝謝!
|
-
-
交通燈3.zip
2019-9-16 12:19 上傳
點擊文件名下載附件
104.76 KB, 下載次數: 187
|