单片机定时产生脉冲串

2019-07-16 03:13发布

这是我编写的中断程序,从P2_6口产生一个脉冲串,但是偏差太大,那位帮忙看一下要改正那里,才能让偏差减小,谢了;
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
//#define zhuan 600   //如果在这里宏定义了,那么基本上可以消除一点偏差,但是如果不用宏定义,怎么改
sbit P2_6=P2^6;     
uint zhuan;
void main()
{  
EA=1;
ET0=1;
TR0=1;
TMOD=0X01;
TH0=(65536-200)/256;
TL0=(65536-200)%256;
while(1)
{
zhuan=600;
}
}
void xx() interrupt 1
{
TH0=(65536-30000/zhuan)/256;
TL0=(65536-30000/zhuan)%256;
P2_6=~P2_6;
}
PCB加工找华强电路 http://www.hqpcb.com 样板2天出货

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
wxl900306
1楼-- · 2019-07-16 04:43
也就是从P2_6产生的脉冲串的周期不对,用proteus仿真看到:经zhuan=6时可以得到ms产生一个脉冲,但是如果将zhuan=60或zhuan=600,那产生脉冲的时间是2ms一个脉冲,
PCB加工找华强电路 http://www.hqpcb.com 样板2天出货
lstcspring
2楼-- · 2019-07-16 07:45
TH0=(65536-30000/zhuan)/256;
TL0=(65536-30000/zhuan)%256;
把这两个算好,或直接定义成宏,不要在中断计算,浪费时间
3htech
3楼-- · 2019-07-16 09:13
你得明白,代码执行是需要时间的。给TH0和TL0赋值也是需要时间的。
乘除法耗时更多,使用宏定义时,看起来是乘除法,其实不是的,在编译阶段,编译器会把你的那堆算式转换成一个立即数。
如果想要精确的,就用初值重装。如果不用初值重装,那么在TL0初值很小时,使用TL0 += 初值;会避免出现你说的情况。但强烈不建议这样做!
wxl900306
4楼-- · 2019-07-16 14:47
lstcspring 发表于 2012-12-11 21:22
TH0=(65536-30000/zhuan)/256;
TL0=(65536-30000/zhuan)%256;
把这两个算好,或直接定义成宏,不要在中断计 ...

    我知道这种情况,但是我需要改变的就是进入中断的时间,并且这个时间还不是我手动的,说以没办法在宏定义里面定义
jkd_405
5楼-- · 2019-07-16 17:46
 精彩回答 2  元偷偷看……
我是舞世界
6楼-- · 2019-07-16 22:53
怎么才能把程序调用的时间考虑进行呢?

一周热门 更多>