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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3663|回復: 0
打印 上一主題 下一主題
收起左側

交通燈按鍵和數碼管問題

[復制鏈接]
跳轉到指定樓層
樓主
為何數碼管初始化不正確以及按鍵修改時間后,倒計時間不是按照修改后的走,而是按照修改前的時間倒計時?謝謝指導!

#include <reg52.h>             //調用單片機頭文件
#define uchar unsigned char   //宏定義"uchar"代替"unsigned char"。
#define uint  unsigned int      //宏定義"uint"用來定義無符號整型數。

//數碼管段選定義 0     1    2    3       4       5    6     7      8       9   
uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
//                       A    B     C      D       E   F    不顯示
                     0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};     //斷碼   

uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};   
uchar smg_i = 4;    //顯示數碼管的個位數

//數碼管位選定義
sbit smg_we1 = P2^0;        //數碼管位選定義
sbit smg_we2 = P2^1;
sbit smg_we3 = P3^6;
sbit smg_we4 = P3^7;


char dx_s = 0;    //東西  南北 倒計時變量
sbit dx_red    = P2^4;        //東西紅燈
sbit dx_green  = P2^3;        //東西綠燈
sbit dx_yellow = P2^2;        //東西黃燈

sbit nb_red    = P2^7;        //南北紅燈
sbit nb_green  = P2^6;        //南北綠燈
sbit nb_yellow = P2^5;        //南北黃燈   

uchar flag_jtd_mode;  //交通燈的模式 根據時間
bit flag_1s = 0;
bit flag_500ms;
bit flag_dx_nb;         //東西南北模式
uchar flag_5m_value;
uchar i;
uchar flag_alarm;    //模式
uchar dx_time = 30,nb_time = 20;   //東西、南北的時間
uchar flag_jdgz ;     //交通管制


/***********************數碼位選函數*****************************/
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;
    }   
}

/********************************************************************
* 名稱 : delay_1ms()
* 功能 : 延時1ms函數
* 輸入 : q
* 輸出 : 無
***********************************************************************/
void delay_1ms(uint q)
{
    uint i,j;
    for(i=0;i<q;i++)
        for(j=0;j<110;j++);
}


/********************************************************************
* 名稱 : display()
* 功能 : 數碼管顯示
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void display()
{
    uchar i;
    for(i=0;i<smg_i;i++)
    {        
        P0 = 0xff;              //消隱
        smg_we_switch(i);        //位選
        P0 = dis_smg[i];      //段選      
        delay_1ms(3);
    }
}

/*********************定時器0、定時器1初始化******************/
void time0_init()      
{
    EA  = 1;           //開總中斷
    TMOD = 0X11;      //定時器0、定時器1工作方式1
    ET0 = 1;          //開定時器0中斷
    TR0 = 1;          //允許定時器0定時
//    ET1 = 1;          //開定時器1中斷
//    TR1 = 1;          //允許定時器1定時   
}

/*********************交通燈處理函數*********************************/
void jiaotongdeng_dis()
{
    if(flag_1s == 1)   
    {
        flag_1s = 0;
        if(dx_s == 0)
        {
            if(flag_dx_nb == 1)
                dx_s = nb_time;      //南北時間
            else
                dx_s = dx_time;      //東西時間
            flag_dx_nb = ~flag_dx_nb;
        }
        dx_s --;
    }
    dis_smg[0] = smg_du[dx_s % 10] ;
    dis_smg[1] = smg_du[dx_s / 10] ;
    dis_smg[2] = smg_du[dx_s % 10] ;
    dis_smg[3] = smg_du[dx_s / 10] ;

/***********************南北時間*********************************/
        if(flag_dx_nb == 0)  
        {
            if(dx_s > 5)
            {
                dx_red    = 1;  //滅
                dx_green  =    0;    //亮
                dx_yellow = 1;    //滅
                nb_red    = 0;  //亮
                nb_green  =    1;    //滅
                nb_yellow = 1;    //滅
                flag_5m_value = 0;   
            }else if(dx_s <= 5)         //當小于5秒時  黃燈要閃了
            {
                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;//滅   
                }
            }
        }
