0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何用51單片機(jī)實(shí)現(xiàn)交通信號(hào)燈

麥辣雞腿堡 ? 來源:CSDN博客 ? 作者:J.T.L ? 2023-01-28 17:46 ? 次閱讀

實(shí)驗(yàn)環(huán)境

軟件: Keil5+Proteus7

元件(主要):

AT89C51 * 1,

BUTTON * 1,

7SEG-MPX2-CA * 1,

LED-GREEN * 8,

LED-RED * 4,

LED-YELLOW * 4

實(shí)驗(yàn)原理

7SEG-MPX2-CA數(shù)碼管

? 7SEG-MPX2-CA數(shù)碼管是一個(gè)兩位數(shù)的陽極數(shù)碼管,有10個(gè)針腳,通過標(biāo)號(hào)a-dp八個(gè)針腳控制,LED燈的顯示,通過標(biāo)號(hào)為1,2的針腳控制顯示的是個(gè)位或是十位的數(shù)碼管。

? 要通過數(shù)碼管顯示具體數(shù)字,7SEG-MPX2-CA由于是一個(gè)陽極的數(shù)碼管,所以需要接收在針腳上接收相應(yīng)的低電平來顯示,如如果要顯示數(shù)字0,則標(biāo)號(hào)a-dp的針腳需要接收1100 0000也就是0xF9的信號(hào),同時(shí)如果不設(shè)置針腳1,2信號(hào),便會(huì)個(gè),十位都顯示相同的數(shù)字1,于是需要通過對(duì)針腳1設(shè)置低電平,針腳2設(shè)置為高電平實(shí)現(xiàn)個(gè)位的發(fā)光,相反設(shè)置則十位的發(fā)光。

? 通過人眼的余暉效應(yīng),我們可以設(shè)置1,2信號(hào)變化,來讓兩個(gè)單片機(jī)顯示自己想要的不同數(shù)字,由于人眼的分辨頻率,遠(yuǎn)遠(yuǎn)跟不上數(shù)碼管閃爍的頻率,雖然是個(gè)十位數(shù)碼管,不同時(shí)間進(jìn)行閃爍,但在人眼看來仿佛是一起亮起來的。

計(jì)時(shí)器/計(jì)數(shù)器

? 定時(shí)/計(jì)數(shù)器T0和T1分別是由兩個(gè)8位的專用寄存器組成,即定時(shí)/計(jì)數(shù)器T0由TH0和TL0組成,T1由TH1和TL1組成。此外,其內(nèi)部還有2個(gè)8位的特殊功能寄存器TMOD和TCON,TMOD負(fù)責(zé)控制和確定T0和T1的功能和工作模式,TCON用來控制T0和T1啟動(dòng)或停止計(jì)數(shù),同時(shí)包含定時(shí)/計(jì)數(shù)器的狀態(tài)。

? 16位的定時(shí)器/計(jì)數(shù)器實(shí)質(zhì)上就是一個(gè)加1計(jì)數(shù)器,其控制電路受軟件控制、切換。 當(dāng)定時(shí)器/計(jì)數(shù)器為定時(shí)工作方式時(shí),計(jì)數(shù)器的加1信號(hào)由振蕩器的12分頻信號(hào)產(chǎn)生,即每過一個(gè)機(jī)器周期,計(jì)數(shù)器加1,直至計(jì)滿溢出為止。

? 定時(shí)器的定時(shí)時(shí)間與系統(tǒng)的振蕩頻率有關(guān)。因一個(gè)機(jī)器周期等于12個(gè)振蕩周期,所以計(jì)數(shù)頻率fcount=1/12osc。

兩個(gè)字節(jié)最大數(shù)據(jù)為65536(十進(jìn)制),或者0FFFFH。

高字節(jié)為TH0=(65536-X)/256,就是除以256后的整數(shù)部分。

低字節(jié)為TL0=(65536-X)%256,減去高字節(jié)后余下的部分。

代碼實(shí)現(xiàn)

//名稱: LED模擬交通燈

#include

#define uint unsigned int

#define uchar unsigned char

#define SEG P3

sbit E_RED=P0^0; //東西紅燈

sbit E_YELLOW=P0^1; //東西黃燈

sbit E_GREEN=P0^2; //東西綠燈

sbit N_RED=P0^3; //南北紅燈

sbit N_YELLOW=P0^4; //南北黃燈

sbit N_GREEN=P0^5; //南北綠燈

sbit E_LEFT=P0^6; //南轉(zhuǎn)東向綠燈亮,北轉(zhuǎn)西向綠燈亮

sbit N_LEFT=P0^7; //東轉(zhuǎn)北綠燈亮,西轉(zhuǎn)南的綠燈亮

sbit btn = P1^0; //外部中斷開關(guān)

