打印

定时器0在模式1时(16位定时器)的疑问

[复制链接]
877|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
spl928|  楼主 | 2016-12-16 21:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 spl928 于 2016-12-16 22:02 编辑

程序大概含义:AD芯片采集电压数据,然后送到串口调试助手上显示,用的STC12系列的单片机
波特率设置的是9600bps,程序没什么问题;
但是串口调试助手的接收区显示太快了,想用定时器0延时一下,
可是在定时的时候如果写成 if(count=72),则接收区显示的速度还是很快,基本上没什么变化。可我改成 if(count>=72)的时候,就可以了,显示的速度立马变慢了。
网上找了下,说是=太严格了,要改成>=,
哪位前辈能说下原因吗?
延时程序如下所示,别的没贴出来,但是不影响的:
//定时器中断程序
void Timer0_init()
{
    TMOD=0x01;  //定时器0,模式1,16位定时器   
    TR0=1;
    TH0=(65535-50000)/256;   //高8位,=60
    TL0=(65536-50000)%256;  //低8位
    ET0=1;  //使能定时器0中断
    EA=1;   //开总中断
}
void timer0() interrupt 1
{
  TH0=(65536-50000)/256;
  TL0=(65535-50000)%256;  //50000*(11.0592/12)ms定时,若晶振为12MHz,则为50ms
  count++;
   if(count>=72)   //特别注意,此处若写成=时,收发速度还是非常快,why???
    {
        count=0;
        ADFlag=1;
     }
}
void main()
{
        unsigned char str[3];
        long AD_temp,kk;
               
        Timer0_init();
        uart_init();
        while(1)
        {
                                EA=0;
                                AD_temp=Read_PCF8591_ADC();
                          EA=1;
                          kk=AD_temp*5*100/256;
                                bai=kk/100+0x30;
                                shi=kk%100/10+0x30;
                                ge=kk%10+0x30;
                          str[0]=bai;
                                str[1]=shi;
                                str[2]=ge;
                   if(ADFlag)
                     {
                          ADFlag=0;
                          uart_printf(str);
                          uart_printf(" \r\n");
                        }
   }



相关帖子

沙发
autooy| | 2016-12-16 22:58 | 只看该作者
if(count=72)
你本意应该要写成:   if(cunt == 72)
一个是赋值,一个是比较!完全不同的表达式!
从理论上讲,==72也是没有问题的,严格来说>=肯定更好!

使用特权

评论回复
板凳
sunlin0316| | 2016-12-17 18:51 | 只看该作者
你的 T0设置吧TR0开启的过早,还没有对TH0赋值,就启动了,你把TR0开启放到初始化最后。。。

使用特权

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

本版积分规则

2

主题

44

帖子

5

粉丝