/***********************東西時間*********************************/
        if(flag_dx_nb == 1)  
        {
            if(dx_s > 5)
            {
                dx_red    = 0;     //亮
                dx_green  =    1;       //滅
                dx_yellow = 1;       //滅
                nb_red    = 1;     //滅
                nb_green  =    0;       //亮
                nb_yellow = 1;       //滅
                flag_5m_value = 0;   
            }else if(dx_s <= 5)         //當小于5秒時  黃燈要閃了
            {
                dx_red    = 0;     //滅
                dx_green  =    1;       //滅
                dx_yellow = 1;       //滅
                nb_red    = 1;     //滅
                nb_green  =    1;       //滅
                if(flag_500ms == 0)       //黃燈閃爍
                {
                    nb_yellow = 0;    //亮   
                }
                else
                {
                    nb_yellow = 1;    //滅   
                }
            }
    }            
}

/********************獨立按鍵程序*****************/
uchar key_can;     //按鍵值

void key()     //獨立按鍵程序
{
    static uchar key_new;
    key_can = 20;                   //按鍵值還原
    P1 |= 0x1f;
    if((P1 & 0x1f) != 0x1f)        //按鍵按下
    {
        delay_1ms(1);             //按鍵消抖動
        if(((P1 & 0x1f) != 0x1f) && (key_new == 1))
        {                        //確認是按鍵按下
            key_new = 0;
            switch(P1 & 0x1f)
            {
                case 0x1e:  key_can = 1;  break;     //得到按鍵值
                case 0x1d:  key_can = 2;  break;     //得到按鍵值
                case 0x1b:  key_can = 3;  break;     //得到按鍵值
                case 0x17:  key_can = 4;  break;     //得到按鍵值
            }
        }            
    }
    else
        key_new = 1;   
}

uchar menu_1,flag_s;


/********************設置函數*****************/
void key_with()
{
    if(key_can == 4)   //交通管制按鍵
    {
        flag_jdgz ++;
        if(flag_jdgz > 5)
            flag_jdgz = 0;   
        if(flag_jdgz == 1)     //  全部亮紅燈
        {
            dx_red    = 0;  //亮
            dx_green  =    1;    //滅
            dx_yellow = 1;    //滅
            nb_red    = 0;  //亮
            nb_green  =    1;    //滅
            nb_yellow = 1;    //滅            
        }
        if(flag_jdgz == 2)     //  東西紅燈  南北綠燈
        {
            dx_red    = 0;  //亮
            dx_green  =    1;    //滅
            dx_yellow = 1;    //滅
            nb_red    = 1;  //滅
            nb_green  =    0;    //亮
            nb_yellow = 1;    //滅            
        }
        if(flag_jdgz == 3)     //  南北紅燈  東西綠燈
        {
            dx_red    = 1;  //滅
            dx_green  =    0;    //亮
            dx_yellow = 1;    //滅
            nb_red    = 0;  //亮
            nb_green  =    1;    //滅
            nb_yellow = 1;    //滅            
        }
        if(flag_jdgz == 4)     //  南北綠燈  東西綠燈
        {
            dx_red    = 1;  //滅
            dx_green  =    0;    //亮
            dx_yellow = 1;    //滅
            nb_red    = 1;  //滅
            nb_green  =    0;    //亮
            nb_yellow = 1;    //滅            
        }
        if(flag_jdgz == 5)     //  南北黃燈  東西黃燈
        {
            dx_red    = 1;  //滅
            dx_green  =    1;    //滅
            dx_yellow = 0;    //亮
            nb_red    = 1;  //滅
            nb_green  =    1;    //滅
            nb_yellow = 0;    //亮            
        }
    }
    if(key_can == 1)      //設置鍵
    {
        menu_1 ++;
        if(menu_1 >= 3)
        {
            menu_1  = 0;
        }
    }

    if(menu_1 == 1)       //設置東西的時間
    {
        if(key_can == 2)
        {
            dx_time ++ ;
            while(key_can==0);        //加1
            if(dx_time > 99)
                dx_time = 99;
        }
        if(key_can == 3)
        {
            while(key_can==0);
            dx_time -- ;        //減1
            if(dx_time <= 10)
                dx_time = 10;
        }
        dis_smg[0] = smg_du[10] ;    //顯示為A
        dis_smg[1] = smg_du[10] ;    //顯示為A
        dis_smg[2] = smg_du[dx_time % 10] ;        //顯示東西設置的時候
        dis_smg[3] = smg_du[dx_time / 10] ;   
//        write_eeprom();         //保存數據   
    }   
    if(menu_1 == 2)       //設置南北的時間
    {
        if(key_can == 2)
        {
            nb_time ++ ;        //加1
            if(nb_time > 99)
                nb_time = 99;
        }
        if(key_can == 3)
        {
            nb_time -- ;        //減1
            if(nb_time <= 10)
                nb_time = 10;
        }
        dis_smg[2] = smg_du[11] ;    //顯示為B
        dis_smg[3] = smg_du[11] ;    //顯示為B
        dis_smg[0] = smg_du[nb_time % 10] ;        //顯示東西設置的時候
        dis_smg[1] = smg_du[nb_time / 10] ;   
//        write_eeprom();         //保存數據        
    }
}


