|
在原有的單片機交通燈控制基礎上加上RTX51 Tiny實時操作系統,使得系統更具有實時性。
RTX51 Tiny是一種實時操作系統(RTOS),可以用它來建立多個任務(函數)同時執行的應用。嵌入式應用系統經常有這種需求。RTOS可以提供調度、維護、同步等功能。
實時操作系統能靈活的調度系統資源,像CPU和存儲器,并且提供任務間的通信。RTX51 Tiny是一個功能強大的RTOS,且易于使用,它用于8051系列的微控制器。
RTX51 Tiny的程序用標準的C語言構造,由Keil C51 C編譯器編譯。用戶可以很容易的定義任務函數,而不需要進行復雜的棧和變量結構配置,只需包含一個指定的頭文件。
Altium Designer畫的PCB和原理圖:
本帖在原有的交通燈設計上加以改進為基于51tiny的交通燈設計,模擬十字路口交通燈包括時間顯示和指示燈,并且可以通過按鍵設置模式和定時時間源碼如下:
#include "stc12c5a60s2.h"
#include "rtx51tny.h"
#define uchar unsigned char
#define uint unsigned int
uchar smg[6] = {10, 10, 10, 10, 10, 10};
uchar code table1[12] = {0x77, 0x42, 0x3e, 0x5e, 0x4b, 0x5d, 0x7d, 0x46, 0xff, 0x5f, 0x00, 0x08};
uchar code table2[6] = {0xf5, 0xed, 0xdd, 0xbd, 0xfc,0x7d};
bit busy = 0; //忙標志位
uchar nb = 29; //南北時間
uchar dx = 29; //東西時間
uchar bx = 1; //南北燈切換標志
uchar bx1 = 1; //東西燈切換標志
uchar led[8] = {1,1,1,1,1,1,1,1};
uchar sw = 0; //界面切換標志
uchar turn = 10; //轉彎時間
uchar nb1 = 30;
uchar dx1 = 30;
//創建任務
void Main_task(void) _task_ 0
{
P0 = 0x00;
//P10 = 1;
//P10 = 0;
//P2 = 0x00;
//P0 = 0xff;
//P2 = 0x80;
//P2 = 0x00;
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 Smg_task(void) _task_ 1
{
static uchar i = 0;
while (1)
{
if (!busy)
{
busy = 1;
P1 = table2[ i];
P0 = table1[smg[ i]];
P12 = 1;
P12 = 0;
busy =0;
i++;
i %= 6;
}
os_wait2(K_TMO, 40);
}
}
//LED
void Led_task(void) _task_ 2
{
uchar i = 0;
while (1)
{
if (!busy)
{
busy = 1;
P11 = 1;
P00 = led[0];
P01 = led[1];
P02 = led[2];
P03 = led[3];
P04 = led[4];
P05 = led[5];
P06 = led[6];
P07 = led[7];
P11 = 0;
busy = 0;
}
if(sw == 2)
{
led[2] = !led[2];
led[6] = !led[6];
for (i=0; i<30; i++)
os_wait2(K_TMO, 200);
}
for (i=0; i<20; i++)
os_wait2(K_TMO, 200);
}
}
//按鍵
uchar Scan_Key3(void)
{
uchar value = 20;
if (P32 == 0)
{
value = 1;
}
if (P33 == 0)
{
value = 2;
}
if (P34 == 0)
{
value = 3;
}
return value;
}
//紅綠燈路口
void display_task(void) _task_ 3
{
uchar i;
while(1)
{
if (!sw)
{
smg[0] = nb / 10;
smg[1] = nb % 10;
smg[2] = dx / 10;
smg[3] = dx % 10;
if (nb >= 6 && nb == 1)
{
led[0] = 0;
P30 = 0;
}
if(nb >= 6 && nb == 0)
{
if (nb < 15 && nb > 5)
{
led[3] = 0;
}
led[1] = 0;
P31 = 0;
}
if (nb < 5)
{
led[3] = 1;
}
if(nb < 6 && nb >= 0 && bx == 1)
{
led[2] = 0;
led[0] = 1;
led[1] = 1;
led[3] = 1;
}
if (nb == 0 || nb > dx1)
{
nb = nb1;
if (bx == 1)
{
led[1] = 0;
led[0] = 1;
led[2] = 1;
P30 = 1;
bx = 0;
}
else
{
led[0] = 0;
led[1] = 1;
led[2] = 1;
led[3] = 1;
P31 = 1;
bx = 1;
}
}
if (dx >= 6 && bx1 == 0)
{
led[4] = 0;
P36 = 0;
}
if(dx >= 6 && bx1 == 1)
{
if (dx < 15 && dx > 5)
{
led[7] = 0;
}
led[5] = 0;
P37 = 0;
}
if (dx < 5)
{
led[7] = 1;
}
if(dx < 6 && dx >= 0 && bx1 == 0)
{
led[6] = 0;
led[4] = 1;
led[5] = 1;
led[7] = 1;
}
if (dx == 0 || dx > dx1)
{
dx = dx1;
if (bx1 == 0)
{
led[5] = 0;
led[6] = 1;
led[7] = 1;
led[4] = 1;
P36 = 1;
bx1 = 1;
}
else
{
led[4] = 0;
led[6] = 1;
led[7] = 1;
led[5] = 1;
P37 = 1;
bx1 = 0;
}
}
dx--;
nb--;
for (i=0; i<50; i++)
os_wait2(K_TMO, 200);
}
}
}
void Key_task(void) _task_ 4
{
uchar value;
static uchar key_value[4] = {11, 11, 11, 11};
static uchar j = 0;
while (1)
{
value = Scan_Key3();
if (value != 20)
{
while(Scan_Key3() != 20);
switch (value)
{
//設置:界面切換
case 1:
sw++;
if (sw == 1)
{
for(j = 0; j < 8;j++)
{
led[j] = 1;
}
led[2] = 0;
led[6] = 0;
}
if (sw == 2)
{
;
}
if (sw == 3)
{
led[2] = 1;
led[6] = 1;
led[1] = led[5] = 0;
}
if (sw == 4)
{
led[1] = led[5] = 1;
led[0] = led[4] = 0;
}
if (sw == 5)
{
led[0] = 1;
led[4] = 1;
key_value[0] = dx1 / 10;
key_value[1] = dx1 % 10;
key_value[2] = nb1 / 10;
key_value[3] = nb1 % 10;
}
if (sw == 6)
{
//dx = 0;
//nb = 0;
//dx1 = 0;
//nb1 = 0;
sw = 0;
led[2] = 1;
//key_value[0] = key_value[1] = key_value[2] = key_value[3] =11;
//smg[1] = smg[2] = smg[3] = smg[4] = smg[6] = smg[7] = 10;
}
break;
case 2:
if (sw == 5){
dx1++;
nb1++;
if (nb1 > 30)
{
nb1 = 30;
}
if (dx1 > 30)
{
dx1 = 30;
}
key_value[0] = nb1 / 10;
key_value[1] = nb1 % 10;
key_value[2] = dx1 / 10;
key_value[3] = dx1 % 10;
}
break;
case 3:
if (sw == 5){
dx1--;
nb1--;
if ( dx1 < 1)
{
dx1 = 1;
}
if (nb1 < 1)
{
nb1 = 1;
}
key_value[0] = nb1 / 10;
key_value[1] = nb1 % 10;
key_value[2] = dx1 / 10;
key_value[3] = dx1 % 10;
}
break;
default: break;
}
if (sw){
smg[0] = key_value[0];
smg[1] = key_value[1];
smg[2] = key_value[2];
smg[3] = key_value[3];
}
}
os_wait2(K_TMO, 200);
os_wait2(K_TMO, 200);
os_wait2(K_TMO, 200);
os_wait2(K_TMO, 200);
}
}
void toll_task(void) _task_ 5
{
while(1)
{
smg[4] = (dx1 + 10) / 10;
smg[5] = (dx1 + 10) % 10;
os_wait2(K_TMO, 200);
}
}
|
-
-
-
交通燈硬件.zip
2020-8-18 16:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
843.92 KB, 下載次數: 36, 下載積分: 黑幣 -5
-
-
交通燈程序.zip
2020-8-18 16:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
117.2 KB, 下載次數: 51, 下載積分: 黑幣 -5
評分
-
查看全部評分
|