打印

各位大牛能否给偶们新手 讲讲 程序时间管理?(50)

[复制链接]
1930|9
手机看帖
扫描二维码
随时随地手机跟帖
沙发
Sin90Cos90|  楼主 | 2011-3-24 20:30 | 只看该作者
void InitISR()
{
        EA =1; //允许CPU中断
        ET0 = 1; //定时器0中断打开
        TMOD =TMOD|0x1; //设定时器0为方式1
        TH0= 0xf8;
        TL0= 0xcc; //设定时值为20 000 us(1 ms)(22.1184)
        TR0 = 1; //开始定时
}

void Time0(void) interrupt 1 using 1
{
        TH0=0xf8; //1 ms断点 (1)
        TL0=0xcc; //设定时值
        STime.MScond++;

        if(STime.MScond>5)    STime.MScond_5=1;
        if(STime.MScond>40)  STime.MScond_40=1;
        if(STime.MScond>50)  STime.MScond_50=1;
        if(STime.MScond>100)STime.MScond_100=1;


}



//主函数(程序入口)
int  main(void)
{
        InitIO();
        InitUart();                     //Init UART, use to show ADC result
        InitISR();
                InitADC();                      //Init ADC sfr


        for (;;)
    {
                Show_LedMumeral();//显示
               

                if(STime.MScond_5)
                {
                        STime.MScond_5=0;
                        //下列添加用户程序
                }

                if(STime.MScond_40)
                {
                               STime.MScond_40=0;
                        //下列添加用户程序
                }

                if(STime.MScond_50)
                {
                        STime.MScond_50=0;
                                                //下列添加用户程序
                }

                if(STime.MScond_100)
                {
                        STime.MScond_100=0;
                                                //下列添加用户程序
                       
                }

    }

使用特权

评论回复
板凳
Sin90Cos90|  楼主 | 2011-3-24 20:36 | 只看该作者
数码管显示 刷新率 50HZ  电视机的刷新就是50HZ
初始化的时候MCU 内存要清除数据

任务调度 合理  才不会让费 CPU  时间!

使用特权

评论回复
地板
Sin90Cos90|  楼主 | 2011-3-24 20:41 | 只看该作者
//用户RAM 填充//摘录 农民讲习所
void Memory_Memset(unsigned char idata *pRam, unsigned char mChar, unsigned char mLen)
{
  while (mLen--)
  {
    *pRam++=mChar;
  }
}


//例子

struct InSysTimer
{
  unsigned char mT0_PreLoad;//T0 在模式0 的13 位模式下的高位初装值,用来产生系统时间用
  unsigned char mFlashOff_Count;//
  unsigned char mFlashOn_Count;//
  unsigned char mFlash_Count;   //
};

struct InSysTimer sInSysTimer;

Memory_Memset((unsigned char*)&sInSysTimer,0,sizeof(struct InSysTimer));

使用特权

评论回复
5
Sin90Cos90|  楼主 | 2011-3-24 20:48 | 只看该作者
讲讲  任务 划分  如何 把 一个复杂的任务  划分 多个任务!
串口接收// 所需时间
串口发送//所需时间
显示LED//所需时间
键盘    //所需时间
任务通讯//全局变量 传递信息。。。
一般51系列 的 系统时钟  设置多少MS 还是US?。。。

使用特权

评论回复
6
Sin90Cos90|  楼主 | 2011-3-24 20:53 | 只看该作者
但使用转BCD码时很占时间 我的 处理如下

/***************************
【功能】:BCD_DEC
【输入】: Temp
【返回】: ;
***************************/
void BCD_DEC(unsigned short  Temp)
{
  static unsigned char BuffCnt;

  BuffCnt++;//分时操作

  if(BuffCnt==30)      BufTemp[0] = (unsigned char)(Temp / 100000);
  if(BuffCnt==60)        BufTemp[1] = (unsigned char)((Temp % 100000) / 10000);
  if(BuffCnt==90)        BufTemp[2] = (unsigned char)((Temp % 10000) / 1000);
  if(BuffCnt==120)        BufTemp[3] = (unsigned char)((Temp % 1000) / 100);
  if(BuffCnt==150)        BufTemp[4] = (unsigned char)((Temp % 100) / 10);
  if(BuffCnt==180)
  {
          BufTemp[5] = (unsigned char)(Temp % 10);
          BuffCnt=0;
  }
}

使用特权

评论回复
7
acgean| | 2011-3-26 13:16 | 只看该作者
楼主的考虑非常地道.
单片机的程序写得好不好, 不是没有逻辑错误就能算好程序.
还必须得把时间管理好, 以保证对外部事件有足够快的响应.

就楼上的 FCD_DEC 程序. 这样写的效率非常低下. 坛子内有高人写了非常精练的汇编代码, 可以作为子程序来应用, 请楼上去搜索一下.

使用特权

评论回复
8
Sin90Cos90|  楼主 | 2011-3-26 13:58 | 只看该作者
就楼上的 FCD_DEC 程序. 这样写的效率非常低下. 坛子内有高人写了非常精练的 ...
acgean 发表于 2011-3-26 13:16 [/quote]
有没有精练的C?

使用特权

评论回复
9
Sin90Cos90|  楼主 | 2011-3-26 14:02 | 只看该作者
关于程序的时间安排 !一直很模糊 期望 大牛门  能指点 一 二!特别是如何 发挥CPU的 最大效率!

使用特权

评论回复
10
zjy.zz| | 2011-6-18 19:23 | 只看该作者
也是个难点了,高手会分配的很好的,新手组织的可能有点乱。都要经过这个过程的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:请教如何把笔记本显示调成 关机瞬间的黑白色! 已经问过 GOOGLE  BAIDU了无解!

0

主题

176

帖子

1

粉丝