/********************************************************************
* 名稱 : main()
* 功能 : 實現燈的閃爍
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void main()
{
    time0_init();
//    init_eeprom();     ///開機自檢eeprom初始化
    dx_s = nb_time;      //東西時間

    while(1)
    {
        key();
        if(key_can < 20)
            key_with();
//        menu_dis();
        if((menu_1 == 0) && (flag_jdgz == 0))
            jiaotongdeng_dis();
        display();   
    }
}  

/*********************定時器0中斷服務程序************************/
void time0_int() interrupt 1  
{                           
    static uchar value;             //定時10ms中斷一次
    TH0 = 0x3c;
    TL0 = 0xb0;     //50ms
    value ++;
    flag_5m_value++;
    if(flag_5m_value % 10 == 0)
        flag_500ms = ~flag_500ms;
    if(value >= 20)
    {
        value = 0;
        flag_1s = 1;
    }
}

就.jpg (140.25 KB, 下載次數: 56)

就.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧美一区二区三区1000 | 999免费网站 | 伦理一区二区 | 色综网 | 久久精品网 | 91porn国产成人福利 | 91精品国产色综合久久不卡蜜臀 | 国产免费观看一区 | 国产精品国产三级国产aⅴ入口 | 亚洲第一成人av | 欧美黄色免费网站 | 成人毛片一区二区三区 | 男插女下体视频 | 99国产精品久久久久老师 | 日韩影院在线 | 国产精品不卡一区 | 色视频在线免费观看 | 久久精选 | 色免费看 | 美女露尿口视频 | 日韩精品视频在线观看一区二区三区 | 国家aaa的一级看片 h片在线看 | 激情 一区 | 狠狠做深爱婷婷综合一区 | 在线视频成人 | 日韩一区二区三区在线观看 | 男人天堂久久久 | 国产视频一区二区 | 欧美色综合天天久久综合精品 | 精品一区二区久久久久久久网站 | 天天操天天摸天天干 | 看黄在线 | 国产a视频 | 网址黄 | 色www精品视频在线观看 | 国产日韩精品一区 | 久久国产一区二区三区 | www.狠狠干| 中文字幕日韩欧美一区二区三区 | 久久一区二区三区四区 | 日韩在线观看精品 |