久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6276|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于51單片機的智能交通燈

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:153791 發(fā)表于 2017-4-11 21:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <reg52.h>                  //調(diào)用單片機頭文件
#define uchar unsigned char   //宏定義"uchar"代替"unsigned char"。
#define uint  unsigned int          //宏定義"uint"用來定義無符號整型數(shù)。


//數(shù)碼管段選定義共陽極  給0點亮        ,給1熄滅                       
uchar code smg_du[17] = {
                          0xc0,                //0                1100 0000
                          0xf9,                //1
                          0xa4,                //2
                          0xb0,                //3
                          0x99,                //4
                          0x92,                //5
                          0x82,                //6
                          0xf8,                //7
                          0x80,                //8
                          0x90,                //9
                          0x88,                //A
                          0x83,                //b
                          0xc6,                //C
                          0xa1,                //d
                          0x86,                //E
                          0x8e                //F
                      };               
uchar dis_smg[4 ] = {0xc0,0xf5,0x8c,0x94};
//數(shù)碼管位選定義
sbit smg_we1 = P2^0;                //東西數(shù)碼管2
sbit smg_we2 = P2^1;                        //東西數(shù)碼管1
sbit smg_we3 = P2^3;                        //南北數(shù)碼管2
sbit smg_we4 = P2^2;                        //南北數(shù)碼管1
//紅綠燈位選定義
sbit nb_red    = P1^0;                    //南北紅燈
sbit nb_green  = P1^2;                    //南北綠燈
sbit nb_yellow = P1^1;                      //南北黃燈
       
sbit dx_red    = P1^3;                //東西紅燈
sbit dx_green  = P1^5;                    //東西綠燈
sbit dx_yellow = P1^4;                    //東西黃燈


bit flag = 1;                        //進入南北方向切換的標(biāo)志位
bit flag_dx_nb;                                 //東西南北模式標(biāo)志位
bit flag_500ms;
uchar time1;                       
uchar nb_time = 30,dx_time = 20;   //東西、南北的時間
uchar jdgz ;               //交通管制
uchar djs= 0;                        //東西 南北 倒計時變量


