提示:實(shí)現(xiàn)的功能較為簡單,這個(gè)是我的假期大作業(yè)(但是這個(gè)挺重要的,能為初學(xué)者節(jié)省不必要的大量時(shí)間)
8255交通燈
二、🎉主要功能介紹 1.💎流程圖2.💍文字介紹用51單片機(jī)擴(kuò)展一片8255,用12個(gè)發(fā)光二極管模擬一個(gè)十字路口的紅、綠、黃燈,并設(shè)置二個(gè)緊急放行按鍵;正常行駛時(shí),東西或南北方向的燈按綠燈亮7秒,黃燈閃爍3秒,紅燈亮10秒;當(dāng)東西或南北方向的緊急放行按鍵按下時(shí),禁行方向紅燈維持7秒,相對應(yīng)放行方向?yàn)榫G燈維持4秒,然后立即變?yōu)辄S燈閃爍3秒,緊急情況結(jié)束后,禁行方向變?yōu)榫G燈,相對方向變?yōu)榧t燈正常回歸循環(huán)。
#include //引入頭文件
#include//為了外部寫入數(shù)據(jù)的頭文件
#define uchar unsigned char //對變量定義名進(jìn)行簡略定義
#define uint unsigned int
#define PA XBYTE[0X0000] //8255A端口地址
#define PB XBYTE[0X0001]//8255B端口地址
#define PC XBYTE[0X0002]//8255C端口地址
#define COM XBYTE[0X0003]//8255A控制口地址
sbit CS = P2^7;//8255 CS片選信號
sbit button1 = P1^0;//緊急開關(guān)東西通行
sbit button2 = P1^1;//緊急開關(guān)南北通行
uint counter = 10;//倒計(jì)時(shí)10秒
uint state = 0;//狀態(tài)選擇
uint aaa = 0;//輸出口存數(shù)
//簡單的延時(shí)程序
void delay_ms(uchar x)
{uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
//控制狀態(tài) 交通燈盜撩鵡
void traffic_lights()
{switch(state)//判斷狀態(tài),從0開始
{//狀態(tài)1,東西通行,南北禁止
case 0:
aaa = 0x09;//輸出PA,東西綠燈南北紅燈
PA = aaa;
break;
//狀態(tài)2,東西緩速停車,南北禁止通行
case 1:
aaa = 0x0a;//東西黃燈,南北紅燈
PA = aaa;
delay_ms(1);//閃爍延遲
aaa = 0x08;//東西不亮,南北紅燈
PA = aaa;
delay_ms(1);
break;
//狀態(tài)3,東西禁止,南北通行
case 2:
aaa = 0x24;//東西紅燈,南北綠燈
PA = aaa;
break;
//狀態(tài)4,東西禁止,南北緩速停車
case 3:
aaa = 0x14;//東西紅燈,南北黃燈
PA = aaa;
delay_ms(1);//閃爍延遲
aaa = 0x04;//東西紅燈,南北不亮
PA = aaa;
delay_ms(1);
break;
}
}
//緊急開關(guān),控制南北或者東西通行
void button()
{if(button1 == 0)
{counter = 7;//數(shù)碼管顯示七秒
state = 0;//變?yōu)闋顟B(tài)1
}
if(button2 == 0)
{counter = 7;//數(shù)碼管顯示七秒
state = 2;//變?yōu)闋顟B(tài)2
}
}
//主程序
void main(void)
{//片選信號打開
CS = 0;
//定時(shí)器初始化,并啟動,延時(shí)為20ms
TMOD = 0x01;
TH0 = (65536 - 20000)/256;
TL0 = (65536 - 20000)%256;
IE = 0x82;
TR0 = 1;
//設(shè)置8255控制字,PAPBPC口均以方式0輸出
COM=0x80;
//進(jìn)入循環(huán)
while(1)
{ button();//判斷是否按下緊急開關(guān)
traffic_lights();//交通燈亮滅函數(shù)
//數(shù)碼管顯示數(shù)字
if(counter == 10)
{ PC = counter;
delay_ms(1);
PB = counter;
delay_ms(1);
}
else
{ PB = counter;
delay_ms(1);
PC = counter;
delay_ms(1);
}
}
}
//定時(shí)器中斷函數(shù)
void T0_INT () interrupt 1
{static uint local_counter = 0;//定義循環(huán)次數(shù)
TH0 = (65536 - 20000)/256;//設(shè)置20ms延遲
TL0 = (65536 - 20000)%256;
if(local_counter++ >= 50)//20*50=1s
{ local_counter = 0;//循環(huán)次數(shù)歸零
counter--;//秒數(shù)減一
if(state == 0 || state == 2)//關(guān)于1,3狀態(tài)的切換
{ if(counter == 3)
{state=(state + 1)%4;}//循環(huán)切換
}
else if(counter == 0)//關(guān)于 2,4狀態(tài)的切換
{ state = (state +1)%4;//循環(huán)切換
if(state ==0 || state == 2)//重新為counter置10秒
{ counter = 10;
}
}
}
}
四、🎨(初學(xué)者)操作指南
1.🎄我的軟件準(zhǔn)備2.🎋連接實(shí)驗(yàn)圖利用protues8連接實(shí)驗(yàn)電路圖,新建項(xiàng)目等一些基礎(chǔ)操作不做贅述。
👓設(shè)備圖
🥟80C51連接部分
🍜8255連接部分
3.🍟二進(jìn)制文件🍞交通燈部分
利用Keil5,創(chuàng)建AT89C51項(xiàng)目后,編寫導(dǎo)入C語言文件,調(diào)整輸出設(shè)置,編譯運(yùn)行成功后,生成.hex(二進(jìn)制文件),將這個(gè)文件導(dǎo)入protues8的80C51單片機(jī)即可。
我的Keil5項(xiàng)目大體就是這樣
鏈接:https://pan.baidu.com/s/1Rt4ONmYPMZjuHw0gW9HVKQ?pwd=1111
提取碼:1111 點(diǎn)我跳轉(zhuǎn)
如果對您有用,別忘了幫本座點(diǎn)個(gè)贊再走?。。。?/p>
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