实验2:small rtos51-------数码管控制

来源:互联网 发布:淘宝上怎么卖药品 编辑:程序博客网 时间:2024/05/18 11:23

陈明计---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秒。

原创粉丝点击