/*sbit P30=P3^0; //測試led燈是否能亮

sbit P31=P3^1;

sbit P32=P3^2;

sbit P33=P3^3;

sbit P34=P3^4;

sbit P35=P3^5;

sbit P36=P3^6;

sbit P37=P3^7;*/

sbit SCON1 = P2^0; //控制數(shù)碼管個(gè)位十位顯示

sbit SCON2 = P2^1;

uchar num=10,ge,shi; //定義倒計(jì)時(shí)初始值

uchar a=0; //定義交通燈種類

uchar count=0; //控制兩位數(shù)碼管

uchar flag; //計(jì)時(shí)器是否達(dá)到1s

//定義表格存放共陽極LED的點(diǎn)陣碼

unsigned char code ledTab[]={

0xC0, // 1100 0000 數(shù)字0

0xF9, // 1111 1001 數(shù)字1

0xA4, // 1010 0100 數(shù)字2

0xB0, // 1011 0000 數(shù)字3

0x99, // 1001 1001 數(shù)字4

0x92, // 1001 0010 數(shù)字5

0x82, // 1000 0010 數(shù)字6

0xF8, // 1111 1000 數(shù)字7

0x80, // 1000 0000 數(shù)字8

0x90 // 1001 0000 數(shù)字9

};

//type = 1; //操作類型變量

//i = 0; //循環(huán)變量

//1毫秒延遲子程序

void Delay_Ms(uint x){

uchar t;

while(x--)

{

for(t=50;t>0;t--);

}

}

int0()interrupt 0

{

TR0=~TR0;

}

//緊急暫停函數(shù)

void stop(){

//當(dāng)按鈕接受到低電平的時(shí)候,停止倒計(jì)時(shí),所有路口變成紅燈

if(btn==0){

Delay_Ms(1000); //取消抖動(dòng)

TR0=~TR0; //停止倒計(jì)時(shí)

N_RED = 0;N_YELLOW = 1;N_GREEN = 1; N_LEFT=1;

E_RED = 0;E_YELLOW = 1;E_GREEN = 1; E_LEFT=1;

}

}

//交通燈切換程序 此程序采用共陽極接法,所以低電平0有效

/*void traffic_light()

{

switch (type)

{

case 1: //南北綠,東西紅

N_RED = 1;N_YELLOW = 1;N_GREEN = 0; N_LEFT=1;

E_RED = 0;E_YELLOW = 1;E_GREEN = 1; E_LEFT=1;

Delay_Ms(5000);

type = 2;

break;

case 2: //南北閃黃燈,東西紅燈

N_RED=1;N_YELLOW = 0; N_GREEN=1; N_LEFT=1;

E_RED=0; E_YELLOW =1; E_GREEN=1; E_LEFT=1;

Delay_Ms(5000);

type = 3;

break;

case 3: //南轉(zhuǎn)東向綠燈亮,北轉(zhuǎn)西向綠燈亮

N_RED = 1; N_YELLOW = 1;N_GREEN = 1; N_LEFT=0;

E_RED = 0; E_YELLOW =1; E_GREEN=1; E_LEFT=1;

Delay_Ms(5000);

type = 4;

break;

case 4: //南北閃黃燈,東西紅燈

N_RED = 1;N_YELLOW = 0; N_GREEN = 1; N_LEFT=1;

E_RED = 0; E_YELLOW =1; E_GREEN=1; E_LEFT=1;

Delay_Ms(5000);

type = 5;

break;

case 5: //南北應(yīng)該亮紅燈,東西要亮綠燈

N_RED = 0;N_YELLOW = 1; N_GREEN = 1; N_LEFT=1;

E_RED = 1; E_YELLOW =1; E_GREEN=0; E_LEFT=1;

Delay_Ms(5000);

type = 6;

break;

case 6: //東西閃黃燈,南北亮紅燈

N_RED = 0;N_YELLOW = 1; N_GREEN = 1; N_LEFT=1;

E_RED = 1; E_YELLOW =0; E_GREEN=1; E_LEFT=1;

Delay_Ms(5000);

type = 7;

break;

case 7: //東轉(zhuǎn)北綠燈亮,西轉(zhuǎn)南的綠燈亮

N_RED = 0;N_YELLOW = 1; N_GREEN = 1; N_LEFT=1;

E_RED = 1; E_YELLOW =1; E_GREEN=1; E_LEFT=0;

Delay_Ms(5000);

type = 8;

break;

case 8: //東西閃黃燈,南北亮紅燈

N_RED = 0;N_YELLOW = 1; N_GREEN = 1; N_LEFT=1;

E_RED = 1; E_YELLOW =0; E_GREEN=1; E_LEFT=1;

Delay_Ms(5000);

type = 1;

break;

}

}*/

void T0INTinit() //定時(shí)器T0初始化1秒

{

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

}

void T0INT() interrupt 1

