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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5055|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

RTX51tiny復(fù)雜應(yīng)用---時(shí)鐘、溫度顯示、按鍵解析 源程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:79874 發(fā)表于 2020-2-2 19:23 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
一、設(shè)計(jì)需求


在清翔51單片機(jī)開發(fā)板上,用帶RTOS的方式實(shí)現(xiàn)下面的功能:


1. 板上有8個(gè)段碼LED,左邊的4個(gè)做一個(gè)計(jì)時(shí)器,顯示“MSS.Z”,其中M為分鐘,SS為秒,Z為n×0.1秒;右側(cè)的4個(gè),其中3個(gè)顯示從18B20采集的實(shí)時(shí)溫度,最后1個(gè)顯示鍵盤的按鍵值,按鍵延時(shí)顯示按鍵0.3秒(也就是松開按鍵之后還繼續(xù)顯示0.3秒);


2. 在板上的LCD1602上,構(gòu)建一個(gè)HH:MM:SS 時(shí)分秒的鐘表,同時(shí)將DS18B20的轉(zhuǎn)換結(jié)果也顯示在這里。


二、題目分析


面對(duì)一個(gè)復(fù)雜的題目,我們需要逐步實(shí)現(xiàn)需要的功能。先實(shí)現(xiàn)一個(gè)獨(dú)立的功能,然后再增加功能,慢慢就能達(dá)到完整的要求。在實(shí)現(xiàn)獨(dú)立功能的時(shí)候要考慮代碼的可綜合性,要盡量構(gòu)建易于被調(diào)用的函數(shù),在后期將會(huì)大大方面我們的綜合優(yōu)化。


編寫代碼的時(shí)候,盡量養(yǎng)成良好的習(xí)慣。對(duì)于一個(gè)龐大的工程,其必定可以分割為很多小模塊。本題中用到了數(shù)碼管、LCD1602、DS18B20、矩陣鍵盤這些外設(shè),我們可以單獨(dú)構(gòu)建這些模塊的驅(qū)動(dòng)函數(shù),后面再加以綜合。


在創(chuàng)建好RTOS工程之后,在工程文件夾下再創(chuàng)建一個(gè)hardware文件夾,然后在這個(gè)文件夾里為每個(gè)外設(shè)都創(chuàng)建一個(gè)文件夾,如下圖所示。






每一個(gè)外設(shè)都對(duì)應(yīng)一個(gè)C文件和H文件,這兩個(gè)文件放置在各自的文件夾中。這里還需要注意在keil中需要將這幾個(gè)文件夾添加到編譯路徑中,要不然軟件找不到H文件。在option中的incliude path處添加需要的路徑。


做完這些準(zhǔn)備工作后,我們就可以來分模塊來構(gòu)建我們的代碼了。


三、模塊分析


3.1 數(shù)碼管


3.1.1 數(shù)碼管顯示函數(shù)


在使用的51開發(fā)板上,一共有8個(gè)數(shù)碼管。這里我們可以編寫一個(gè)函數(shù),讓其每一位可以單獨(dú)顯示任意數(shù)字。入口參數(shù)即為每一位要顯示的數(shù)字,后面需要用到顯示的地方,只需要傳入對(duì)應(yīng)的變量即可。比如構(gòu)造如下的函數(shù):


void play_SMG(unsigned char led7,led6,led5,led4,led3,led2,led1,led0);


在實(shí)際使用的時(shí)候,比如想讓數(shù)碼管顯示1234567,就只需這樣寫:play_SMG(1,2,3,4,5,6,7)。一般我們都是要求數(shù)碼管動(dòng)態(tài)顯示的,這時(shí)我們把對(duì)應(yīng)的變量傳入相應(yīng)的位置即可。


函數(shù)內(nèi)部的詳細(xì)代碼比較簡單參見附錄。


3.1.2 數(shù)碼管閃爍問題


使用RTOS的時(shí)候,由于程序是輪循執(zhí)行的。假如在一個(gè)任務(wù)中讓數(shù)碼管顯示,就存在兩個(gè)問題。


輪循時(shí)間間隔太短,數(shù)碼管來不及全部顯示。
任務(wù)數(shù)量太多,下一次顯示間隔太長。
這里要搞清楚輪循的時(shí)間怎么計(jì)算。輪循時(shí)每個(gè)任務(wù)執(zhí)行的時(shí)間是固定的,這個(gè)時(shí)間具體可以通過INT_CLOCK和TIMESHARING相乘得到。默認(rèn)的INT_CLOCK = 10000,TIMESHARING = 5。也就是每個(gè)任務(wù)執(zhí)行時(shí)間為50ms。


不光是數(shù)碼管,每個(gè)任務(wù)在執(zhí)行的時(shí)候都存在這個(gè)問題。在調(diào)試數(shù)碼管的時(shí)候,會(huì)發(fā)現(xiàn)閃爍嚴(yán)重,就是上面兩個(gè)因素的影響。相比之下,后者影響更大。假如有4個(gè)任務(wù),按照默認(rèn)的時(shí)間片設(shè)定,每次顯示之后就要等待至少150ms。這個(gè)間隔內(nèi)數(shù)碼管是不顯示的,就會(huì)看到數(shù)碼管間歇性亮,或者很晃眼。


