日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

基于AT89C52单片机红绿灯设计程序

發(fā)布時(shí)間:2023/12/29 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于AT89C52单片机红绿灯设计程序 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言
本設(shè)計(jì)主要介紹十字路口紅綠燈路口的單片機(jī)程序設(shè)計(jì)思路與電路設(shè)計(jì)
電路設(shè)計(jì)
交通燈的電路設(shè)計(jì)總體來(lái)說(shuō)還是比較簡(jiǎn)單的,主要看設(shè)計(jì)者本人是否想要實(shí)現(xiàn)功能性比較多的智能交通燈,如果是簡(jiǎn)易的那只需要一個(gè)AT89C52單片機(jī)和相對(duì)應(yīng)的LED燈和數(shù)碼管顯示模塊。
本人所設(shè)計(jì)的這個(gè)簡(jiǎn)單的電路只用到了一個(gè)74LS138譯碼器,四個(gè)兩位共陰極的八段數(shù)碼管,分別顯示四個(gè)方向的延時(shí)時(shí)間,一個(gè)共陰極的八段數(shù)碼管,用來(lái)顯示所選擇的功能,紅黃藍(lán)LED燈各4個(gè)再加上一個(gè)AT89C52單片機(jī)。
電路最終實(shí)現(xiàn)的功能有十字路口正常通行,南北方向通行,東西方向通行,禁行通行四個(gè)功能。
電路設(shè)計(jì)圖紙如下所示:
程序設(shè)計(jì)思路
此程序總體來(lái)說(shuō)還比較簡(jiǎn)單的,主要可以分三個(gè)模塊來(lái)寫(xiě)
1、數(shù)碼管顯示模塊,顯示模塊通過(guò)74LS138譯碼器進(jìn)行控制,也就是說(shuō)只要寫(xiě)一個(gè)74LS138譯碼器的驅(qū)動(dòng)程序即可。
2、LED燈的交替變化顯示程序。
3、功能實(shí)現(xiàn)程序。這里用的是外部中斷1來(lái)達(dá)到目的的。
工作原理
當(dāng)系統(tǒng)上電后東西方向?yàn)榫G燈25s,南北方向?yàn)榧t燈30s,東西方向綠燈25s后變?yōu)辄S燈5s,東西方向黃燈5s后變換為東西方向紅燈30s,南北方向綠燈25s,南北方向綠燈25s后變換為黃燈5s,然后循環(huán)回到東西方向綠燈25s,南北方向30s,依次進(jìn)行循環(huán)。延時(shí)時(shí)間通過(guò)數(shù)碼管進(jìn)行顯示。
功能選擇:通過(guò)按鍵觸發(fā)外部中斷1改變中斷變量實(shí)現(xiàn)相應(yīng)的功能,中斷變量為0的時(shí)候是正常顯示,中斷變量為1的時(shí)候只有南北通行,東西禁止通行,中斷變量為2的時(shí)候只有東西通行,南北方向禁止通行,中斷變量為3的時(shí)候東南西北四個(gè)方向都禁止通行,為保證安全在變換功能之前都要執(zhí)行完正在執(zhí)行的正常周期后才能進(jìn)行變換。
程序編寫(xiě)
主程序

#include <reg52.h> #include <intrins.h>typedef unsigned int uint; typedef unsigned char uchar; void dispaly_smg(); void Zhenchang(); //定義南北顯示數(shù)碼管I/O端口 #define smg P2 #define LED P0 //定義按鍵IO端口 sbit key=P3^3; //定義74LS138譯碼器I/O段 sbit LSA=P1^4; sbit LSB=P1^5; sbit LSC=P1^6;uchar code smg_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //定義共陰極數(shù)碼管的段碼0~F uchar key_num; //存儲(chǔ)按鍵變量 uchar temp0; //中斷計(jì)數(shù)變量 uchar temp1,temp2; //temp1東西方向時(shí)間顯示,temp2南北方向時(shí)間顯示 uchar flag0; //正常顯示的變量 uchar flag1; //功能選擇中斷變量void delay(uint i) //軟件延時(shí)子程序 {while(i--); }void main() //主程序 {Time_Init(); //調(diào)用定時(shí)器和外部中斷1初始化子程序while(1){if(flag1==0){smg=0x00;delay(50);Zhenchang(); //正常工作顯示}else if(flag1==1){LED=0xf3; //南北通行dispaly_smg(); //數(shù)碼管顯示子程序}else if(flag1==2){LED=0xde; //東西通行dispaly_smg();}else if(flag1==3){LED=0xf6; //禁止通行dispaly_smg();}} }

