標(biāo)題:
基于STC系列的交通燈程序
[打印本頁(yè)]
作者:
李狗蛋16
時(shí)間:
2020-12-30 10:32
標(biāo)題:
基于STC系列的交通燈程序
部分代碼如下:
#include<reg51.h>typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA=P2^2;//使用138譯碼器控制8個(gè)燈
sbit LSB=P2^3;
sbit LSC=P2^4;
#define GPIO_DIG P0//數(shù)碼管段選,宏定義到P0
#define GPIO_TRAFFIC P1//交通燈的8個(gè)端口p1
sbit RED10=P1^0; //前進(jìn)路人行道的紅燈
sbit GREEN10=P1^1;//前進(jìn)路人行道的綠燈
sbit RED11=P1^2;//上方公路的紅燈
sbit YELLOW11=P1^3;//上方公路的黃燈
sbit GREEN11=P1^4;//上方公路綠燈
sbit RED00=P3^0;//上方人行道的紅燈(其它的有8個(gè)管腳控制,這個(gè)用單片機(jī)管腳控制)
sbit GREEN00=P3^1;//上方人行道的綠燈(其它的有8個(gè)管腳控制,這個(gè)用單片機(jī)管腳控制)
sbit RED01=P1^5;//前進(jìn)路的紅燈
sbit YELLOW01=P1^6;//前進(jìn)路的黃燈
sbit GREEN01=P1^7;//前進(jìn)路的綠燈
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
u8 second;//存儲(chǔ)時(shí)間數(shù)據(jù)
u8 DispalyData[8];//全局變量,保存動(dòng)態(tài)數(shù)碼管顯示時(shí)間的數(shù)組
void delay(u16 i)
{
while(i--);
}
void Timer0lnit()//初始化
{
TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1,僅用TR0打開(kāi)啟動(dòng)(用0001轉(zhuǎn)化為16進(jìn)制)(低4位T0)(TMOD=TMOD|0x01,防止對(duì)前面其他位產(chǎn)生影響)
TH0=0XFC;//給定時(shí)器賦初值,定時(shí)1ms(65535-1000+1,結(jié)果轉(zhuǎn)換為16進(jìn)制)
TL0=0X18;//由低四位溢向高四位,所以是0x18
ET0=1;//打開(kāi)定時(shí)器0中斷允許位
EA=1;//打開(kāi)中斷
TR0=1;//打開(kāi)定時(shí)器(T0寄存器控制位,置1開(kāi)始工作,置0停止工作,軟件控制啟動(dòng)和停止)
}
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位選,選擇點(diǎn)亮的數(shù)碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//顯示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//顯示第7位
}
GPIO_DIG=DispalyData[i];//相當(dāng)于調(diào)用smgduan[17]的數(shù)組內(nèi)容
delay(100); //間隔一段時(shí)間掃描
GPIO_DIG=0x00;//消隱
}
}
void main()
{
second=1;
Timer0lnit();//定時(shí)器0初始化
while(1)
{
if(second==70)
{
second=1;
}
if(second<30)
{
DispalyData[0]=0x00;//對(duì)于共陰數(shù)碼管是不點(diǎn)亮的意思,(同是低電平)
DispalyData[1]=0x00;//同上
DispalyData[2]=smgduan[(30-second)%100/10];//取十位賦值到DispalyData[i]位選,進(jìn)而調(diào)用smgduan[17]數(shù)組里面的數(shù)據(jù)
DispalyData[3]=smgduan[(30-second)%10];//取個(gè)位同上
DispalyData[4]=0x00;//前兩位不顯示,代表另外一路口的紅綠燈
DispalyData[5]=0x00;
DispalyData[6]=DispalyData[2];//后兩位顯示
DispalyData[7]=DispalyData[3];
DigDisplay();
GPIO_TRAFFIC=0xff;//所有初始燈關(guān)閉
RED00=1;//它內(nèi)部電路接在高電平,所以給它高電平就是關(guān)閉狀態(tài)
GREEN00=1;//同上
GREEN11=0;//上方公路綠燈
RED00=0;//上方人行道紅燈
RED01=0;//前進(jìn)路紅燈
GREEN10=0;//前進(jìn)路人行道綠燈
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1