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

標(biāo)題: 交通燈按鍵和數(shù)碼管問題 [打印本頁]

作者: 菊次郎的夏天    時間: 2017-11-20 13:53
標(biāo)題: 交通燈按鍵和數(shù)碼管問題
為何數(shù)碼管初始化不正確以及按鍵修改時間后,倒計時間不是按照修改后的走,而是按照修改前的時間倒計時?謝謝指導(dǎo)!

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

//數(shù)碼管段選定義 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;    //顯示數(shù)碼管的個位數(shù)

//數(shù)碼管位選定義
sbit smg_we1 = P2^0;        //數(shù)碼管位選定義
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;  //交通燈的模式 根據(jù)時間
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 ;     //交通管制


/***********************數(shù)碼位選函數(shù)*****************************/
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函數(shù)
* 輸入 : q
* 輸出 : 無
***********************************************************************/
void delay_1ms(uint q)
{
    uint i,j;
    for(i=0;i<q;i++)
        for(j=0;j<110;j++);
}


/********************************************************************
* 名稱 : display()
* 功能 : 數(shù)碼管顯示
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
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定時   
}

/*********************交通燈處理函數(shù)*********************************/
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)         //當(dāng)小于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)         //當(dāng)小于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))
        {                        //確認(rèn)是按鍵按下
            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;


/********************設(shè)置函數(shù)*****************/
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)      //設(shè)置鍵
    {
        menu_1 ++;
        if(menu_1 >= 3)
        {
            menu_1  = 0;
        }
    }

    if(menu_1 == 1)       //設(shè)置東西的時間
    {
        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] ;        //顯示東西設(shè)置的時候
        dis_smg[3] = smg_du[dx_time / 10] ;   
//        write_eeprom();         //保存數(shù)據(jù)   
    }   
    if(menu_1 == 2)       //設(shè)置南北的時間
    {
        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] ;        //顯示東西設(shè)置的時候
        dis_smg[1] = smg_du[nb_time / 10] ;   
//        write_eeprom();         //保存數(shù)據(jù)        
    }
}


/********************************************************************
* 名稱 : main()
* 功能 : 實現(xiàn)燈的閃爍
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
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中斷服務(wù)程序************************/
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, 下載次數(shù): 56)

就.jpg





歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: av中文字幕在线 | 日韩精品四区 | 亚洲综合天堂 | 91 久久 | 亚洲高清在线 | 欧美v在线 | 久久毛片| 日韩欧美在线一区 | 国产精品一区在线观看你懂的 | 综合久久99 | 亚洲综合在线视频 | 成人免费福利视频 | 日日天天 | 亚洲精品一区二区 | 成人一级片在线观看 | 欧美精品91 | 亚洲性在线| 亚洲午夜精品 | 精品欧美一区二区在线观看欧美熟 | 亚洲三级视频 | 欧美最猛性xxxxx亚洲精品 | 成人国产综合 | 91精品国产一区二区三区蜜臀 | 在线观看成人免费视频 | 一区在线观看视频 | 狠狠色综合欧美激情 | 国产精品污www在线观看 | 国产jizz女人多喷水99 | 夜夜撸av| 激情国产在线 | 久草中文网 | 欧美精品二区三区 | 欧美三级电影在线播放 | 91视频国产精品 | 国产精品美女久久久久久久久久久 | 在线播放中文字幕 | 亚洲欧洲精品在线 | 久久一| 国产美女黄色 | 亚洲黄色一级 | 欧美色专区 |