實驗要求
按照電路要求在Protues中設計電路圖,或者使用開發板。編程實現如下功能:
用單片機端口作輸出口,控制四個方向共12個發光二極管亮滅,模擬交通燈管理。功能描述如下:初始態爲四個路口的紅燈全亮之後,東西路口的綠燈亮,南北路口的紅燈亮,東西路口方向通車,延時一段時間後東西路口的綠燈熄滅,黃燈開始閃爍,閃爍若干次後,東西路口紅燈亮,而同時南北路口的綠燈亮,南北路口方向開始通車,延時一段時間後,南北路口的綠燈熄滅,黃燈開始閃爍,閃爍若干次後,再切換到東西路口方向,之後重複以上過程。
代碼
#include <reg52.h>
#include <absacc.h>
#define PA XBYTE[0x7FFC] //PA端口地址
#define PB XBYTE[0x7FFD]
#define PC XBYTE[0x7FFE]
#define COM XBYTE[0x7FFF]
char code dx516[3] _at_ 0x003b;
unsigned char Second[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10};
unsigned char count = 0, total = 0;
/**************8255初始化******************************/
void init_8255(void)
{
COM = 0x80; // C = out B=out A = out
PA = 0xFF;
PB = 0xFF;
}
/**************定時器1初始化******************************/
void init_T1(void)
{
TMOD = 0x10; //定時器1,模式1
TH1 = 0x3c; // 定時爲50ms
TL1 = 0xb0;
ET1 = 1; //允許定時器中斷1
EA = 1; //開總中斷
TR1 = 1;
}
//-------------------
// 函數名稱: void delay_s(unsigned t)
// 函數功能: 利用定時器延時t*0.5秒子程序
//-------------------
void delay_s(unsigned char t)
{
TR1 = 1;//啓動定時
total = t * 10;
count = 0;
while(1)
{
if(count == total)//定時時間到
{
count = 0;
total = 0;
TR1 = 0;
return;
}
}
}
void timer1() interrupt 3 //定時器1
{
TR1 = 0;
TH1 = 0x3c; // 定時爲50ms
TL1 = 0xb0;
count++;
TR1 = 1;
}
void main(void)
{
unsigned char i = 0;
init_8255();
init_T1();
while(1)
{
for(i = 10;i > 0;i--)
{
PC = Second[i];
if(i < 4)//最後三秒東西方向綠燈和南北方向紅燈閃爍。
{
PA = 0xFF;
PB = 0xFF;
delay_s(1);
PA =0xf6;
PB = 0xdb;
delay_s(1);
}
else
{
PA = 0xf6; //東西綠燈亮
PB = 0xdb; //南北紅燈亮
delay_s(2);
}
}
for(i = 3;i > 0; i--) //閃爍三秒
{
PC = Second[i];
PA = 0xed;//東西黃燈亮
PB = 0xed;//南北黃燈亮
delay_s(1);
PA = 0xFF;
PB = 0xFF;
delay_s(1);
}
for(i = 10;i > 0;i--)
{
PC = Second[i];
if(i < 4) //最後三秒南北方向綠燈和東西方向紅燈閃爍
{
PA = 0xFF;
PB = 0xFF;
delay_s(1);
PA = 0xDB;
PB = 0xf6;
delay_s(1);
}
else
{
PA = 0xdb; //東西紅燈亮
PB =0xf6; //南北綠燈亮
delay_s(2);
}
}
for(i = 3;i > 0;i--) //閃爍三秒
{
PC = Second[i];
PA = 0xed; //東西黃燈亮
PB = 0xed; //南北黃燈亮
delay_s(1);
PA = 0xff;
PB = 0xff;
delay_s(1);
}
}
}
protues仿真
東西方向綠燈和南北方向紅燈:
東西南北方向黃燈閃爍三秒:
東西方向紅燈和南北方向綠燈:
總結
起初數碼管數字和紅綠燈不變化,後來發現是定時器初始化爲定時器1,模式1時TMOD賦值出錯。還有賦值的二進制是高位到低位與引腳的高位到低位對應。