能進入修改模式加減修改時間,可是一旦退出修改模式后,數碼管還是按照修改前的時間倒計時,時間根本就沒變的,請問需要修改哪里呢?謝謝
仿真圖.jpg (154.89 KB, 下載次數: 79)
下載附件
2017-11-23 22:55 上傳
單片機源程序:
- #include <reg52.h>
- #define uchar unsigned char
- #define u8 unsigned char
- #define uint unsigned int
- //上下南北主干道
- //左右東西輔干道
- u8 code DisplayOther[]={
- 0xff, // 空
- 0x7f, // "."
- 0xbf, // "-"
- 0xa7 // c
- };
- //數碼管段選定義 0 1 2 3 4 5 6 7 8 9 a b c d e f -
- uchar code smg_du[17] = {
- 0xc0, //0
- 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[8 ] = {0xc0,0xf5,0x8c,0x94,0xb1,0x92,0x82,0xf4};
- uchar smg_i = 4; //顯示數碼管的個位數
- //數碼管位選定義
- sbit smg_we1 = P2^0; //東西數碼管2
- sbit smg_we2 = P2^1; //東西數碼管1
- sbit smg_we3 = P2^3; //南北數碼管2
- sbit smg_we4 = P2^2; //南北數碼管1
- char dx_s = 0; //東西 南北 倒計時變量
- sbit nb_red = P1^0; //南北紅燈
- sbit nb_green = P1^2; //南北綠燈
- sbit nb_yellow = P1^1; //南北黃燈 1
- sbit dx_red = P1^3; //東西紅燈
- sbit dx_green = P1^5; //東西綠燈1
- sbit dx_yellow = P1^4; //東西黃燈1
- uchar flag_jtd_mode; //交通燈的模式 根據時間
- bit flag_1s = 1; //進入南北方向切換的標志位
- bit flag_500ms;
- bit flag_dx_nb; //東西南北模式
- uchar flag_5m_value;
- uchar i;
- uchar flag_alarm; //模式
- //uchar dx_time = 30,nb_time = 20; //東西、南北的時間
- uchar dx_time = 20,nb_time = 30; //東西、南北的時間
- uchar flag_jdgz ; //交通管制
- /********************************************************************
- * 名稱 : u8 ChangeFor(u8 dat)
- * 功能 : 交換一個字節位的位置,用于數碼管顯示
- * 輸入 : 需要改變的數
- * 輸出 : 改變后的數
- ***********************************************************************/
- #define LED_a 6 //數碼管段選的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
- u8 ChangeFor(u8 dat)
- {
- u8 temp=0;
- if(dat&0x01) //判斷數據的第一位是否為1
- temp|=0x01<<LED_a;//如果為1,放到控制數碼管a段的位置
- 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;
- }
- /***********************數碼位選函數*****************************/
- //i: 0,東西數碼管2
- // 1,東西數碼管1
- // 2,南北數碼管2
- // 3,南北數碼管1
- 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 DisplayScan()
- {
- static uchar i;
- // if(T_MS_SCAN>=3)
- {
- {
- P0 = 0xff; //消隱
- smg_we_switch(i); //位選
- P0 = ChangeFor(dis_smg[i]); //段選
- delay_1ms(3);
- }
- i++;
- if(i>=4)
- i=0;
- // T_MS_SCAN=0;
- }
- }
- /*********************定時器0、定時器1初始化******************/
- void time0_init()
- {
- TMOD = 0x01; //設置定時器0為工作模式1 (16-bit)
- TL0 = 15536; //給定時器低位賦初始值 65536-15536=50000us=50ms,即50ms一個中斷
- TH0 = 15536 >> 8; //給定時器高位賦初始值
- TR0 = 1; //開啟定時器0
- ET0 = 1; //允許定時器0中斷
- EA = 1; //開啟全局中斷
- }
- /*********************交通燈處理函數*********************************/
- void jiaotongdeng_dis()
- {
- if(flag_1s == 1)//如果切換標志為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 --;
- }
- /***********************南北時間*********************************/
- if(flag_dx_nb == 0)
- {
- if(dx_s > 3)
- {
- dis_smg[0] = smg_du[dx_s % 10] ;
- dis_smg[1] = smg_du[dx_s / 10] ;
- dis_smg[2] = smg_du[(dx_s-3) % 10] ;
- dis_smg[3] = smg_du[(dx_s-3) / 10] ;
- dx_red = 1; //滅
- dx_yellow = 1; //滅
- nb_green = 1; //滅
- nb_yellow = 1; //滅
- dx_green = 0; //亮
- nb_red = 0; //亮
- flag_5m_value = 0;
- }else if(dx_s <= 3) //當小于3秒時 黃燈要閃了
- {
- 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] ;
- dx_red = 1; //滅
- dx_green = 1; //滅
- nb_green = 1; //滅
- nb_yellow = 1; //滅
- nb_red = 0; //亮
- if(flag_500ms == 0)
- {
- dx_yellow = 0;//亮
- }
- else
- {
- dx_yellow = 1;//滅
- }
- }
- }
- /***********************東西時間*********************************/
- if(flag_dx_nb == 1)
- {
- if(dx_s > 3)
- {
- dis_smg[2] = smg_du[dx_s % 10] ;
- dis_smg[3] = smg_du[dx_s / 10] ;
- dis_smg[0] = smg_du[(dx_s-3) % 10] ;
- dis_smg[1] = smg_du[(dx_s-3) / 10] ;
- dx_red = 0; //亮
- nb_green = 0; //亮
- nb_yellow = 1; //滅
- dx_green = 1; //滅
- dx_yellow = 1; //滅
- nb_red = 1; //滅
- flag_5m_value = 0;
- }else if(dx_s <= 3) //當小于3秒時 黃燈要閃了
- {
- 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] ;
- 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; //按鍵值
- //按鍵
- sbit Key1=P1^6; //設置鍵
- sbit Key2=P1^7; //加按鍵
- sbit Key3=P3^2; //減按鍵
- sbit Key4=P3^3; //交通管制鍵
- //========================================================================
- // 函數: u8 Key_Scan()
- // 應用: temp=u8 Key_Scan();
- // 描述: 按鍵掃描并返回按下的鍵值
- // 參數: NONE
- // 返回: 按下的鍵值
- // 備注: 該函數帶松手檢測,按下鍵返回一次鍵值后返回0,直至第二次按鍵按下
- //========================================================================
- u8 Key_Scan()
- {
- static u8 key_up=1;//按鍵按松開標志
- 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 flag_s;
- uchar menu_1;//縱橫加減標示
- /********************設置函數*****************/
- void key_with()
- {
- if(key_can == 4) //交通管制按鍵
- {
- flag_jdgz ++;
- if(flag_jdgz > 5)
- flag_jdgz = 0;
- if(flag_jdgz == 1) // 全部亮紅燈
- {
- dx_red = 0; //亮
- nb_red = 0; //亮
- dx_green = 1; //滅
- dx_yellow = 1; //滅
- nb_green = 1; //滅
- nb_yellow = 1; //滅
- }
- if(flag_jdgz == 2) // 東西綠燈 南北紅燈
- {
- dx_red = 0; //亮
- nb_green = 0; //亮
- dx_green = 1; //滅
- dx_yellow = 1; //滅
- nb_red = 1; //滅
- nb_yellow = 1; //滅
- }
- if(flag_jdgz == 3) // 南北綠燈 東西紅燈
- {
- dx_green = 0; //亮
- nb_red = 0; //亮
- dx_red = 1; //滅
- dx_yellow = 1; //滅
- nb_green = 1; //滅
- nb_yellow = 1; //滅
- }
- if(flag_jdgz == 4) // 南北綠燈 東西綠燈
- {
- dx_green = 0; //亮
- nb_green = 0; //亮
- dx_red = 1; //滅
- dx_yellow = 1; //滅
- nb_red = 1; //滅
- nb_yellow = 1; //滅
- }
- if(flag_jdgz == 5) // 南北黃燈 東西黃燈
- {
- dx_red = 1; //滅
- dx_green = 1; //滅
- nb_red = 1; //滅
- nb_green = 1; //滅
- nb_yellow = 0; //亮
- dx_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 ++ ; //加1
- if(dx_time > 99) //時間最大值為99s
- dx_time = 99;
- }
- if(key_can == 3)
- {
- dx_time -- ; //減1
- if(dx_time <= 5)//時間最小值為5s
- dx_time = 5;
- }
- dis_smg[0] = smg_du[(dx_time-1) % 10] ; //顯示為A
- dis_smg[1] = smg_du[(dx_time-1) / 10] ; //顯示為A
- dis_smg[2] = DisplayOther[2] ; //顯示東西設置的時候
- dis_smg[3] = DisplayOther[2] ;
- }
-
- if(menu_1 == 2) //設置南北的時間
- {
- if(key_can == 2)
- {
- nb_time ++ ; //加1
- if(nb_time > 99)//時間最大值為99s
- nb_time = 99;
- }
- if(key_can == 3)
- {
- nb_time -- ; //減1
- if(nb_time <= 5)//時間最小值為5s
- nb_time = 5;
- }
- dis_smg[0] = DisplayOther[2] ; //顯示為B
- dis_smg[1] = DisplayOther[2] ; //顯示為B
- dis_smg[2] = smg_du[(nb_time-1) % 10] ; //顯示東西設置的時候
- dis_smg[3] = smg_du[(nb_time-1) / 10] ;
- }
- }
- /********************************************************************
- * 名稱 : main()
- * 功能 : 實現燈的閃爍
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void main()
- {
- time0_init();
- dx_s = nb_time; //東西時間
- while(1)
- {
- key_can=Key_Scan();
- if(key_can )
- key_with();
- if((menu_1 == 0) && (flag_jdgz == 0))
- jiaotongdeng_dis();
- DisplayScan();
- }
- }
- /*********************定時器0中斷服務程序************************/
- void time0_int() interrupt 1
- {
- static uchar value; //定時10ms中斷一次
- TL0 = 15536; //給定時器低位重裝初始值 65536-15536=50000us=50ms,即50ms一個中斷
- TH0 = 15536 >> 8; //給定時器高位重裝初始值
- value ++;
- flag_5m_value++;
- if(flag_5m_value % 10 == 0)
- flag_500ms = ~flag_500ms;
- if(value >= 20)
- {
- value = 0;
- flag_1s = 1;
- }
- }
復制代碼
|