//交換一個字節(jié)的位置用于數(shù)碼管顯示
#define LED_a                6        //數(shù)碼管段選的a段接在段選IO口的第0位
#define LED_b                5
#define LED_c                0
#define LED_d                2
#define LED_e                1
#define LED_f                4
#define LED_g                3
#define LED_dp            7


  uchar ChangeFor( uchar dat)
{
         uchar temp=0;
        if(dat&0x01)                   //判斷數(shù)據(jù)的第一位是否為1
                temp|=0x01<<LED_a; //如果為1,放到控制數(shù)碼管a段的位置        ( &按位與,1&1=1 ,1&0=0 )
        if(dat&0x02)
                temp|=0x01<<LED_b;
        if(dat&0x04)
                temp|=0x01<<LED_c;
        if(dat&0x08)
                temp|=0x01<<LED_d;
        if(dat&0x10)
                temp|=0x01<<LED_e;
        if(dat&0x20)
                temp|=0x01<<LED_f;
        if(dat&0x40)
                temp|=0x01<<LED_g;
        if(dat&0x80)
                temp|=0x01<<LED_dp;
        return temp;
}
//數(shù)碼位選函數(shù) ,選擇哪一個數(shù)碼管亮
//i:        0,東西數(shù)碼管2
//                1,東西數(shù)碼管1
//                2,南北數(shù)碼管1
//                3,南北數(shù)碼管2
void smg_we_switch(uchar i)
{
        switch(i)
        {
                case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
                case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;
                case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
                case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
        }       
}
//延時函數(shù)1ms
void delay_1ms(uint q)
{
        uint i,j;
        for(i=0;i<q;i++)
                for(j=0;j<110;j++);
}
//數(shù)碼管顯示
void DisplayScan()
{
       uchar i;
        {
          {               
                 P0 = 0xff;                         //消隱 ,避免出現(xiàn)亂碼
             smg_we_switch(i);               //位選           選擇哪一個數(shù)碼管亮
             P0 =ChangeFor(dis_smg);         //段選           選擇哪一段數(shù)碼管亮
                   delay_1ms(3);                                 //延時3ms
          }
                i++;
                if(i>3)
                        i=0;
        }
}
//定時器0初始化
void time0_init()          
{
        TMOD = 0x01;                  //設(shè)置定時器0為工作模式1 (16-bit)
        TL0 = (65536-50000)%256;      //給定時器低位賦初始值        65536-15536=50000us=50ms
        TH0 = (65536-50000)/256;      //給定時器高位賦初始值
        TR0 = 1;                      //開啟定時器0
        ET0 = 1;                      //允許定時器0中斷
        EA =  1;                       //開啟全局中斷
}
//交通燈處理函數(shù)
void jiaotongdeng()
{
        if(flag == 1)                 //如果標(biāo)志位為1
        {
                flag = 0;                       //清零標(biāo)志位
                if(        djs == 0)             //倒計時變量
                {
                        if(flag_dx_nb == 1)
                        djs = nb_time;              //南北時間
                        else
                                djs= dx_time;          //東西時間
                        flag_dx_nb = ~flag_dx_nb; //切換南北時間
                }
                        djs--;
        }
        if(flag_dx_nb == 0)  //南北顯示
        {       
                if(        djs > 3)
                {
                        dis_smg[2] = smg_du[(djs-3)%10] ;              //南北數(shù)碼管2亮
                        dis_smg[3] = smg_du[(djs-3)/10] ;              //南北數(shù)碼管1亮
                        dis_smg[0] = smg_du[djs%10] ;          //東西數(shù)碼管2亮
                        dis_smg[1] = smg_du[djs/10] ;          //東西數(shù)碼管1亮


                        dx_red    = 0;  //亮
                        dx_yellow = 1;        //滅
                        nb_green  =        0;        //亮
                        nb_yellow = 1;        //滅
                        dx_green  =        1;        //滅
                        nb_red    = 1;  //滅
                        time1 = 0    ;
                }else if(djs<= 3)                 //當(dāng)小于3秒時  黃燈要閃了
                {
                        dis_smg[0] = smg_du[djs%10] ;
                        dis_smg[1] = smg_du[djs/10] ;
                        dis_smg[2] = smg_du[djs%10] ;
                        dis_smg[3] = smg_du[djs/10] ;


                        dx_red    = 0;    //滅
                        dx_green  =        1;          //滅
                        nb_green  =        1;          //亮
                        nb_red    = 1;    //滅
                        dx_yellow = 1;    //亮       
                        if(flag_500ms==0)       
                        {       
                           nb_yellow = 0;          //滅
                        }
                        else  
                         {
                           nb_yellow = 1;          //滅       
                         }               
                }
        }
        if(flag_dx_nb ==1)       //東西顯示          
        {       
                if(        djs > 3)
                {
                        dis_smg[0] = smg_du[(djs-3)%10] ;                 //        東西數(shù)碼管2亮
                        dis_smg[1] = smg_du[(djs-3)/10] ;                 //        東西數(shù)碼管1亮
                        dis_smg[2] = smg_du[djs%10] ;         //        南北數(shù)碼管2亮
                        dis_smg[3] = smg_du[djs/10] ;         //        南北數(shù)碼管1亮


                        dx_red    = 1;     //滅
                        nb_green  =        1;           //滅
                        nb_yellow = 1;           //滅
                        dx_green  =        0;           //亮
                        dx_yellow = 1;           //滅
                        nb_red    = 0;     //亮       
                        time1 = 0    ;
                }else if(        djs <= 3)                 //當(dāng)小于3秒時  黃燈要閃了
                {
                        dis_smg[0] = smg_du[djs%10] ;
                        dis_smg[1] = smg_du[djs/10] ;
                        dis_smg[2] = smg_du[djs%10] ;
                        dis_smg[3] = smg_du[djs/10] ;


                        dx_red    = 1;     //滅
                        dx_green  =        1;           //亮
                        nb_red    = 0;     //滅
                        nb_green  =        1;           //滅
                        nb_yellow = 1;           //亮       
                        if(flag_500ms==0)       
                        {       
                                   dx_yellow = 0;           //滅          
                        }
                        else  
                         {
                                   dx_yellow = 1;           //滅                 
                         }                               
                }
          }                       
}                 
//按鍵位定義
sbit Key1=P1^6;                                 //定時70s
sbit Key2=P1^7;                                 //定時60s
sbit Key3=P3^2;                                 //定時50s
sbit Key4=P3^3;                                 //交通管制鍵
//  該函數(shù)帶松手檢測,按下鍵返回一次鍵值后返回0,直至第二次按鍵按下
uchar Key_Scan()
{         
        static  uchar key_up=1;       //按鍵按松開標(biāo)志
        if(key_up&&(Key1==0||Key2==0||Key3==0||Key4==0))
        {
                delay_1ms(10);            //去抖動
                key_up=0;
                if(Key1==0)                        return 1;
                else if(Key2==0)    return 2;
                else if(Key3==0)    return 3;
                else if(Key4==0)    return 4;
        }
        else if(Key1==1&&Key2==1&&Key3==1&&Key4==1)
                key_up=1;             
        return 0;               // 無按鍵按下
}


