1. 程式人生 > >51微控制器交通燈(定時器+38譯碼器+中斷)

51微控制器交通燈(定時器+38譯碼器+中斷)

#include <reg52.h>

/************ 交通燈 ***********/

#define GPIO_DIG P0  //數碼管顯示交通燈等待的時間
#define GPIO_TRAFFIC    P1 //定義交通燈

sbit RED10 = P1^0;                //上面的人行道紅燈
sbit GREEN10 = P1^1;             //上面的人行道綠燈
sbit RED11 = P1^2;                //上面的機動車通行紅燈
sbit YELLOW11 = P1^3;            //上面的機動車通行黃燈
sbit GREEN11 = P1^4; //上面的機動車通行綠燈 sbit RED00 = P3^0; //右邊的人行道紅燈 sbit GREEN00 = P3^1; //右邊的人行道綠燈 sbit RED01 = P1^5; //右邊的機動車通行紅燈 sbit YELLOW01 = P1^6; //右邊的機動車通行黃燈 sbit GREEN01 = P1^7; //右邊的機動車通行綠燈 //38譯碼器的位選輸入端 sbit A1 = P2^2; sbit B1
= P2^3; sbit C1 = P2^4; typedef unsigned int u16; typedef unsigned char u8; u16 second = 1; void timer_init(){ TMOD |= 0x01; //定時器工作方式1,啟用T0定時器, GATE位為0,用TCON的TR0控制T0定時器的啟動 //設定定時器的初始計數值 //計算方法 //假設定時器為1ms,一個機器週期為 1/微控制器的晶振頻率 即: 1/12M = 1us //而1個機器週期 = 12個時鐘週期 所以: n x 機器週期 = 1ms ===> n x 1us = 1ms
//所以n = 1000,也就是經過1000個機器週期,定時器要溢位(從0開始計數) //所以定時器的初始值為65535 - 1000 + 1 = 64536 ===> 0xFC18 TH0 = 0xFC; //計時器初始值的高8位 TL0 = 0x18; //計時器初始值的低8位 EA = 1; //總中斷開關 ET0 = 1; //T0中斷 TR0 = 1;//啟動T0定時器 } void delay( u16 i ) { while( i-- ); } void trigger_timer() interrupt 1{ static u16 i = 0; TH0 = 0xFC; TL0 = 0x18; i++; if( i == 1000 ) { //1秒 i = 0; second++; } } u8 digital[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 }; u8 DisplayData[8]; void showDigital(){ int i = 0; for ( i = 0; i < 8; i++ ) { switch( i ) { case 0: //位選第一個數碼管 A1 = 0x0; B1 = 0x0; C1 = 0x0; break; case 1: A1 = 0x1; B1 = 0x0; C1 = 0x0; break; case 2: A1 = 0x0; B1 = 0x1; C1 = 0x0; break; case 3: A1 = 0x1; B1 = 0x1; C1 = 0x0; break; case 4: A1 = 0x0; B1 = 0x0; C1 = 0x1; break; case 5: A1 = 0x1; B1 = 0x0; C1 = 0x1; break; case 6: A1 = 0x0; B1 = 0x1; C1 = 0x1; break; case 7: A1 = 0x1; B1 = 0x1; C1 = 0x1; break; } GPIO_DIG = DisplayData[ i ]; delay( 100 ); GPIO_DIG = 0x00; //消隱 } } void main(){ u8 shiwei = 0, gewei = 0; timer_init(); while( 1 ){ if( second == 70 ) { //紅綠燈總共70秒 然後輪迴 second = 1; } if( second < 31 ) { DisplayData[0] = 0x00; //數碼管1顯示的數字 DisplayData[1] = 0x00; //數碼管2顯示的數字 shiwei = ( 30 - second ) % 100 / 10; gewei = ( 30 - second ) % 10; DisplayData[2] = digital[ shiwei ]; DisplayData[3] = digital[ gewei ]; DisplayData[4] = 0x00; //數碼管5顯示的數字 DisplayData[5] = 0x00; //數碼管6顯示的數字 DisplayData[6] = DisplayData[2]; DisplayData[7] = DisplayData[3]; //寶田路通行 GPIO_TRAFFIC = 0xFF; //熄滅所有的燈 RED00 = 1; GREEN00 = 1; GREEN11 = 0; //寶田路綠燈亮 RED10 = 0; //寶田路人行道 紅燈亮 GREEN00 = 0; //前進路人行道綠燈亮 RED01 = 0; //前進路紅燈亮 showDigital(); } else if ( second < 36 ){ //黃燈切換 DisplayData[0] = 0x00; //數碼管1顯示的數字 DisplayData[1] = 0x00; //數碼管2顯示的數字 shiwei = ( 35 - second ) % 100 / 10; gewei = ( 35 - second ) % 10; DisplayData[2] = digital[ shiwei ]; DisplayData[3] = digital[ gewei ]; DisplayData[4] = 0x00; //數碼管5顯示的數字 DisplayData[5] = 0x00; //數碼管6顯示的數字 DisplayData[6] = DisplayData[2]; DisplayData[7] = DisplayData[3]; //寶田路黃燈切換 GPIO_TRAFFIC = 0xFF; //熄滅所有的燈 RED00 = 1; GREEN00 = 1; YELLOW11 = 0; //寶田路黃燈亮 RED10 = 0; //寶田路人行道 紅燈亮 GREEN00 = 0; //前進路人行道綠燈亮 RED01 = 0; //前進路紅燈亮 showDigital(); } else if ( second < 66 ){ //前進路通行 DisplayData[0] = 0x00; //數碼管1顯示的數字 DisplayData[1] = 0x00; //數碼管2顯示的數字 shiwei = ( 65 - second ) % 100 / 10; gewei = ( 65 - second ) % 10; DisplayData[2] = digital[ shiwei ]; DisplayData[3] = digital[ gewei ]; DisplayData[4] = 0x00; //數碼管5顯示的數字 DisplayData[5] = 0x00; //數碼管6顯示的數字 DisplayData[6] = DisplayData[2]; DisplayData[7] = DisplayData[3]; //前進路通行 GPIO_TRAFFIC = 0xFF; //熄滅所有的燈 RED00 = 1; GREEN00 = 1; GREEN01 = 0; //前進路綠燈亮 RED00 = 0; //前進路人行道 紅燈亮 GREEN10 = 0; //寶田路人行道綠燈亮 RED11 = 0; //寶田路紅燈亮 showDigital(); } else { //黃燈切換 DisplayData[0] = 0x00; //數碼管1顯示的數字 DisplayData[1] = 0x00; //數碼管2顯示的數字 shiwei = ( 70 - second ) % 100 / 10; gewei = ( 70 - second ) % 10; DisplayData[2] = digital[ shiwei ]; DisplayData[3] = digital[ gewei ]; DisplayData[4] = 0x00; //數碼管5顯示的數字 DisplayData[5] = 0x00; //數碼管6顯示的數字 DisplayData[6] = DisplayData[2]; DisplayData[7] = DisplayData[3]; //前進路通行 GPIO_TRAFFIC = 0xFF; //熄滅所有的燈 RED00 = 1; GREEN00 = 1; YELLOW01 = 0; //前進路黃燈亮 RED00 = 0; //前進路人行道 紅燈亮 GREEN10 = 0; //寶田路人行道綠燈亮 RED11 = 0; //寶田路紅燈亮 showDigital(); } } }

相關推薦

51微控制器交通(定時+38譯碼+中斷)

#include <reg52.h> /************ 交通燈 ***********/ #define GPIO_DIG P0 //數碼管顯示交通燈等待的時間 #define GPIO_TRAFFIC P1 //定義交通燈 sbit RED10 = P1

基於51微控制器計數器進行定時的記秒

平臺STC89C52    時鐘晶振11.0592MHZ     軟體keil4  程式碼如下: #include <reg52.h> #define uchar unsigned char #define uint unsigned int #define

51微控制器 流水 蜂鳴應用

/*======================================================*/ /* 時間:2015年7月27日 21:34:44 */ /* :2015年7月29日 21:40:17 */ /* :2015年8月2日 18:15:38

51微控制器——流水

//流水燈,同時蜂鳴器響 #include <reg51.h> #include <intrins.h> unsigned char i,j,k,t; sbit beep=P2^3; void delay10ms() { for(i=100;i>

verilog實現38譯碼

module decode_38 ( input wire[2:0] a, output reg[7:0] y ); integer i; always @(*) begin //******

2.3.第八個實驗--使用38譯碼驅動數碼管

2.3.第八個實驗–使用38譯碼器驅動數碼管 實驗目的:使用38譯碼器來驅動數碼管來節省IO埠 預備知識: (1)什麼是38譯碼器? 38譯碼器有3個輸入埠A、B、C和8個輸出埠Y0-Y7。由輸入埠控制輸出埠的值 (2)為什

51微控制器定時中斷控制1S亮的程式

#include   <AT89X51.H>unsigned char i=0,j=0; void main(){ TMOD=0X01; TH0=0X4c; TL0=0X00; TR0=1;ET0=1;EA=1;P0_3=1;  while(1)   {};} t

51微控制器使用定時中斷模擬PWM控制埠電壓

  最近應實驗室需求寫一篇51微控制器產生PWM的文章供參考.   微控制器晶片STC89C52,晶振12MHz,編譯環境Keil5.   分析:若使微控制器埠為高電平, 則微控制器輸出電壓為恆值5V. 反之低電平輸出電壓為0V. 但是我們如果在週期為T的時間內

51微控制器學習筆記之定時程式設計

一、定時器/計數器概述 1.相關暫存器 (1)TMOD——方式控制暫存器     GATE C/T M1 M0(T1 T0)   GATE=0,定時器/計數器的執行由內部TR0/TR1置1選通;   GATE=1,定時器/計數器的執行由外部中斷(I引腳P3.2/P3.3)和內部TR0/TR1 置1共

基於51微控制器交通控制系統設計

第一章 硬體設計與原理 以AT89C51微控制器為核心,起著控制作用。系統包括數碼管顯示電路、復位電路、時鐘電路、發光二級管電路和按鍵電路。設計思路分為六個模組:復位電路、晶振電路模組、AT89C51、數碼管顯示電路、發光二級管電路和按鍵電路這六個模組。 1.2 硬體設計分析 1.

51微控制器定時

參考資料:金沙灘工作室《手把手教你51微控制器》 一開始狀態不好,前一天逛淘寶到12點才睡,很困。在ict雙創實驗室困。聽了一遍很模糊,對突然冒出的TL、TH、TR、TF等很陌生。上csdn看了一下後,感覺理解了一些。決定再看一次視訊,又看了一次視訊清晰很多。感覺初學

51微控制器的延時及定時

2.軟體延時:軟體延時有時候不能夠做到非常精確地延時,主要靠迴圈體或是一些無意義的指令來完成。 微控制器都有一個屬於自己的晶振頻率:11.0592Mhz(主要是為了設定波特率的方便),12Mhz,6Mhz等(後面的例子全都用12M晶振)。對於12Mhz的晶振頻率,一個機器週期為1us,對於51微控制器的庫

51微控制器中斷系統(定時、計數器)

*部分內容來源於網路 一、中斷 中斷是指計算機執行過程中,出現某些意外情況需主機干預時,機器能自動停止正在執行的程式並轉入處理新情況的程式,處理完畢後又返回原被暫停的程式繼續執行。 (*以上解釋來自於百度百科-中斷) 二、51微控制器中斷級別 中斷號 優先順

51微控制器定時的原理與使用

定時器是微控制器的重要功能模組之一,在檢測、控制領域有廣泛應用。定時器常用作定時時鐘,以實現定時檢測,定時響應、定時控制,並且可以產生ms寬的脈衝訊號,驅動步進電機。定時和計數的最終功能都是通過計數實現,若計數的事件源是週期固定的脈衝則可實現定時功能,否則只能實現計數功能。

51微控制器定時中斷程式

程式執行開始,A燈先亮5秒,然後滅了到B燈亮5秒,B再滅再到C燈亮5秒,C滅,程式結束,不再執行。這程式該怎麼寫?用定時器精確定時……晶振11.092MHZ。 #include "REG52.H" /* * */ sbit LED_A = P1^0; sbit

51微控制器自定義多個軟體定時

/*---------------------------------------------------- 名稱:用定時器控制led亮滅 微控制器:stc12c2052 晶振:12M 說明:四個led,四種頻率亮。 ------------------------------------------

51微控制器定時實現LED閃爍

要啟用一個定時器,先要開啟定時器,然後產生中斷 系統中斷: 初始化程式應完成如下工作: 對TMOD賦值,以確定T0和T1的工作方式。 計算初值,並將其寫入TH0、TL0或TH1、TL1。 中斷方式時,則對EA賦值,開放定時器中斷。 使TR0或TR1置位,啟動定時/計數器定時或計數。

51微控制器定時/計數器的使用程式與分析

定時器的使用能夠使延時更加的準確定時器/計數器由振盪器,12分頻電路,多路轉換開關MUX,16位的加1計數器T0和16位的T1暫存器組成。定時器/計數器的核心是16位的加1計數器。1、計數功能:對外部脈衝進行計數。外部脈衝通過T0(P3.4)、T1(P.5)兩個訊號引腳輸入,

51微控制器--定時測量脈寬

學51也算有一段時間了 以前學的相當的粗糙 很多原理性的東西 都不知道 今天上課的時候聽老師說  這個LOW的微控制器可以測量脈寬   去手冊上看了一下 加上課本上說的  臥槽 真的可以 哈哈   直

基於51微控制器交通C語言程式設計

十字交叉路口的交通燈控制器,是很常見的課程設計題目。做而論道以前寫過一個,功能十分簡單。最近,綜合了一些百度知道中的題目要求,寫出了一個稍稍複雜一點設計方案,使用了大家比較喜歡的C語言編寫程式。基本功能如下:(1)東西、南北方向各設有一個綠、黃、紅指示燈,兩個顯示數碼管。(2)兩個方向交替允許通行,基本放行