完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 ly2 于 2014-11-29 09:23 编辑 今天写了个程序,让定时器0对10秒进行倒计时,定时器1输出一个PWM波,按下按键s6同时启动定时器0和1,等倒计时完后同时关掉定时器0和1,可是仿真时倒计时的时候会卡壳,会停止在某个数字10几秒左右,然后继续倒计时,这个停止的位置随着定时器1的赋给的初值不同而不同。。比如若是赋给90则在倒计时到2时停止10几秒。。。求高手指点迷津,谢谢,谢谢。。下面是程序 #include #define uint unsigned int #define uchar unsigned char uchar code table[]="Vst: "; uchar code table1[]="Tst: "; uchar code table2[]="Vmt: "; uchar code table3[]="Tmt: "; uchar code table4[]="0123456789"; ***it pwm=P2^2; ***it right=P2^3; ***it left=P2^4; ***it lcden=P2^1; ***it lcdrs=P2^0; ***it s6=P3^5; uchar num2=0,bai,shi,ge; uint ts,x,y,z,t,N=0; void delayms(uint z) { uint i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); } void write_com(uchar com) { lcdrs=0; P0=com; delayms(5); lcden=1; delayms(5); lcden=0; } void write_date(uchar date) { lcdrs=1; P0=date; delayms(5); lcden=1; delayms(5); lcden=0; } void keyscan() { if(s6==0) { delayms(5); if(s6==0) { while(!s6); right=1; left=0; } } } void init() { uchar n; pwm=0; right=0; left=0; ts=10; lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); for(n=0;n<6;n++) { write_date(table[n]); delayms(5); } write_com(0x80+8); for(n=0;n<6;n++) { write_date(table1[n]); delayms(5); } write_com(0x80+0x40); for(n=0;n<6;n++) { write_date(table2[n]); delayms(5); } write_com(0x80+0x40+8); for(n=0;n<6;n++) { write_date(table3[n]); delayms(5); } TMOD=0X11; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TH1=(65536-90)/256; TL1=(65536-90)%256; EA=1; ET1=1; ET0=1; } void main() { init(); while(1) { keyscan(); x=ts/100; y=ts%100/10; z=ts%10; write_com(0x80+0x40+12); write_date(table4[x]); delayms(1); write_com(0x80+0x40+13); write_date(table4[y]); delayms(1); write_com(0x80+0x40+14); write_date(table4[z]); delayms(1); if(right==1|left==1) { TR1=1; TR0=1; } if(ts==0) { TR0=0; TR1=0; right=0; left=0; } if(num2==20) { num2=0; if(ts>0) ts--; else ts=0; } if(N>=3000) N=0; if(N<=2000) pwm=1; else pwm=0; } } void T0_time() interrupt 1 { TH0=(65536-50000)/256; TL0=(65535-50000)%256; num2++; } void T1_time() interrupt 3 { TH1=(65536-90)/256; TL1=(65536-90)%256; N++; } |
|
相关推荐
16个回答
|
|
对于这种问题 你可以先把T1定时器关了 单独开T0看倒计时是否有问题 ,如果有开发板的话,也可以下到开发板上运行,毕竟仿真跟在硬件上跑还是有差别的
|
|
|
|
单独开两个都没有问题,和起来就有问题了,不是说不能倒计时了,是倒计时时中间会有卡壳,是不是中断中液晶显示程序时间太长了会影响啊? |
|
|
|
你这个液晶程序不在中断里啊,要不你设置一下中断优先级试下
|
|
|
|
|
|
|
|
不是说T0比T1高,是当T0和T1同时中断请求时,按逻辑优先级高低(外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断)会响应T0,但是未设优先级时,如果T1在中断中时是不会响应T0中断的。
|
|
|
|
这样啊,那我试试吧,非常感谢 |
|
|
|
|
|
|
|
是吗?啊,我现在正在做单片机控制直流电机的课题,right和left是用来控制电机正反转的,具体的就是https://bbs.elecfans.com/forum.p ... d=459849&extra=,这个总程序我是更早些发的,还没改,改完之后就是现在的问题了。你仿真能行了吗?计时和产生PWM波两个互不影响了吗?倒计时不会卡壳了? |
|
|
|
你把程序里的ts设置成unsigned char类型就好了
|
|
|
|
其实除了N,其他的都可以设置成char型,在编写程序的时候正确设置数据类型很重要,尤其是应用结构体,指针的时候
|
|
|
|
我改过试了,如果设置时间ts是20秒以内的话没问题了,可是如果超过20,比如30,等倒计时到10以后,后面的10、9、8.。。。每秒之间的间隔又变长了。。。可能还是那个根本原因没找出了吧 |
|
|
|
额 晚点我仿真下帮你看看
|
|
|
|
问题找到了 ,你的while语句里的这段代码
keyscan(); x=ts/100; y=ts%100/10; z=ts%10; write_com(0x80+0x40+12); write_date(table4[x]); delayms(1); write_com(0x80+0x40+13); write_date(table4[y]); delayms(1); write_com(0x80+0x40+14); write_date(table4[z]); delayms(1); 处理时间大概有70个ms左右,而你T0的中断间隔为50ms,所以在这段时间内可能发生两次中断,若这段时间内的第一次中断刚好使得num2=20,那么这段时间内的第二次中断将使得num2=21(因为程序还没执行到 if(num2==20) { num2=0; if(ts>0) ts--; else ts=0; }这段代码时又发生了一次中断),那么接下来 num2将会一直往上增加,if(num2==20)将一直不会成立,直到num2溢出。中间会有(255-20)×50ms的时间ts的值不会改变(即你描述的现象)。 处理办法:将代码if(num2==20) { num2=0; if(ts>0) ts--; else ts=0; }放入中断中即可,或者将 if(num2==20)改为 if(num2>=20). |
|
|
|
恩恩,按照你修改的结果是正确的,不过你说的那段语句我也仿真过,怎么会弄出是30ms左右呢,所以那个时候我认为它不会影响,没想到是测的时间有问题。。。。真是太感谢你了,连续的帮助我,小弟感激不尽。对了,我还想问您一个问题,接下来的部分我要做测速部分了,这一块还要用定时器,我想问,52单片机的T0T1T2三个定时器可以同时使用吗?怎么定义他们的TMOD呢? |
|
|
|
可以的 关于T2的使用,网上有大把的资料
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
238 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
629 浏览 0 评论
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
552 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
552 浏览 0 评论
1074 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11763 浏览 31 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 20:55 , Processed in 0.880411 second(s), Total 105, Slave 86 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号