單片機實現(xiàn)交通燈控制系統(tǒng)的雙模式
#include
#define uint unsigned int
#define uchar unsigned char
uint aa,num,MODEL1,numa,HMODE1;
uchar shi,ge,gtime,rtime;
… …
sbit dula=P1^0; // 段選
sbit wela=P1^1; // 位選
sbit LED1=P1^2; // 東西(紅燈)
sbit LED2=P1^5; // 南北(紅燈)
sbit LED3=P1^6; // 南北(黃燈)
sbit LED4=P1^3; // 東西(黃燈)
sbit LED5=P1^7; // 南北(綠燈)
sbit LED6=P1^4; // 東西(綠燈)
sbit KEY1=P3^5;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar table1[]={0xbf,0x7f};
void delay(uchar z) // 延時函數(shù)
{ uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--); }
void init()
{ TMOD=0x01; // 選擇方式一,16 位計數(shù)器
TH0=15536/256;
TL0=15536%256; // 定時器高、低位,置入初值
EA=1; // 中斷允許總控制位
ET0=1; // 定時器0 中斷允許控制位
TR0=1; // 定時器0 運行控制位
aa=0;
gtime=60;
rtime=40;
num=1;
numa=1;
MODEL1=1;
HMODE1=0;}
定時的函數(shù)及原理:
當單片機工作于定時狀態(tài)時,定時/計數(shù)器對機器周期進行計數(shù),每個機器周期包括12個振蕩周期,以晶振頻率為12MHZ 為例,則:
1 個機器周期=12/晶振頻率=12/12000000=0.001ms定時時間為:TC=XTP。其中,TP 為機器周期,TC 為定時時間。
則應裝入計數(shù)/定時器的初值為:
(注:M=2n , TP 為機器周期,TC 為定時時間)
對于方式1,一次最大的定時時間為:T=(216-0)×0.001=65.536ms ,為了便于計算,設定每次最大定時時間為50ms,計算應裝入的初值:N = 65536 − 50000 = 15536
顯示子函數(shù):
通過單片機對鎖存器進行位選,段選的控制,使數(shù)碼管顯示需要的數(shù)字。
void display(shi,ge)
{ dula=1;
P0=table[shi];
dula=0;
wela=1;
P0=table1[0];
wela=0;
delay(5);
P0=0xff; // 對數(shù)碼管消影
dula=1;
P0=table[ge];
dula=0;
wela=1;
P0=table1[1];
wela=0;
delay(5);
P0=0xff;}
模式一函數(shù):
void mod1()
{ if(num==1>ime>5) // 東西道紅燈亮,南北道綠燈亮,最后5 秒切換成黃燈
{ LED5=0;
LED1=0; }
if(num==2) // 東西道綠燈亮,南北道紅燈亮
{ LED2=0;
LED6=0;
LED5=1;
LED3=1;
LED1=1; }
if(num==1>ime==5) // 東西道紅燈亮,南北道黃燈亮5 秒
{ LED5=1;
LED2=1;
LED3=0; }
shi=gtime/10;
ge=gtime%10;
if(aa==20) // 50ms×20=1s, 即過1s 數(shù)碼管數(shù)字減1
{ aa=0;
gtime--; }
display(shi,ge);
if(gtime==0num!=2)
{ gtime=60;
num=2; }
if(gtime==0num==2)
{ num=1;
gtime=60;
LED2=1;
LED6=1; } }
評論