1. 程式人生 > >基於51微控制器的交通燈C語言程式設計

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

十字交叉路口的交通燈控制器,是很常見的課程設計題目。做而論道以前寫過一個,功能十分簡單。
最近,綜合了一些百度知道中的題目要求,寫出了一個稍稍複雜一點設計方案,使用了大家比較喜歡的C語言編寫程式。

基本功能如下:

(1)東西、南北方向各設有一個綠、黃、紅指示燈,兩個顯示數碼管。
(2)兩個方向交替允許通行,基本放行時間為25s,另外有黃燈閃爍5s。
(3)控制人員可以暫停自動的交替,使某個方向可以無限長時間的通行。
(4)暫停期間,控制人員可以調整通行的時間,程式中還設定了調整的上下限。
(5)暫停之後,燈光將按照設定的通行時間自動變換通行方向。
(6)在正常通行期間,可以強制變換通行方向。強制變換的時候,也是要先顯示閃爍的黃燈,然後切換到指定的方向。

程式用PROTEUS模擬成功,並沒有進行硬體實驗。模擬截圖畫面如下。

C語言的控制程式如下:
//------------------------------------------------
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

//----------------定義介面------------------------
#define  K_IN  P1      //指定按鍵輸入埠
#define  Star_Stop 1   //指定按鍵輸入埠
#define  Time_ADD  2   //指定按鍵輸入埠
#define  Time_SUB  4   //指定按鍵輸入埠
#define  Turn_EW   8   //指定按鍵輸入埠
#define  Turn_SN  16   //指定按鍵輸入埠

sbit D_R = P3^0;
sbit D_Y = P3^1;
sbit D_G = P3^2;
//----------------定義變數------------------------
uchar Key_C;      //新鍵值
uchar Key_L;      //上次鍵值
uchar Trg;        //觸發(有鍵按下)triger
uchar Trg_L;      //上次觸發
uchar Key_P;      //確實按下
uchar n_2ms, n_0D5s, D_SEC = 60;  //60實際上是30秒
uchar code D_seg[] = {            //共陽段碼
   0xc0, 0xf9, 0xa4, 0xb0, 0x99,
   0x92, 0x82, 0xf8, 0x80, 0x90}; //0-9