數(shù)碼管顯示子程序

void dispaly_smg() //數(shù)碼管顯示函數(shù) { //74LS138譯碼器驅(qū)動(dòng)uchar i;for(i=0;i<5;i++){switch(i){case 0:LSA=0;LSB=0;LSC=0;smg=smg_duan[temp1/10];break; //東西通行時(shí)間顯示case 1:LSA=1;LSB=0;LSC=0;smg=smg_duan[temp1%10];break;case 2:LSA=0;LSB=1;LSC=0;smg=smg_duan[temp2/10];break; //南北通行時(shí)間顯示case 3:LSA=1;LSB=1;LSC=0;smg=smg_duan[temp2%10];break;case 4:LSA=0;LSB=0;LSC=1;smg=smg_duan[flag1];break; //顯示功能選擇值}delay(50);smg=0x00; //數(shù)碼管消隱delay(50);} }

正常顯示子程序

void Zhenchang() {switch(flag0){case 0: temp1=25;temp2=30; //兩個(gè)方向顯示賦初始值LED=0xde; //東西綠,南北紅while(temp1!=0){dispaly_smg(); //延時(shí)時(shí)間顯示if(temp0==100) //判斷定時(shí)器中斷變量是否到100次,也就是計(jì)時(shí)1s{temp1--; //temp1,temp2數(shù)字減1,temp0清零temp2--;temp0=0;}}flag0++; //變量加一break;case 1:temp1=5; //東西方向黃燈顯示賦值LED=0xee; //東西黃燈,南北紅while(temp1!=0){dispaly_smg();if(temp0==100){temp1--;temp2--;temp0=0;}}flag0++;break;case 2: temp1=30;temp2=25;LED=0xf3; //東西紅燈,南北綠燈while(temp2!=0){dispaly_smg();if(temp0==100){temp1--;temp2--;temp0=0;}}flag0++;break;case 3:temp2=5;LED=0xf5; //東西紅燈,南北黃燈while(temp2!=0){dispaly_smg();if(temp0==100){temp1--;temp2--;temp0=0;}}flag0=0;break;} }

定時(shí)器中斷初始化與外部中斷初始化子程序以及中斷服務(wù)程序

void Time_Init() //定時(shí)器中斷0與外部中斷1初始化 {EA=1; //打開(kāi)總中斷TMOD=0x01; //選擇定時(shí)器工作方式,工作方式為方式1ET0=1; //打開(kāi)定時(shí)器0中斷開(kāi)關(guān)TR0=1; //打開(kāi)定時(shí)器0進(jìn)行東西TH0=0xdc; //裝載初始值,初始值為10msTL0=0x00;IT1=1; //打開(kāi)外部中斷1EX1=1; //打開(kāi)外部中斷1的中斷開(kāi)關(guān) }void time() interrupt 1 //定時(shí)器中斷復(fù)位程序 {TH0=0xdc; //裝載初始值TL0=0x00;temp0++; //定時(shí)器中斷變量+1 }void Init() interrupt 2 //外部中斷1服務(wù)程序 {P3=0xff; //P3口全部拉高if(key==0) //按鍵是否按下{delay(1000); //消抖if(key==0) //再次判斷是否按下{while(!key); //判斷按鍵是否松開(kāi)flag1++; //改變功能選擇變量if(flag1==4)flag1=0; //當(dāng)變量等于4的時(shí)候清零,復(fù)位}} }

以上就是所有紅綠燈控制的所有基本程序,大家也可以更改上面的程序使其更加的完美,比如可以加上人行橫道的紅綠燈、黃燈閃爍提示人們時(shí)間快到了等等一系列的功能。學(xué)無(wú)止境,編程不難,難的是貴在堅(jiān)持。多寫(xiě)多學(xué),時(shí)刻要保證自己腦子有一個(gè)清晰的思維能力與理解能力。

總結(jié)

以上是生活随笔為你收集整理的基于AT89C52单片机红绿灯设计程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。