完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
这是我编写的中断程序,从P2_6口产生一个脉冲串,但是偏差太大,那位帮忙看一下要改正那里,才能让偏差减小,谢了;
#include #define uint unsigned int #define uchar unsigned char //#define zhuan 600 //如果在这里宏定义了,那么基本上可以消除一点偏差,但是如果不用宏定义,怎么改 ***it 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个回答
|
|
也就是从P2_6产生的脉冲串的周期不对,用proteus仿真看到:经zhuan=6时可以得到ms产生一个脉冲,但是如果将zhuan=60或zhuan=600,那产生脉冲的时间是2ms一个脉冲,
PCB加工找华强电路 http://www.hqpcb.com 样板2天出货 |
|
|
|
TH0=(65536-30000/zhuan)/256;
TL0=(65536-30000/zhuan)%256; 把这两个算好,或直接定义成宏,不要在中断计算,浪费时间 |
|
|
|
你得明白,代码执行是需要时间的。给TH0和TL0赋值也是需要时间的。
乘除法耗时更多,使用宏定义时,看起来是乘除法,其实不是的,在编译阶段,编译器会把你的那堆算式转换成一个立即数。 如果想要精确的,就用初值重装。如果不用初值重装,那么在TL0初值很小时,使用TL0 += 初值;会避免出现你说的情况。但强烈不建议这样做! |
|
|
|
定义两个uchar timer_h,timer_l;
while(1)//循环里计算 { zhuan=600; timer_h=(65536-30000/zhuan)/256; timer_l=(65536-30000/zhuan)%256; } void xx() interrupt 1//中断里直接赋值 { TH0=timer_h; TL0=timer_l; P2_6=~P2_6; } |
|
|
|
怎么才能把程序调用的时间考虑进行呢?
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2024年上海海思MCU开发者体验官招募,手机/MatePad大奖等你拿!
1306 浏览 0 评论
【xG24 Matter开发套件试用体验】蓝牙控制板载LED
953 浏览 0 评论
1178 浏览 0 评论
电赛:mspm0l1306的开发板可以烧录程序,但是程序运行不了,怎么解决这个问题?
1223 浏览 1 评论
【xG24 Matter开发套件试用体验】Silicon Labs 基于 EFR32MG24 Explorer Kit 开发板 开箱试用体验
937 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
10552 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-8 17:23 , Processed in 0.668925 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191