{

TH0=(65536-50000) / 256;

TL0=(65536-50000) % 256;

flag++;

if(flag==20)//當(dāng)定時(shí)到1秒時(shí)執(zhí)行花括號(hào)里面的語句

{

flag=0;

num--;

if (num == 0 && a%2 == 0) //控制黃燈倒計(jì)時(shí)

{

num = 5;

a++;

} else if (num == 0 && a%2 == 1){ //控制紅綠燈倒計(jì)時(shí)

num =10;

a++;

}

switch (a%8)

{

case 0: //南北綠,東西紅

N_RED = 1;N_YELLOW = 1;N_GREEN = 0; N_LEFT=1;

E_RED = 0;E_YELLOW = 1;E_GREEN = 1; E_LEFT=1;

break;

case 1: //南北閃黃燈,東西紅燈

N_RED=1; N_YELLOW = ~N_YELLOW; N_GREEN=1; N_LEFT=1;

E_RED=0; E_YELLOW = 1; E_GREEN=1; E_LEFT=1;

break;

case 2: //南轉(zhuǎn)東向綠燈亮,北轉(zhuǎn)西向綠燈亮

N_RED = 1; N_YELLOW = 1;N_GREEN = 1; N_LEFT=0;

E_RED = 0; E_YELLOW =1; E_GREEN=1; E_LEFT=1;

break;

case 3: //南北閃黃燈,東西紅燈

N_RED = 1;N_YELLOW = ~N_YELLOW; N_GREEN = 1; N_LEFT=1;

E_RED = 0; E_YELLOW =1; E_GREEN=1; E_LEFT=1;

break;

case 4: //南北應(yīng)該亮紅燈,東西要亮綠燈

N_RED = 0;N_YELLOW = 1; N_GREEN = 1; N_LEFT=1;

E_RED = 1; E_YELLOW =1; E_GREEN=0; E_LEFT=1;

break;

case 5: //東西閃黃燈,南北亮紅燈

N_RED = 0;N_YELLOW = 1; N_GREEN = 1; N_LEFT=1;

E_RED = 1; E_YELLOW = ~E_YELLOW; E_GREEN=1; E_LEFT=1;

break;

case 6: //東轉(zhuǎn)北綠燈亮,西轉(zhuǎn)南的綠燈亮

N_RED = 0;N_YELLOW = 1; N_GREEN = 1; N_LEFT=1;

E_RED = 1; E_YELLOW =1; E_GREEN=1; E_LEFT=0;

break;

case 7: //東西閃黃燈,南北亮紅燈

N_RED = 0;N_YELLOW = 1; N_GREEN = 1; N_LEFT=1;

E_RED = 1; E_YELLOW = ~E_YELLOW; E_GREEN=1; E_LEFT=1;

break;

}

}

}

//主程序

void main(){

T0INTinit();

while(1){ //死循環(huán)

stop();

SEG=0xff; //消影,不然只顯示一位

shi = num / 10;

ge = num % 10;

switch(count){

//通過余暉效應(yīng),雖然是不同時(shí)間,但人眼感覺是一起亮的

case 0: SCON1=0; SCON2=1; SEG=ledTab[ge]; break;

case 1: SCON1=1; SCON2=0; SEG=ledTab[shi]; break;

}

count++;

if(count>1) count=0;

//traffic_light(); //不斷執(zhí)行交通燈切換程序

}

}

成果圖

當(dāng)?shù)褂?jì)時(shí)結(jié)束時(shí)候,進(jìn)入黃燈閃爍,后在進(jìn)入紅燈

當(dāng)按下緊急暫停按鈕后,所有路口變?yōu)榧t燈,倒計(jì)時(shí)停止,再次點(diǎn)擊后恢復(fù)