這時(shí)候可以通過更改時(shí)間片來獲得比較好的顯示效果。


3.2 時(shí)鐘


3.2.1 產(chǎn)生時(shí)間基準(zhǔn)


我們可以通過讓數(shù)碼管顯示一個(gè)時(shí)鐘來驗(yàn)證我們的函數(shù)正確性,同時(shí)這也是題目要求的一部分。


對(duì)于時(shí)鐘的構(gòu)建,可以先設(shè)定一個(gè)最小的時(shí)間基準(zhǔn),比如100ms,每個(gè)100ms對(duì)應(yīng)的變量自加一次。10個(gè)100ms之后即1s的時(shí)候,代表秒的變量自加一次。當(dāng)秒個(gè)位加到9的時(shí)候,十位加一,當(dāng)59秒的時(shí)候再過1秒,秒清零同時(shí)分的個(gè)位加一……,這個(gè)過程寫起來比較繁瑣,需要細(xì)心不要搞錯(cuò)了。


這里的主要問題是怎么產(chǎn)生100ms的時(shí)間間隔。我們可以在一個(gè)任務(wù)中產(chǎn)生我們的時(shí)鐘。100ms的間隔用延時(shí)函數(shù)來產(chǎn)生。


關(guān)于RTOS的延時(shí),系統(tǒng)中給了os_wait2( ),這個(gè)函數(shù)有兩個(gè)輸入?yún)?shù),詳細(xì)可以看幫助文檔。這里需要注意一個(gè)tick代表多長時(shí)間,這個(gè)可以在Conf_tny.51文件中查看,通過INT_CLOCK的值來計(jì)算,默認(rèn)值為10000,如果使用12M的晶振,那么這里就是10ms,也就是說如果我們寫了os_wait2( K_TMO,1),就是代表延時(shí)10ms。我們會(huì)發(fā)現(xiàn)這里最小的延時(shí)單位只能是10ms。可以更改INT_CLOCK的值來減小延時(shí)單位長度。這里我將INT_CLOCK的值改為了1000,那么一個(gè)延時(shí)單位就是1ms。需要注意,os_wait2( )中的參數(shù)類型是unsigned char,意味著我們最大只能寫255,如果需要更長的延時(shí),可以通過for循環(huán)來構(gòu)建。


3.2.2 時(shí)鐘顯示


定義用來表示時(shí)鐘的變量:uchar H1,H0,M1,M0,S1,S0,Z;


H、M、S分別為時(shí)分秒,Z為n×0.1秒。時(shí)鐘的產(chǎn)生比較簡單,就是需要的邏輯性比較強(qiáng),詳細(xì)的代碼參見附錄。


然后如下編寫job0的代碼:


void job0 (void) _task_ 0

{

    os_create_task (1);

    while (1)

    {

          play_SMG(M0,S1,S0,Z,0,0,0,0);     

    }

}
可以看到前四個(gè)數(shù)碼管顯示了計(jì)時(shí)器的值,后四個(gè)數(shù)碼管一直顯示0。這說明我們的代碼是沒有問題的。對(duì)于時(shí)鐘的產(chǎn)生,這里采用了比較直觀的方式去產(chǎn)生,易于理解,但是寫起來需要注意代碼的邏輯性。我們也可以嘗試使用更簡潔的方式去構(gòu)建。


通過這個(gè)過程我們也可以發(fā)現(xiàn)代碼的綜合其實(shí)并不難,就是一步一步添加功能的過程。


3.3 鍵盤顯示


3.3.1 矩陣鍵盤掃描


矩陣鍵盤掃描的函數(shù)有很多,它的原理網(wǎng)上也講的很多,不再贅述。


很多時(shí)候我們要做的并不是自己如何去寫一個(gè)器件的驅(qū)動(dòng)程序,是如何把別人拿過來用?炊畡e人的代碼,可以改善并融合到自己的程序中是最好的。


假如現(xiàn)在手頭有一個(gè)鍵盤掃描的代碼,當(dāng)檢測到某個(gè)按鍵按下的時(shí)候會(huì)返回一個(gè)值,不同的按鍵按下有不同的返回值。該怎么將其加入到我們的代碼中呢?


這里可以創(chuàng)建一個(gè)任務(wù)用來進(jìn)行按鍵檢測,并創(chuàng)建一個(gè)變量key用來表示按鍵值。通過不同的按鍵返回值來給key進(jìn)行賦值。截取部分代碼如下:


void keys (void) _task_ 3

