51實現紅綠燈控制仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (20.4 KB, 下載次數: 112)
下載附件
2018-11-30 16:31 上傳
單片機源程序如下:
- #include <reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- //定義共陰數碼管段碼0-9
- uchar code segment[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F};
- sbit A_R = P2 ^ 0; // 定義A路的紅燈
- sbit A_Y = P2 ^ 1; // 定義A路的黃燈
- sbit A_G = P2 ^ 2; // 定義A路的綠燈
- sbit B_R = P2 ^ 3; // 定義B路的紅燈
- sbit B_Y = P2 ^ 4; // 定義B路的黃燈
- sbit B_G = P2 ^ 5; // 定義B路的綠燈
- sbit A_SEG_EN_1 = P0 ^0; // 定義A路的數碼管的第一個位的使能
- sbit A_SEG_EN_2 = P0 ^1; // 定義A路的數碼管的第二個位的使能
- sbit B_SEG_EN_1 = P0 ^2; // 定義B路的數碼管的第一個位的使能
- sbit B_SEG_EN_2 = P0 ^3; // 定義B路的數碼管的第二個位的使能
- sbit key = P0 ^ 7; // 緊急按鍵
- bit flag = 0; // 標志是否處于緊急狀態,緊急狀態flag=1
- //作用:延時 z ms
- //參數:z
- //返回值:
- void delay(uint z) // 利用不停的運行空代碼來消耗時間
- {
- uint x, y;
- for (x = z; x>0; x--)
- for (y = 110; y>0; y--);
- }
- void check_buttn()
- {
- //檢測按鍵key
- if (key == 0) // 如果按鍵被按下
- {
- delay(10); // 消抖
- if (key == 0) // 確認按鍵被按下
- {
- flag = !flag; // 緊急標志位取反
- while (!key); // 等待按鍵釋放
- }
- }
- }
- void seg_display(int numA, int numB)
- {
- P0 |= 0x7F; // 關閉所有數碼管的片選
- P3 = segment[numA/10]; // 顯示A路計時的十位
- A_SEG_EN_1 = 0; // 打開A路的十位的使能
-
- P1 = segment[numB/10]; // 顯示B路計時的十位
- B_SEG_EN_1 = 0; // 打開B路的十位的使能
- delay(5); // 延時,是數據在數碼管上停留一段時間
-
-
- P0 |= 0x7F; // 關閉所有數碼管的片選
- P3 = segment[numA%10]; // 顯示A路計時的個位
- A_SEG_EN_2 = 0; // 打開A路的個位的使能
-
- P1 = segment[numB%10]; // 顯示B路計時的個位
- B_SEG_EN_2 = 0; // 打開B路的個位的使能
- delay(5); // 延時,是數據在數碼管上停留一段時間
- }
- void display(int numA, int numB)
- {
- int i = 0;
- int temp = P2; // 保存紅綠燈的狀態
-
- for(i=0; i<50; i++)
- {
- check_buttn(); // 按鍵檢測
- if(flag) // 如果處于緊急狀態
- {
- while(flag) // 緊急狀態中
- {
- P2 = 0x09; // 將AB路都變成紅燈
- seg_display(numA, numB); // 顯示計時
- check_buttn(); // 按鍵檢測
- }
- P2 = temp; // 還原進入緊急之前的狀態
- }
- seg_display(numA, numB); // 顯示計時
- }
- }
- void main()
- {
- int j=0;
- P2 = 0; //先關閉所有的紅綠燈,為了防止剛打開仿真的時候有閃爍
- while(1)
- {
- A_G = 1;
- B_R = 1;
- for (j=10; j>=0; j--)
- display(j/2, j/2);
- P2 = 0;
-
- for (j=5; j>=0; j--)
- {
-
- A_Y = 1;
- B_R = 1;
- display(j, j+25);
-
- A_Y = 0;
- B_R = 1;
- display(j, j+25);
- }
- P2 = 0;
-
- A_R = 1;
- B_G = 1;
- for (j=25; j>=0; j--)
- display(j+5, j);
- P2 = 0;
-
- A_R = 1;
- B_Y = 1;
- for (j=5; j>=0; j--)
- display(j, j);
- P2 = 0;
- }
- }
復制代碼
所有資料51hei提供下載:
交通燈.rar
(48.19 KB, 下載次數: 228)
2018-11-30 14:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|