實驗2:small rtos51-------數碼管控制

陳明計---14.2章----proteus中仿真---記直接用模板不能運行---其實程序沒有問題。

第一步:首先在proteus中按照書中將原理圖畫好。

2第二步:首先不用操作系統驗證電路的正確性以及書中函數的正確性

                在KEIL4中編寫程序如下:

#include<reg51.h>   //包含單片機寄存器的頭文件
/****************************************
函數功能:延時一段時間
*****************************************/
sbit KdDat = P1 ^ 0;
sbit KdClk = P1 ^ 1;
sbit led1 = P1^6;
sbit led2 = P1^7;
/**********************顯示***********************************/
unsigned char const ShowTable[11] = {
      ~0x3f, ~0x06, ~0x5b, ~0x4f, ~0x66, ~0x6d, ~0x7d, ~0x07, ~0x7f, ~0x6f, ~0x00};
unsigned char const EbitData[5] = {~0x40, ~0x20, ~0x10, ~0x08, ~0x80};
void delay(void)
   {
   unsigned char i,j;
    for(i=0;i<50;i++)
   for(j=0;j<50;j++)   
     ;
   }
  
/*********************************************************************************************************
** 函數名稱: KdTxdByte
** 功能描述: 串並轉換電路驅程序
** 輸 入: 需要在並行口上出現的數據
** 輸 出: 無
** 全局變量: 無
** 調用模塊: 無
**
** 作 者: 陳明計
** 日 期: 2002年12月4日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void KdTxdByte(unsigned char KdData)
{
    unsigned char i;
   
    i = 8;
    do
    {
        KdClk = 1;
        KdData = KdData << 1;
        KdDat = CY;
        KdClk = 0;
    } while (--i != 0);
    KdClk = 1;
}
/*******************************************************
函數功能:主函數
********************************************************/
void main(void)
{
   while(1)
   {  
     unsigned char i = 0 ;
        for (i = 0; i < 5; i++)
        {
            P1 = 0xff;                      /* 關閉顯示第i位                    */
            KdTxdByte(ShowTable[i]);
            P1 = EbitData[i];               /* 顯示第i位                        */
       delay();
        }
    }

 }

3驗證程序正確性以及硬件正確性:運行效果如下表面以上函數以及原理圖無誤。

4將以上代碼移植到陳明計給的代碼中--其實就是陳明計給的Led模板事實證明模板正確

程序運行效果如下:

 

 

 

關於這次實驗:我有一點需要注意:

程序中設置的中斷是600HZ那麼就是每600HZ中斷就會把顯示任務置於運行狀態,那麼        OSWait(K_TMO,OS_TICKS_PER_SEC / 2);延時時間是多少呢?

其中OS_TICKS_PER_SEC OS_CFG中定義的是100,100/2就是50,在數碼管顯示中循環5次後又調用OSWait(K_SIG,0);那麼就是調用6次OSWait(K_SIG,0);後執行一次 OSTimeTick();。所以50*6*(1/600)S就是 OSWait(K_TMO,OS_TICKS_PER_SEC / 2);的延遲時間即0.5秒。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章