uchar key_can;                   //按鍵值
void key_with()                           //設(shè)置函數(shù)
{
        if(key_can == 1)
            djs= 70;       
        if(key_can == 2)       
            djs= 60;       
        if(key_can ==3)
            djs= 50;                       
    if(key_can == 4)      //交通管制按鍵,緊急車輛通行
        {
                jdgz ++;
                if(jdgz > 4)
                        jdgz = 0;       
                if(jdgz == 1)         //全部亮紅燈,緊急車輛通行  
                 {
                        dx_red    = 0;  //亮
                        nb_red    = 0;  //亮
                        dx_green  =        1;        //滅
                        dx_yellow = 1;        //滅
                        nb_green  =        1;        //滅
                        nb_yellow = 1;        //滅                       
                  }
                  if(jdgz == 2)         //全部亮黃燈 ,夜間模式
                 {
                        dx_red    = 1;  //滅
                        nb_red    = 1;  //滅
                        dx_green  =        1;        //滅
                        dx_yellow = 0;        //亮
                        nb_green  =        1;        //滅
                        nb_yellow = 0;        //亮                       
                  }if(jdgz == 3)         // 南北綠燈,東西紅燈 (南北優(yōu)先通行)
                 {
                        dx_red    = 0;  //亮
                        nb_red    = 1;  //滅
                        dx_green  =        1;        //滅
                        dx_yellow = 1;        //滅
                        nb_green  =        0;        //亮
                        nb_yellow = 1;        //滅                       
                  }if(jdgz == 4)         // 東西綠燈,南北紅燈(東西優(yōu)先通行)   
                 {
                        dx_red    = 1;  //滅
                        nb_red    = 0;  //亮
                        dx_green  =        0;        //亮
                        dx_yellow = 1;        //滅
                        nb_green  =        1;        //滅
                        nb_yellow = 1;        //滅                       
                  }
        }
}
//主函數(shù)
void main()
{
        time0_init();                                 // 初始化
        djs=nb_time;
        while(1)
        {
                key_can=Key_Scan();                 //        按鍵返回值
                if(key_can )                         
                  key_with();                         //按鍵設(shè)置函數(shù)
       if(jdgz == 0)                         //無緊急按鍵按下,執(zhí)行交通燈處理
                  jiaotongdeng();                 //交通燈處理
                DisplayScan();                         //數(shù)碼管顯示
        }
}  
//定時器0中斷服務(wù)程序
void time0_int() interrupt 1  
{                                                  
    uchar time;                                  //定時中斷次數(shù)
        TL0 = (65536-50000)%256;      //給定時器低位重裝初始值 50ms       
        TH0 = (65536-50000)/256;      //給定時器高位重裝初始值
        time ++;
        time1++;
        if(time1 % 10 == 0)
                flag_500ms = ~flag_500ms;  //500ms變換一次
        if(time == 20)                                  // 20x50=1000ms=1s
        {
                time = 0;
                flag = 1;
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产欧美日韩精品在线观看 | 91精品久久久久久久久久 | 成人精品视频99在线观看免费 | 欧美在线观看一区 | 日本视频免费 | 欧美久久久| 日本一道本视频 | 久久久五月天 | 成人在线一区二区三区 | 日产精品久久久一区二区福利 | 欧美一区二区三区在线观看 | 精品成人一区二区 | 亚洲精品久久久一区二区三区 | 99国内精品久久久久久久 | 欧美激情综合 | 性一交一乱一透一a级 | 亚洲精品久久嫩草网站秘色 | 日韩av一区二区在线观看 | 日本久久网 | 午夜影院在线播放 | 亚洲一区视频 | 日韩一区二区三区精品 | 欧美成人aaa级毛片在线视频 | 日韩欧美视频在线 | 日本亚洲欧美 | 搞黄网站在线观看 | 精品国产精品国产偷麻豆 | 日韩成人在线播放 | 看一级黄色毛片 | 成人日批视频 | 精品在线一区 | 黄色三级免费 | 亚洲日韩中文字幕一区 | 99热在线观看精品 | 国产福利资源 | 国产激情一区二区三区 | 亚洲毛片在线 | 91视频a| 午夜寂寞影院列表 | 亚洲一在线| 97精品国产手机 |