原文鏈接:https://blog.csdn.net/qq_47200222/article/details/124027531

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6040

    文章

    44602

    瀏覽量

    637041
  • 信號(hào)燈
    +關(guān)注

    關(guān)注

    2

    文章

    70

    瀏覽量

    13420
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【作品】交通信號(hào)燈

    新手寫的交通信號(hào)燈,請(qǐng)指教。
    發(fā)表于 07-16 21:33

    交通信號(hào)燈

    求用multisim10設(shè)計(jì)交通信號(hào)燈
    發(fā)表于 01-18 21:07

    arduino交通信號(hào)燈

    交通信號(hào)燈:模仿交通信號(hào)燈,用到的器材有數(shù)碼管,三個(gè)LED燈,arduino控制板。(涉及PWM,I/O數(shù)字口,數(shù)碼管原理)
    發(fā)表于 03-03 15:06

    51單片機(jī)控制交通信號(hào)燈的相關(guān)資料分享

    51單片機(jī)控制交通信號(hào)燈說明:最近接了一個(gè)小項(xiàng)目,要在一個(gè)十字路口用單片機(jī)實(shí)現(xiàn)交通信號(hào)燈的控制我
    發(fā)表于 11-10 08:25

    何用51單片機(jī)實(shí)現(xiàn)交通信號(hào)燈

    51單片機(jī)實(shí)現(xiàn)交通信號(hào)燈1、新建工程項(xiàng)目及文件1.1 新建工程1.2 新建文件2、新建protues電路2.1 新建工程2.2 選擇元器件2.3 連接元器件3、導(dǎo)入文件并仿真3.1
    發(fā)表于 11-18 06:31

    城市交通信號(hào)燈模擬控制系統(tǒng)

    城市交通信號(hào)燈,采用單片機(jī)構(gòu)成控制系統(tǒng),可以節(jié)約人力資源和降低系統(tǒng)成本,從而有效的提高工作效率。但利用單片機(jī)控制交通信號(hào)燈涉及到一些現(xiàn)實(shí)問題,諸如
    發(fā)表于 07-10 15:06 ?152次下載

    單片機(jī)控制的交通信號(hào)燈

    單片機(jī)控制的交通信號(hào)燈 介紹一種用8031單片機(jī)控制的交通信號(hào)燈的硬件結(jié)構(gòu)與軟件
    發(fā)表于 03-14 15:16 ?1934次閱讀
    用<b class='flag-5'>單片機(jī)</b>控制的<b class='flag-5'>交通信號(hào)燈</b>

    交通信號(hào)燈的硬件原理圖

    單片機(jī)控制的交通信號(hào)燈 介紹一種用8031單片機(jī)控制的交通信號(hào)燈的硬件結(jié)構(gòu)與軟件設(shè)計(jì),并給出了其硬件原理圖和MCS-51匯編語言源程序。
    發(fā)表于 03-14 15:17 ?6682次閱讀
    <b class='flag-5'>交通信號(hào)燈</b>的硬件原理圖

    交通信號(hào)燈的硬件原理圖

    交通信號(hào)燈的硬件原理圖
    發(fā)表于 05-18 21:43 ?5169次閱讀
    <b class='flag-5'>交通信號(hào)燈</b>的硬件原理圖

    基于51單片機(jī)交通信號(hào)燈原理圖

    基于51單片機(jī)交通信號(hào)燈原理圖,采用STC89C51單片機(jī)、二位數(shù)碼管倒計(jì)時(shí)。
    發(fā)表于 05-19 15:32 ?102次下載

    單片機(jī)交通信號(hào)燈控制系統(tǒng)設(shè)計(jì)

    單片機(jī)交通信號(hào)燈控制系統(tǒng)設(shè)計(jì)(局部地區(qū)通信網(wǎng)絡(luò)英文縮寫)-為基于單片機(jī)交通信號(hào)燈控制系統(tǒng)設(shè)計(jì)講解文檔摘要:
    發(fā)表于 09-30 11:50 ?20次下載
    <b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>交通信號(hào)燈</b>控制系統(tǒng)設(shè)計(jì)

    項(xiàng)目實(shí)戰(zhàn):51單片機(jī)控制交通信號(hào)燈 PROTEUS 和51單片機(jī)教程(附仿真文件+源代碼)

    51單片機(jī)控制交通信號(hào)燈說明:最近接了一個(gè)小項(xiàng)目,要在一個(gè)十字路口用單片機(jī)實(shí)現(xiàn)交通信號(hào)燈的控制我
    發(fā)表于 11-05 09:50 ?27次下載
    項(xiàng)目實(shí)戰(zhàn):<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>控制<b class='flag-5'>交通信號(hào)燈</b> PROTEUS 和<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>教程(附仿真文件+源代碼)

    基于51單片機(jī)交通信號(hào)燈設(shè)計(jì)

    基于51單片機(jī)交通信號(hào)燈設(shè)計(jì)這里寫目錄標(biāo)題基于51單片機(jī)交通信號(hào)燈設(shè)計(jì)摘要:一.前言二、實(shí)驗(yàn)
    發(fā)表于 11-20 20:21 ?31次下載
    基于<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>交通信號(hào)燈</b>設(shè)計(jì)

    基于51單片機(jī)的簡單交通信號(hào)燈

    方案介紹一種簡單的基于AT89C51單片機(jī)交通信號(hào)燈,控制IO口電瓶從而輸出紅黃綠燈,利用延時(shí)函數(shù)實(shí)現(xiàn)紅路燈的計(jì)時(shí)功能。從而實(shí)現(xiàn)各個(gè)路口的
    發(fā)表于 12-16 15:54 ?15次下載

    基于單片機(jī)交通信號(hào)燈控制系統(tǒng)設(shè)計(jì)論文

    單片機(jī)交通信號(hào)燈系統(tǒng)加 功能串口通信 緊急通知 恢復(fù)?
    發(fā)表于 05-22 16:12 ?1次下載