基於MCS-51單片機的交通燈設計
設計一個基於單片機的交通燈信號控製器。已知東、西、南、北四個方向各有紅黃綠色三個燈,在東西方向有兩個數碼管, 在南北方向也有兩個數碼管。 要求交通燈按照表 1進行顯示和定時切換,並要求在數碼管上分別倒計時顯示東西、南北方向各狀態的剩餘時間。
表1 交通燈的狀態切換表
文檔下載:https://wenku.baidu.com/view/90f849876529647d26285204?fr=prin
警告:不同單片機的動態掃描顯示不一樣,即下麵黃底紅字是讓數碼管顯示函數,如果單片機不一樣,隻需改顯示 函數即可,其他的不要動。
2: 程序設計(僅供參考的 C語言源程序)
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義 #include<math.h> #define uchar unsigned char #define uint unsigned int #define ulang unsigned lang static unsigned char count; code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰數碼管 0-9 uchar smg[8]; //定義緩衝區 uint we,ns,h,j; //ns代表南北,we代表東西 int aaa(); //東西紅燈亮,南北綠燈,黃燈亮 int bbb(); //南北紅燈亮,東西綠燈,黃燈亮 int eee(); //第一次完成顯示,繼續第二次初始化 void delay(unsigned int cnt) { while(--cnt); } void display( ) { //取每一位的數字 smg[0]=tab[we/10]; smg[1]=tab[we%10]; smg[2]=0x00; smg[3]=0x00; smg[4]=0x00; smg[5]=0x00; smg[6]=tab[ns/10]; smg[7]=tab[ns%10]; } void main() { uchar i; TMOD |=0x01; //定時器0 10ms in 12M crystal 用於計時 TH0=0xd8; //初值 TL0=0xf0; ET0=1; TR0=1; EA =1; display(); while(1) { for(i=0;i<8;i++) //顯示函數,因單片機而異 { P0=smg[i]; P2=i; delay(100); } ccc(); //進入交通燈控製程序 display( ); //掃描數碼管 } } void timer() interrupt 1 //中斷函數 { TH0=0xd8; //重新賦值 TL0=0xf0; count++; } int aaa() { if(j<25) //東西紅燈計數30秒,南北25秒綠燈亮 { if(j==1) { we=30,ns=25; } ns--; we--; P1=0xde; return 0; } if(25<=j<30) //南北黃燈5秒 { if(j==26) { ns=5; } P1=0xee; ns--; we--; return 0; } } int bbb() { if(h<25) { //南北紅燈30秒,東西綠燈25秒 if(h==1) { we=25,ns=30; } ns--; we--; P1=0xf3; return 0; } if(25<=h<30) //東西黃燈5秒 { if(h==26) { we=5; } P1=0xf5; ns--; we--; return 0; } } int eee() //一次周期交通燈顯示完後,重新賦值,等待第二次 { j=0; h=0; return 0; } int ccc() //交通燈控製函數 { if (count==100) //定時一秒 { count=0; j++; //算法函數 if ( (j>30)&&(j!=61)) { h++; bbb(); return 0; } if(j==61) { eee(); return 0;} aaa(); return 0; } }
最後更新:2017-04-03 19:13:18