一、實(shí)驗(yàn)?zāi)康呐c任務(wù)
實(shí)驗(yàn)?zāi)康模?/h3>
????????1. 學(xué)習(xí)模擬交通燈控制的實(shí)現(xiàn)方法;
????????2. 掌握Proteus硬件仿真與調(diào)試。
任務(wù):
????????1.根據(jù)要求編寫(xiě)程序,并寫(xiě)出原理性注釋?zhuān)?/p>
????????2. 將檢查程序運(yùn)行的結(jié)果,分析一下是否正確;
????????3. 完成所建工程的仿真及調(diào)試。
二、實(shí)驗(yàn)內(nèi)容
按照電路要求在Protues中設(shè)計(jì)電路圖。編程實(shí)現(xiàn)如下功能:
用單片機(jī)端口作輸出口,控制四個(gè)方向共12個(gè)發(fā)光二極管亮滅,模擬交通燈管理。功能描述如下:初始態(tài)為四個(gè)路口的紅燈全亮之后,東西路口的綠燈亮,南北路口的紅燈亮,東西路口方向通車(chē),延時(shí)一段時(shí)間后東西路口的綠燈熄滅,黃燈開(kāi)始閃爍,閃爍若干次后,東西路口紅燈亮,而同時(shí)南北路口的綠燈亮,南北路口方向開(kāi)始通車(chē),延時(shí)一段時(shí)間后,南北路口的綠燈熄滅,黃燈開(kāi)始閃爍,閃爍若干次后,再切換到東西路口方向,之后重復(fù)以上過(guò)程。
三、實(shí)驗(yàn)內(nèi)容
(1)軟件實(shí)現(xiàn):
實(shí)驗(yàn)步驟:
? ? ? ? 1.運(yùn)行Keil uVision5 開(kāi)發(fā)環(huán)境,按照“模塊化單片機(jī)教學(xué)實(shí)驗(yàn)平臺(tái)配套的實(shí)驗(yàn)指導(dǎo)書(shū)1.2.3 節(jié)”介紹的方法建立程esimlab4. uvproj,CPU 為AT89S51,包含啟動(dòng)文件STARTUP.A51。
? ? ? ?2. 輸入源程序,在Keil uVision5 開(kāi)發(fā)環(huán)境中,建立源程序esimlab8.c,將上述程序加入該程序文件。并將該文件加入工程esimlab4.uvproj。
? ? ? ? 3.設(shè)置工程esimlab8 uvproj 屬性,將其晶振頻率設(shè)置為11.0592MHz,選擇輸出可執(zhí)行文件(HEX 文件),仿真方式為“Use Simulator”。
? ? ? ?4. 構(gòu)造(Build)工程esimlab8.uvproj。如果輸入有誤進(jìn)行修改,直至構(gòu)造正確,生成可執(zhí)行程序 esimlab8.hex 為止。
程序流程圖如圖1:
圖1 交通燈控制流程圖
(2)Proteus仿真:
實(shí)驗(yàn)步驟:
????????1.運(yùn)行Proteus 開(kāi)發(fā)環(huán)境,建立工程,新建原理圖設(shè)計(jì)文件esimlab8. pdsprj。
????????2.設(shè)置單片機(jī)屬性,將其晶振頻率設(shè)置為11.0592MHz,載入KEIL生成的文件esimlab8.hex。
????????3.運(yùn)行仿真并觀(guān)察結(jié)果。
(3)開(kāi)發(fā)板實(shí)驗(yàn)驗(yàn)證:
實(shí)驗(yàn)步驟:
????????1.關(guān)掉實(shí)驗(yàn)箱電源。將CPU 板插接在JK1、JK2 上,注意CPU 板的插接方向。按照實(shí)驗(yàn)四說(shuō)明書(shū)連接關(guān)系表將硬件連接好。
圖1 實(shí)驗(yàn)板連接線(xiàn)表
????????2.將AT89S52 芯片插在CPU 板的CPU 插座上(注意不要插反)。母板上電。
????????3.通過(guò)PROGISP 燒寫(xiě)軟件,利用ISP 下載線(xiàn)(見(jiàn)“模塊化單片機(jī)教學(xué)實(shí)驗(yàn)平臺(tái)配套的實(shí)驗(yàn)指導(dǎo)書(shū)1.3 節(jié)”)把HEX (esimlab8.hex)文件下載到單片機(jī)中。
????????4.下載成功后,通過(guò)按鍵,觀(guān)察母板上的交通燈工作情況。
四、實(shí)驗(yàn)報(bào)告
main.c
#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; // 方式0,C = out B=out A = out
PA = 0xFF;
PB = 0xFF;
}
/**************定時(shí)器1初始化******************************/
void init_T1(void)
{
TMOD &= 0x0F;//設(shè)置定時(shí)器模式
TMOD |= 0x10;//設(shè)置定時(shí)器模式
TL1 = 0x00; //設(shè)置定時(shí)初值
TH1 = 0x4C; //設(shè)置定時(shí)初值
TF1 = 0;//清除TF1標(biāo)志
ET1 = 1; //允許定時(shí)器中斷1
EA = 1; //開(kāi)總中斷
TR1 = 0;//定時(shí)器1先不工作
}
//-------------------
// 函數(shù)名稱(chēng): void delay_s(unsigned t)
// 函數(shù)功能: 利用定時(shí)器延時(shí)t*0.5秒子程序
//-------------------
void delay_s(unsigned char t)
{
TR1 = 1;//啟動(dòng)定時(shí)器1
total = t * 10;
count = 0;
while(1)
{
if(count == total)//定時(shí)時(shí)間到
{
count = 0;
total = 0;
TR1 = 0;
return;
}
}
}
void timer1() interrupt 3 //定時(shí)器1
{
TR1 = 0;
TL1 = 0x00; //設(shè)置定時(shí)初值
TH1 = 0x4C; //設(shè)置定時(shí)初值
count++;
TR1 = 1;
}
void main(void)
{
unsigned char i = 0;
init_8255();//初始化8255
init_T1();//初始化定時(shí)器1
while(1)
{
//東西方向->南北方向
for(i = 10;i > 0;i--)
{
PC = Second[i];
if(i < 4)//東西方向綠燈/南北方向紅燈閃爍3秒
{
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)//南北方向綠燈/東西方向紅燈閃爍3秒
{
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);
}
}
}
?
????????在實(shí)驗(yàn)過(guò)程中,由于剛開(kāi)始計(jì)算紅綠燈對(duì)應(yīng)的十六進(jìn)制數(shù)據(jù)時(shí)沒(méi)看清哪個(gè)對(duì)應(yīng)的紅黃綠,導(dǎo)致第一次運(yùn)行仿真時(shí)信號(hào)燈顏色亂閃。在后續(xù)使用時(shí)應(yīng)認(rèn)真仔細(xì)分析題目。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-776104.html
????????通過(guò)本次實(shí)驗(yàn)深入理解了模塊化編程,熟悉了8255芯片的工作方式和中斷的使用。在本次實(shí)驗(yàn)過(guò)程中掌握了8255 芯片的硬件連接方法、內(nèi)部結(jié)構(gòu)、工作原理和工作方式,熟悉了8255片的初始化編程,再一次編寫(xiě)中斷程序,使我更熟悉了中斷的原理和過(guò)程,能更熟練地編寫(xiě)中斷服務(wù)程序。同時(shí)在實(shí)驗(yàn)中將一些外設(shè)的啟動(dòng)初始化抽取到相應(yīng)的初始化函數(shù)中,通過(guò)調(diào)用初始化函數(shù)啟動(dòng),這樣不僅增加了代碼的可閱讀性,而且減少了代碼堆積,便于修改。實(shí)驗(yàn)中結(jié)合定時(shí)器進(jìn)行延遲,減小了延遲函數(shù)對(duì)主程序的影響,提高了軟件資源的利用率。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-776104.html
到了這里,關(guān)于實(shí)驗(yàn)(八):交通燈控制的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!