這是我上個月做的代碼,
內有源代碼,
請多多指導。- #include "reg52.h"
- #include "intrins.h"
- typedef unsigned int u16;
- typedef unsigned char u8;
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- #define GPIO_DIG P0
- #define GPIO_TRAFFIC P1
- sbit RED10 = P1^0; //上人行道紅燈
- sbit GREEN10 = P1^1; //上人行道綠燈
- sbit RED11 = P1^2;
- sbit YELLOW11= P1^3;
- sbit GREEN11 = P1^4;
- sbit RED00 = P3^0; //右人行道紅燈
- sbit GREEN00 = P3^1; //右人行道綠燈
- sbit RED01 = P1^5;
- sbit YELLOW01= P1^6;
- sbit GREEN01 = P1^7;
- sbit k3=P3^2; //定義按鍵K3
- int TIME=0;
- u8 code smgduan[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰 code 代碼 編碼
- u8 DisplayData[8];//8個以上的(顯示0~F的值 一個8段的數碼管)
- /*******************************************************************************
- * 函數名 :UsartInit()
- * 函數功能 :設置串口
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- //void Usart()
- //{
- // SCON=0X50; //設置為工作方式1,sm0=0,sm1=1,sm2=0,ren=1,高位0101=0X5,低位0X00,224頁
- // TMOD=0X20; //設置計數器工作方式2 0010 178頁
- // PCON=0X80; //波特率加倍 1000 0000 SMOD=1 225頁
- // TH1=0XF3; //計數器初始值設置,注意波特率是4800的,51波特率計算
- // TL1=0XF3;
- // ES=1; //打開接收中斷 149頁ES串口中斷允許位
- // EA=1; //打開總中斷 149頁 EA : CPU的總中斷允許控制位,EA=1
- // TR1=1; //打開計數器 177頁 TR1: 定時器T1的運行控制位
- //
- //}
- void delay(u16 i)
- {
- while(i--);
- }
-
- void DigDisplay()
- {
- u8 j;
- for(j=0;j<8;j++)
- {
- switch(j) //位選,選擇點亮的數碼管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//顯示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//顯示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//顯示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//顯示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//顯示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//顯示第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//顯示第6位
- case(7):
- LSA=1;LSB=1;LSC=1; break;//顯示第7位
- }
- GPIO_DIG=DisplayData[j];//發送段碼
- delay(100); //間隔一段時間掃描
- GPIO_DIG=0x00;//消隱
-
- }
-
- }
- void Int0Init()
- {
- //設置INT0
- IT0=1;//跳變沿出發方式(下降沿)
- EX0=1;//打開INT0的中斷允許。
- EA=1;//打開總中斷
- }
- /*******************************************************************************
- * 函 數 名 : datapros()
- * 函數功能 : 數據處理轉換函數
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void datapros()
- {
- static u16 i=0;
- i++;
- if(i==5) //改變i的數值可調節跳的快慢
- {
- i=0;
- TIME ++;
- }
- DisplayData[0] = 0x00;
- DisplayData[1] = smgduan[TIME/1000000];
- DisplayData[2] = smgduan[TIME%1000000/100000];
- DisplayData[3] = smgduan[TIME%100000/10000];
- DisplayData[4] = smgduan[TIME%10000/1000];
- DisplayData[5] = smgduan[TIME%1000/100];
- DisplayData[6] = smgduan[TIME%100/10]|0x80;
- DisplayData[7] = smgduan[TIME%10];
- if(TIME==2000) TIME=0; //TIME的數值,計到2000,回0從新開始
-
- }
- void main()
- {
- Int0Init(); // 設置外部中斷0
- // Usart(); // 串口初始化
- while (1)
- {
- datapros(); //數據處理函數
- DigDisplay(); //數碼管顯示函數
- // RI=0;
- // SBUF=TIME;
- if(TIME>1000)
- {
- GPIO_TRAFFIC = 0xFF; //將所有的燈熄滅
- RED00 = 1;
- GREEN00 = 1;
- GREEN11 = 0; //寶田路綠燈亮
- GREEN10 = 0; //寶田路人行道綠燈亮
- RED01 = 0; //前進路紅燈亮
- RED00 = 0; //前進路人行道紅燈亮
- }
- else
- {
- GPIO_TRAFFIC = 0xFF; //將所有的燈熄滅
- RED00 = 1;
- GREEN00 = 1;
- YELLOW11 = 0; //寶田路黃燈亮
- RED10 = 0; //寶田路人行道紅燈亮
- YELLOW01 = 0; //前進路紅燈亮
- RED00 = 0; //前進路人行道紅燈亮
- }
- }
-
-
- }
- void Int0() interrupt 0 //外部中斷0的中斷函數
- {
- delay(1000); //延時消抖
- if(k3==0)
- {
- TIME=520;
- }
- }
復制代碼
|