久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5497|回復: 2
打印 上一主題 下一主題
收起左側

基于RTX51_TINY實時操作系統交通燈設計 附源程序原理圖

[復制鏈接]
跳轉到指定樓層
樓主
在原有的單片機交通燈控制基礎上加上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);
        }
}

51hei.png (4.21 KB, 下載次數: 124)

51hei.png

交通燈硬件.zip

843.92 KB, 下載次數: 36, 下載積分: 黑幣 -5

交通燈程序.zip

117.2 KB, 下載次數: 51, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:45225 發表于 2020-11-1 16:00 | 只看該作者
樓主辛苦了,學習一下
回復

使用道具 舉報

板凳
ID:853072 發表于 2022-4-15 15:26 | 只看該作者
不錯不錯,可以研究一下
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区二区三区不卡 | 天天干天天爱天天 | 久久草在线视频 | 国产免费一区二区三区 | 亚洲一区二区在线 | 男女午夜免费视频 | 亚洲综合色站 | 在线不卡一区 | 亚洲视频一区在线观看 | 国产精品精品久久久久久 | 毛片一级片| 91.xxx.高清在线| 日韩欧美一级片 | 成人三级网址 | 亚洲成人精品一区 | 欧美精品久久久久久久久久 | 国产粉嫩尤物极品99综合精品 | 色偷偷噜噜噜亚洲男人 | 91在线视频国产 | 国产91在线播放 | 自拍偷拍一区二区三区 | 亚洲va欧美va天堂v国产综合 | 日本久久综合网 | 91在线一区 | 国产精品视频专区 | 亚洲成人一区 | 九九热精品在线视频 | 91精品久久久久久久久 | 国产精品综合色区在线观看 | 一区二区av| 国产午夜高清 | 免费午夜视频 | 国产成人av一区二区三区 | 羞羞网站免费观看 | 97av在线| www中文字幕 | 亚洲九九 | 亚洲a视频| 91久久久久久久久久久 | 亚洲美女在线视频 | 一区二区久久 |