bit  s_g, run, hong;
//----------------延時----------------------------
void delay(uint z)        
{
    uint x, y;
    for(x = z; x > 0; x--)  for(y = 123; y > 0; y--);
}
//----------------讀按鍵--------------------------
void KeyRead( void )   //讀按鍵所在埠,送到全域性變數
{
    Key_L = Key_C;     //上次按鍵數值
    Trg_L = Trg;
    Key_C = ~K_IN;     //反相讀入,有鍵按下,將讀入1
    Trg   = Key_C & (Key_C ^ Key_L); 
    Key_P = Key_C & Trg_L;  //確認按下
}
//----------------初始化--------------------------
void init(void)
{
    TMOD = 0x01;       //T0定時方式1
    TH0 = (65536 - 2000) / 256; //[email protected]


    TL0 = (65536 - 2000) % 256;
    TR0 = 1;           //啟動T0
    ET0 = 1;           //開T0中斷
    EA = 1;            //開總中斷
//---------------------
    D_Y = 0;           //關燈
    D_R = hong;        //紅燈取決於當前的hong
    D_G = ~D_R;        //綠燈則相反
    n_0D5s = D_SEC;    //倒計時的秒數(2倍的數值)
}
//----------------主函式--------------------------
void main(void)
{
    hong = 1;          //hong = 1: 東西為紅燈
    init();
    run = 1;           //開機即執行
    while(1) {
      delay(8);        //延時8ms
      if (Star_Stop & Key_P) {
        run = ~run;
        if (!run)  init();
      }
      if (Time_ADD & Key_P && !run) {
        D_SEC += 2;
        if (D_SEC > 120)  D_SEC = 120;
        n_0D5s = D_SEC;
      }
      if (Time_SUB & Key_P && !run) {
        D_SEC -= 2;
        if (D_SEC < 20)  D_SEC = 20;
        n_0D5s = D_SEC;
      }
      if (Turn_EW & Key_P && run && hong)   n_0D5s = 11;
      if (Turn_SN & Key_P && run && !hong)  n_0D5s = 11;
    }

//----------------T0中斷函式----------------------
void T0_INT(void) interrupt 1
{
    TL0 = (65536 - 2000) % 256; //重新寫入初值
    TH0 = (65536 - 2000) / 256; //[email protected]
//----------------數碼顯示------------------------
    s_g = ~s_g;            //十位個位交替顯示
    if (s_g)  {P2 = 0; P0 = D_seg[(n_0D5s / 2) / 10]; P2 = 1;}
    else      {P2 = 0; P0 = D_seg[(n_0D5s / 2) % 10]; P2 = 2;}
//----------------修改時間------------------------
    n_2ms--;
    if (n_2ms % 5 == 0)  KeyRead();  //10ms讀一次按鍵
    if (n_2ms == 0) {
      n_2ms = 250;         //定時500ms
      if (run) {           //如果是正在執行
        n_0D5s--;          //就倒計時
        if(n_0D5s == 1)  n_0D5s = D_SEC + 1;//減到1就重新開始
        if(n_0D5s == D_SEC + 1)  {//如果是重新開始
          if (hong) {      //如果當前是紅燈亮
            hong = 0;      //下面就改成綠燈亮
            D_Y = 0;       //關閉黃燈
            D_G = 1;       //開啟綠燈
            D_R = 0;       //關閉紅燈
          }
          else {           //否則就改成紅燈亮
            hong = 1;
            D_Y = 0;       //關閉黃燈
            D_G = 0;       //關閉綠燈
            D_R = 1;       //開啟紅燈
        } }
        if(n_0D5s <= 11)  {//如果是最後5秒
          D_Y = ~D_Y;      //黃燈閃爍
          D_G = 0;         //關閉綠燈
          D_R = 0;         //關閉紅燈
}   } } }
//----------------程式結束------------------------

相關推薦

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

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

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

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

微控制器流水C語言程式

#include<reg51.h> #define TIME 5 void delay(int time){ //延時程式碼 int i,

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

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

KST-51微控制器c語言程式設計實現數碼管動態顯示秒錶的倒計時

/*60S倒計時*/ /*個位每1S變一次,從0~9*/ /*十位,個位為0的下一秒十位發生變化*/ #include<reg52.h> sbit ADDR0=P1^0; sbit ADDR1=P1^1; sbit ADDR2=P1^2; sbit ADDR3

GSM/GPRS模組 AT指令集C語言程式設計——基於有方M660+和MSP430微控制器

GSM/GPRS晶片是手機中負責收發簡訊、撥打電話以及訪問GPRS網路的核心器件。有方M660+為深圳有方公司生產的一款超小封裝的GSM/GPRS工業無線模組,可以提供高品質的語音、簡訊、資料業務等功能,在各種工業和民用領域得到廣泛的應用。 有方M660+ GPRS模組的硬體設計 硬體設計參考附件《M

51微控制器C語言程式設計雜談基礎----全域性變數和區域性變數

<  部落格宗旨:文章短,時間短,不考驗耐力    > 我記著我在開始編寫51微控制器程式的時候,老是在思考一個問題:怎麼把一個函式中的值傳到另一個函式中去呢???讓我痛不堪言。雖然簡單,但是在那個時候我還是不知道的。 全域性變數:就是在整個工程都可以使用

基於51微控制器控制的籃球比賽計時、計分系統設計與模擬(含設計圖和C語言程式原始碼)

1. 設計任務: 本次設計用由AT89C51程式設計控制LED七段數碼管作顯示的球賽計時計分系統。系統應具有賽程定時設定,賽程時間暫停,及時重新整理甲、乙雙方的成績以及賽後成績暫存等功能。 內容包括:顯示、鍵盤、時鐘等內容 2. 設計說明

基於TCP/IP的網路程式設計C++語言程式設計

基於TCP/IP的通訊基本上都是利用SOCKET套接字進行資料通訊,程式一般分為伺服器端和使用者端兩部分。設計思路(visual studio下): 第一部分 伺服器端   一、建立伺服器套接字(create)。   二、伺服器套接字進行資訊繫結(bind),並開始監聽連線

基於51微控制器的led控制小實驗

該小實驗是為了更好的理解51微控制器的使用,其完成的要求如下: 1.第一個鍵控制兩個燈的翻轉; 2.第二個鍵控制一個燈的翻轉; 3.第三個鍵接在51微控制器的外部中斷口,每檢測到一次,翻轉三下; 4.第四個鍵控制燈的亮度,使燈的亮度從低加到高。 說明: (1).此實驗使用的開發板,l

linux下C語言程式設計日誌(1):基於TCP協議的伺服器/客戶端程式

  基於TCP協議的伺服器/客戶端程式  首先我們看一下使用TCP協議進行網路通訊的程式基本模型:伺服器首先進行初始化操作:呼叫函式socket建立一個套接字,函式bind將這個套接字與伺服器的公認地址繫結在一起,函式listen將這個套接字換成傾聽套接字,然後呼叫函式acc

微控制器C語言程式設計中所用的語言推薦規範

一、程式風格: 1、嚴格採用階梯層次組織程式程式碼: 各層次縮排的分格採用VC的預設風格,即每層次縮排為4格,括號位於下一行。 要求相匹配的大括號在同一列,對繼行則要求再縮排4格。例如: 2、提示資訊字串的位置 在程式中需要給出的

詳解!C語言程式設計實現小遊戲“三子棋”

今天我們來程式設計實現一個充滿童趣的小遊戲“三子棋” 先來說一下三子棋的規則: 三子棋又叫九宮棋、圈圈叉叉、一條龍等。 將正方形對角線連起來,或相對兩邊依次擺上三個雙方棋子, 總之只要將自己的三個棋子走成一條線, 對方就算輸了。 不用再過多解釋了,相信大家一定都玩過! 那麼,該

1012 - C語言程式設計教程(第三版)課後習題6.2

1012 - C語言程式設計教程(第三版)課後習題6.2 時間限制:1秒 記憶體限制:128兆 題目描述 輸入一行字元,分別統計出其中英文字母、空格、數字和其他字元的個數。 輸入 一行字元 輸出 統計值 樣例輸入 aklsjflj123 sadf918u324 asdf91u32oa

1011 - C語言程式設計教程(第三版)課後習題6.1

1011 - C語言程式設計教程(第三版)課後習題6.1 時間限制:1秒 記憶體限制:128兆 題目描述 輸入兩個正整數m和n,求其最大公約數和最小公倍數。 輸入 兩個整數 輸出 最大公約數,最小公倍數 樣例輸入 5 7 樣例輸出 1 35 最大公約數求法我是用的是輾轉相除法進行

1010 - C語言程式設計教程(第三版)課後習題5.8

1010 - C語言程式設計教程(第三版)課後習題5.8 時間限制:1秒 記憶體限制:128兆 題目描述 企業發放的獎金根據利潤提成。利潤低於或等於100000元的,獎金可提10%; 利潤高於100000元,低於200000元(100000<I≤200000)時,低於100000元的部

1047 - C語言程式設計教程(第三版)課後習題10.5

1047 - C語言程式設計教程(第三版)課後習題10.5 時間限制:1秒 記憶體限制:128兆 題目描述 有n人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來的第幾號的那位。 輸入 初始人數n 輸出 最後一人的初始編號 樣例輸入

1022 - C語言程式設計教程(第三版)課後習題7.1

1022 - C語言程式設計教程(第三版)課後習題7.1 時間限制:1秒 記憶體限制:128兆 題目描述 用篩法求之N內的素數。 輸入 N 輸出 0~N的素數 樣例輸入 100 樣例輸出 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47

1008 - C語言程式設計教程(第三版)課後習題5.6

1008 - C語言程式設計教程(第三版)課後習題5.6 時間限制:1秒 記憶體限制:128兆 題目描述 給出一百分制成績,要求輸出成績等級‘A’、‘B’、‘C’、‘D’、‘E’。 90分以上為A 80-89分為B 70-79分為C 60-69分為D 60分以下為E 輸入 一個整數0

1007 - C語言程式設計教程(第三版)課後習題5.5

007 - C語言程式設計教程(第三版)課後習題5.5 時間限制:1秒 記憶體限制:128兆 描述 有一個函式 y={ x x<1 | 2x-1 1<=x<10 \ 3x-11 x>=10 寫一段程式,輸入x,輸出y 輸入 一個數x 輸出 一個數y 樣例輸