一直没想通 :单片机的定时计数 是否准确的问题 仰天长啸: 请高手分析 请高手分析啊

来源:百度知道 编辑:UC知道 时间:2024/06/11 07:48:24
先看哈一般单片机讲定时/计数的时候常举的一种例子:
例子:生成周期500微秒的等宽正方波。
解:分析 机器晶振6MHZ。使用T1以方式0工作,由P1.0输出 ,机器周期2微秒,定时时间250微秒。每250微秒翻转在P1.0端交替输出高低电平。
通过计算:记数初值=8067 故TH1=FCH ,TL1=03H
程序设计(查询方式):

MOV TMOD,#00H ;第1句 设置T1
MOV TH1,#0FCH ;2 计数初值
MOV TL1,#03H ;3
MOV IE,#00H ;4 禁止中断
SETB TR1 ;5 启动定时
LOOP:JBC TF1,LOOP1 ;6 查询计数溢出
AJMP LOOP ;7
LOOP1:MOV TH1,#0FCH ;8 重新设置计数初值
MOV TL1,#03H ;9
CLR TF1 ;10 清溢出标志
CPL P1.0 ;11 输出
AJMP LOOP ;12 重复循环

问题来了:
第一:当SETB TR1执行后,开始定时 到LOOP1时,表示250微秒已经到了,那8, 9,10,11句运行也要至少4个机器周期(本题花8微秒),那这样算岂不是在P1.0口输出要晚8微妙,以后每次输出的将都有问题,也不会出现整体向后推迟,而是输出的电平不是以500微秒为周期。这问题很关键,特想知道
第二:SETB TR1后,定时是一直都在加1,当溢出后等CPU处理的话,CPU也要执行到第10句的样子,那在这个时间段(有好几个微秒)它处于什么状态?
第三:请教 CPL P1.0 输出的时候

答1:确实存在这个问题,要精确的话,延时循环LOOP中就要减去后面指令执行花费的时间.如您叙述的话,在理论上周期就是516us了.
答2:"它"是指什么?CPU还是引脚还是定时器??CPU就是在执行6-10的语句.51单片机是顺序执行的,在某一时刻它只会执行一个指令.此时,引脚P1.0保持原状态(在执行CPL P1.0时改变)定时器则停止计数,处于等待状态.
答3:这里不可能那么精确了.248的时候执行也许会准确点.所谓"系统误差"吧.如果硬要抠这点时间,那只有建议更换更精确的CPU了.
答4:是的.您所想要的6us的周期,是6MHz单片机办不到的.单片机不是倍频器哦.

综述:以上解答也是本人凭空所想,可能是开黄腔的.学习单片机要以实践为准,最好搭个电路试一试,自己印象也很深刻.另外,51单片机也叫微控制器,不是拿来产生波形的,它的定时器也不会很精确的,一般应用在ms级,us级都是硬着头皮上了.况且您还只给了它6M的晶振....(换12M或24M吧)
建议更换单片机,AVR可以.CPLD/FPGA就可以有更高的频率,也可以更精确,那东西就是把晶振倍频了在分频,精确就不说了,还可以加锁相环,跑不脱的.已经超出单片机定时器的讨论范围咯....

这些问题,都可以在 KEIL 软件里面进行仿真调试。
在屏幕上清楚的看到,到底定时了多少时间,可以当场修改、解决。

你要想精确输出方波的话,最好不要用51的单片机
用AVR的吧,直接将定时匹配输出与OCRx引脚连接,
配置波形发生模式为交替取反输出,这样就不需要CPU去管了,
,直接由定时器完成波形输出的功能,则输出的方波非常准确

精确定时的时候,需要考虑指令周期和机器周期,所以定时器可以适当减少初值,来解决指令的延时问题