|
交通燈實驗報告 班級: 姓名: 一.實驗要求 使用單片機系統主機板和單片機系統I/O板設計一個硬件系統,最終實現一個交通路口紅綠燈的控制。用兩個數碼管顯示秒,8個LED燈分成四組,分別作為十字交叉路口的紅綠燈。亮燈的狀態是:亮1s,滅1s
二.硬件連線方案見下表: 使用的并口 | 主機板插座 | I/O板插座 | 功能 | P0 | P2 | P00 | 段碼傳送至數碼管 | P1 | P3 | P20 | 控制信號傳送至數碼管.段選DULA、位選G1、地址CBA | P2 | P4 | P2 | 給指示燈傳送數據 |
三.程序流程圖可參考下圖:
四:單片機源代碼 - #include<reg51.h> //包含特殊功能寄存器聲明頭文件
- sbit dula=P1^3; // 特殊功能位定義,數碼管段碼控制信號
-
- sbit g1=P1^4; //數碼管位選控制信號
-
- sbit c=P1^5; //c表示P1.0口,地址最高位
- sbit b=P1^6; //地址次高位
- sbit a=P1^7; //地址最低位
- sbit sg=P2^0; //特殊功能位
- sbit sr=P2^1;
- sbit eg=P2^2;
- sbit er=P2^3;
- sbit ng=P2^4;
- sbit nr=P2^5;
- sbit wg=P2^7;
- sbit wr=P2^6;
- char s=10,ms=0;
-
- unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //定義無符號數組,定義的數據要放在ROM(程序存儲區)里面
- bit fang=0;
-
- void delay(){ //延時函數,通過for循環進行延時
- unsigned char i; //定義計數器變量
- for(i=0;i<255;i++);
- }
-
- initial(){ //初始化函數
- TMOD=1; //設置定時器/計數器0工作方式1
- TL0=0XF0; //設置定時器/計數器0賦初值(低八位)
- TH0=0XD8; //設置定時器/計數器0賦初值(高八位)
-
- TR0=1; //啟動定時器TO
- ET0=1; //允許定時器TO中斷
- EA=1; //允許CPU中斷
- sr=1;
- sg=0;
- er=0;
- eg=1;
- nr=1;
- ng=0;
- wr=0;
- wg=1;
- g1=0;
- }
-
- display(){
- P0=tab[s/10];dula=1; //顯示秒十位
- c=1;b=1;a=0;g1=1;
- delay(); //延時
- g1=0;
-
- P0=tab[s%10];dula=1; //顯示秒個位
- c=1;b=1;a=1;g1=1;
- delay();
- g1=0;
- }
-
- main(){ //主函數
- initial();
- while(1){ //無限循環
- display(); //延時
- }
- }
-
- t_0() interrupt 1{ //外部信號出發中斷1中斷服務函數
- TL0=0XF0; //設置定時器/計數器0賦初值(低八位)
- TH0=0XD8; //設置定時器/計數器0賦初值(高八位)
- ms++; //計數器加1
- if(ms==50&&s<=3){
- wg=1;
- sg=1;
- eg=1;
- ng=1;
- }
- if(ms==100){ //判斷計數器是否記滿100
- if(fang==0){ //數碼管顯示0
- ng=0;
- sg=0;
- }
- else{
- eg=0;
- wg=0;
- }
- ms=0;
- s--;
- if(s==0){ //數碼管顯示0
- s=10;
- fang=~fang;
- sr=~sr;
- sg=~sg;
- er=~er;
- eg=~eg;
- nr=~nr;
- ng=~ng;
- wr=~wr;
- wg=~wg;
- }
- }
- }
復制代碼
五.實驗總結: 最終實現一個交通路口紅綠燈的控制。用兩個數碼管顯示秒,8個LED燈分成四組,分別作為十字交叉路口的紅綠燈。相對雙向綠燈的最后幾秒時,綠燈要閃爍,即亮滅交替,亮滅時間均為0.5秒,然后變成紅燈。
完整的Word格式文檔51黑下載地址:
交通燈實驗報告2.docx
(71.23 KB, 下載次數: 15)
2018-3-29 16:21 上傳
點擊文件名下載附件
交通燈 下載積分: 黑幣 -5
|