|
、任務功能介紹: (1)四位數碼管計時,分別代表小時和分鐘(為了便于演示,可加快時間,實際是最高兩位按分鐘變動,低兩位按秒變動) (2)兩個獨立按鍵,分別對小時數,分鐘數修改(按一下加一個值) (3)東西南北四個方向分別添加紅、黃、綠交通信號燈以及兩位數碼管顯示信號燈剩余時間。
單片機源程序如下:
- #include<reg51.h>
- #include<rtx51tny.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit con=P3^2; //存儲寄存器的時鐘輸入。
- sbit snr=P2^2; //上升沿時移位寄存器中的數據進入存儲寄存器,
- sbit sng=P2^3; //下降沿時存儲寄存器中的數據保持不變。
- sbit sny=P2^4; //應用時通常將ST_CP置為低點平,
- sbit ewr=P2^5; //移位結束后再在ST_CP端產生一個正脈沖更新顯示數據。
- sbit ewg=P2^6;
- sbit ewy=P2^7;
- sbit KEY1 = P1^0;
- sbit KEY2 = P1^1;
- sbit LA=P2^0;
- sbit LB=P2^1;
- uchar minute=0;
- uchar hour=0;
- uchar code DSY_DUAN[]={0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f};
- unsigned char code tew[]={0x06,0x7f,0x06,0x07,0x06,0x7d,0x06, 0x6d,
- 0x06,0x66,0x06,0x4f,0x06,0x5b,0x06,0x06,
- 0x06,0x3f,0x3f,0x6f,0x3f,0x7f,0x3f,0x07,
- 0x3f,0x7d,0x3f,0x6d,0x3f,0x66,0x3f,0x4f,
- 0x3f,0x5b,0x3f,0x06,0x3f,0x3f,0x06,0x66,
- 0x06,0x4f,0x06,0x5b,0x06,0x06,0x06,0x3f,
- 0x3f,0x6f,0x3f,0x7f,0x3f,0x07,0x3f,0x7d,
- 0x3f,0x6d,0x3f,0x66,0x3f,0x4f,0x3f,0x5b,
- 0x3f,0x06,0x3f,0x3f,0x3f,0x4f,0x3f,0x5b,
- 0x3f,0x06,0x3f,0x3f};
- //東西方向數碼管倒計時段碼表
- unsigned char code tsn[]={0x06,0x66,0x06,0x4f,0x06,0x5b,0x06,0x06,
- 0x06,0x3f,0x3f,0x6f,0x3f,0x7f,0x3f,0x07,
- 0x3f,0x7d,0x3f,0x6d,0x3f,0x66,0x3f,0x4f,
- 0x3f,0x5b,0x3f,0x06,0x3f,0x3f,0x3f,0x4f,
- 0x3f,0x5b,0x3f,0x06,0x3f,0x3f,0x06,0x7f,
- 0x06,0x07,0x06,0x7d,0x06,0x6d,0x06,0x66,
- 0x06,0x4f,0x06,0x5b,0x06,0x06,0x06,0x3f,
- 0x3f,0x6f,0x3f,0x7f,0x3f,0x07,0x3f,0x7d,
- 0x3f,0x6d,0x3f,0x66,0x3f,0x4f,0x3f,0x5b,
- 0x3f,0x06,0x3f,0x3f};
- //南北方向數碼管倒計時段碼表
- void delay(uint t)
- {
- uchar i;
- while(t--);
- for(i=0;i>250;i++);
- }
- void job0() _task_ 0
- {
- os_create_task(1);
- os_create_task(2);
- os_create_task(3);
- os_create_task(4);
- os_create_task(5);
- os_delete_task(0);
- }
- void job1() _task_ 1 //十字路口數碼管倒計時部分
- {
- uchar i;
- SCON=0x00; //配置串口通信為方式0,八位同步移位寄存器
- con=0; //con先拉低,后拉高
- while(1)
- {
- for(i=0;i<38;i++) //每兩個數碼管倒計時部分共有76個段碼,
- //所以需要乘2才能到達下一個狀態(tài)。
- {
- SBUF=tsn[i*2]; //南北方向9-15數碼管掃描
- while(!TI);
- TI=0; //軟件清零部分;
- SBUF=tsn[i*2+1]; //南北方向1-7數碼管掃描
- while(!TI);
- TI=0;
- SBUF=tew[i*2];
- while(!TI);
- TI=0;
- SBUF=tew[i*2+1];
- while(!TI);
- TI=0; //接收完畢信號;
- con=1; //595芯片ST_CP端工作;
- os_wait(K_IVL,10,0); //延時100ms;
- con=0; //595芯片ST_CP端停止工作;
- }
- }
- }
- void job2() _task_ 2
- {
- while(1)
- {
- minute++; //分鐘加一
- if(minute==60) //分鐘滿60;
- {
- minute=0; //分鐘清零;
- hour++; //小時加一;
- if(hour==60) //小時滿60;
- {
- hour=0; //小時清零;
- }
-
- }
- os_wait(K_IVL,100,0); //延時1s;
- }
- }
- void job3() _task_ 3 //按鍵檢測
- {
- while(1)
- {
- if(P1!=0xff) //有鍵被按下;
- {
- delay(10);
-
- if(KEY1==0) //如果第一個鍵被按下,分鐘個位加一;
- {
- minute=minute%10+1;
- if(minute==60) //分鐘滿60清零
- {
- minute=0;
- }
- }
- else if(KEY2==0) //如果第二個鍵被按下,小時個位加一;
- {
- hour=hour%10+1;
- if(hour==60) //小時滿60清零
- {
- hour=0;
- }
- }
- while(P1!=0xff); //判斷抬起;
- }
- }
- }
- void job4() _task_ 4 //計時數碼管掃描程序
- {
- while(1)
- {
- LA=1,LB=1; //P2口前兩個管腳輸入
- P0=DSY_DUAN[minute%10]; //分個
- delay(500);
-
- LA=1,LB=0;
- P0=DSY_DUAN[hour%10]; //時個
- delay(500);
-
- LA=0,LB=1;
- P0=DSY_DUAN[minute/10];
- delay(500);
-
- LA=0,LB=0;
- P0=DSY_DUAN[hour/10];
- delay(500);
- }
- }
- void job5() _task_ 5 //南北方向交通燈
- {
- while(1)
- {
- snr=0;sng=1;sny=1; //南北紅,東西綠
- ewr=1;ewg=0;ewy=1;
- os_wait(K_IVL,150,0);
-
- snr=0;sng=1;sny=1; //南北紅,東西黃
- ewr=1;ewg=1;ewy=0;
- os_wait(K_IVL,10,0);
- snr=0;sng=1;sny=1; //南北紅,東西黃
- ewr=1;ewg=1;ewy=1;
- os_wait(K_IVL,10,0);
- snr=0;sng=1;sny=1; //南北紅,東西黃
- ewr=1;ewg=1;ewy=0;
- os_wait(K_IVL,10,0);
- snr=0;sng=1;sny=1; //南北紅,東西黃
- ewr=1;ewg=1;ewy=1;
- os_wait(K_IVL,10,0);
-
- snr=1;sng=0;sny=1; //南北綠,東西紅
- ewr=0;ewg=1;ewy=1;
- os_wait(K_IVL,150,0);
-
- snr=1;sng=1;sny=0; //南北黃,東西紅
- ewr=0;ewg=1;ewy=1;
- os_wait(K_IVL,10,0);
- snr=1;sng=1;sny=1; //南北黃,東西紅
- ewr=0;ewg=1;ewy=1;
- os_wait(K_IVL,10,0);
- snr=1;sng=1;sny=0; //南北黃,東西紅
- ewr=0;ewg=1;ewy=1;
- os_wait(K_IVL,10,0);
- snr=1;sng=1;sny=1; //南北黃,東西紅
- ewr=0;ewg=1;ewy=1;
- os_wait(K_IVL,10,0);
- }
- os_wait(K_IVL,100,0);
- }
復制代碼
所有資料51hei提供下載:
紅綠燈.rar
(45.99 KB, 下載次數: 69)
2018-5-5 10:11 上傳
點擊文件名下載附件
|