{

    while (1)

    {

        switch( KeyScan() )

        {

            //第一行鍵值碼

            case 0xee: key = 0;       break;

            case 0xde: key = 1;       break;

            case 0xbe: key = 2;       break;

            case 0x7e: key = 3;       break;

            ……

        }

    }

}
在任務(wù)三中key的值將根據(jù)按鍵的值改變。接下來我們只需要將按鍵的值送給數(shù)碼管顯示即可。play_SMG(M0,S1,S0,Z,0,0,0,key),將key放在數(shù)碼管顯示函數(shù)的最后一位。這樣我們又完成了一個(gè)功能的添加,也沒有改變程序原本運(yùn)行的狀態(tài)。


3.3.2 清除按鍵顯示


在題目中要求按鍵延時(shí)顯示按鍵0.3秒(也就是松開按鍵之后還繼續(xù)顯示0.3秒);也就是在手松開0.3秒之后要清除顯示。


這里可以設(shè)置一個(gè)標(biāo)志位flag,當(dāng)按鍵按下的時(shí)候讓flag置1,并且延時(shí)300ms后將flag清0。這樣我們就可以通過flag的狀態(tài)判斷按鍵有沒有按下,并且flag是滯后于手松開300ms刷新的。具體的代碼如下:


unsigned char KeyScan() //帶返回值的子函數(shù)

{

   unsigned char i;

      unsigned char cord_l,cord_h;//聲明列線和行線的值的儲(chǔ)存變量

      P3 = 0x0f;//0000 1111

      if( (P3 & 0x0f) != 0x0f)//判斷是否有按鍵按下

      {

        os_wait2(K_TMO,5);//軟件消抖

             if( (P3 & 0x0f) != 0x0f)//判斷是否有按鍵按下

             {

                      cord_h = P3 & 0x0f;// 儲(chǔ)存行線值

                      P3 = cord_l | 0xf0;

                      cord_l = P3 & 0xf0;// 儲(chǔ)存列線值

            flag = 1;

            return (cord_l + cord_h);//返回鍵值碼                    

             }   

      }

    if(flag)

    {

        for(i = 0; i < 3; i++)

        {


^^^^^
keil工程下載地址:
RTOS復(fù)雜應(yīng)用.zip (100.71 KB, 下載次數(shù): 114)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:65956 發(fā)表于 2020-2-4 21:13 | 只看該作者
我也曾在幾個(gè)項(xiàng)目中用過,但沒有這么復(fù)雜,就是要搞清邏輯就可以了,把各個(gè)要執(zhí)行函數(shù)分配到任務(wù)中,注意任務(wù)時(shí)間的區(qū)別與錯(cuò)開,這樣就不會(huì)沖突了

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:92004 發(fā)表于 2020-4-1 13:35 | 只看該作者
18b20中仍就用到了delay等待,沒有用到 os_wait

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:902133 發(fā)表于 2021-5-23 00:06 | 只看該作者
我的IIC傳感器效率較低,同時(shí)還要處理通訊需求,不指導(dǎo)可不可以用。
回復(fù)

使用道具 舉報(bào)

5#
ID:28992 發(fā)表于 2021-5-23 01:57 | 只看該作者
thank you sir!
回復(fù)

使用道具 舉報(bào)

6#
ID:929300 發(fā)表于 2021-5-29 22:55 | 只看該作者
18b20延時(shí)怎么保證數(shù)碼管不閃
回復(fù)

使用道具 舉報(bào)

7#
ID:527324 發(fā)表于 2021-8-3 16:17 | 只看該作者
多任務(wù)讀寫25芯片咋弄啊
回復(fù)

使用道具 舉報(bào)

8#
ID:140644 發(fā)表于 2022-10-12 11:03 | 只看該作者
先下了看看,等一下試試能不能編譯
回復(fù)

使用道具 舉報(bào)

9#
ID:1134130 發(fā)表于 2024-10-20 12:12 | 只看該作者
wizarder 發(fā)表于 2020-4-1 13:35
18b20中仍就用到了delay等待,沒有用到 os_wait

因該可以直接用os_wait替換
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品自拍视频 | 午夜影院在线观看免费 | 国产视频久久久 | 中文字幕精品一区二区三区精品 | av片网| 欧美爱爱视频 | 国产美女视频一区 | 精品欧美一区二区三区久久久 | 免费在线一区二区三区 | 蜜桃av人人夜夜澡人人爽 | 国产精品久久久久久久久久妇女 | 高清国产午夜精品久久久久久 | 亚洲一区二区三区观看 | 日韩在线观看一区二区三区 | 成人国产精品久久久 | 日韩欧美在线视频一区 | 久久久久亚洲精品 | 欧美成人a | 午夜精品 | 99久久精品国产毛片 | 99精品久久| 一级在线观看 | 亚洲欧美一区二区三区国产精品 | 天天爽夜夜爽精品视频婷婷 | 欧美日韩国产一区 | 极品的亚洲 | 欧美一二三区 | 亚洲v区| 国产欧美视频一区 | 亚洲精品v| 激情av| 精品毛片| 欧美日韩精选 | 国产91丝袜在线播放 | 成人免费大片黄在线播放 | 超碰天天 | 日本久久久一区二区三区 | 成人福利网 | 亚洲精品久久国产高清情趣图文 | 欧美九九九 | 亚洲久久在线 |