找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 896|回复: 13
收起左侧

单片机计时系统程序调试,有一些细节我不太会,希望大家能帮忙

[复制链接]
ID:966442 发表于 2021-12-11 19:45 | 显示全部楼层 |阅读模式
这是我的要求 snipaste20211210_210102.jpg
这是我画的仿真图 snipaste20211211_193714.jpg P1.3控制数码管(用的是定时器中断判断按键是否按下),P3.2控制LED流水灯(用的是触发外部中断的方法)
我现在的代码可以让流水灯流4次,数码管能够倒计时,并且倒计时结束后可以停在数字“4”上,但是我发现倒计时的时间误差有点大,当我P1.3的按键按下的时候发现从4到3的时间有点长,这个4要等挺久才能达到3,后面才比较正常的倒计时,我感到很迷惑,还有的话,就是后续的要求,我实在是想不出有什么比较好的方法(最好能不要用到软件延时),希望大家能给我这个萌新一点思路,或者我的代码有什么需要改进的地方或者其他地方也可以提出来,感谢大家的帮助
以下是我的代码图
snipaste20211211_194207.jpg snipaste20211211_194225.jpg snipaste20211211_194236.jpg snipaste20211211_194251.jpg snipaste20211211_194302.jpg snipaste20211211_194313.jpg 2.rar (70.88 KB, 下载次数: 5)
回复

使用道具 举报

ID:966442 发表于 2021-12-12 20:32 | 显示全部楼层
这个难点就在于,这个定时器中断里有一个while循环,这个循环是为了保证数码管在倒计时结束之后能够保持住数字“4”,但是也就是因为这个while,导致我再一次按下按键时候,按键无法反映,我不知道该怎么办
回复

使用道具 举报

ID:624769 发表于 2021-12-12 22:38 | 显示全部楼层
1)  既然你知道问题在 while(1)  上面,为什么你还要用 while(1)?
2)  你把中断当什么了? 我还真没见过主程序比中断还要简洁的代码。
3)  我实在看不出来 你定时器里面 while(1)的必要, 你既然判断了 >4  那么你直接关了 ET0 不就好了 有必要 去while(1) 死在那里么?
回复

使用道具 举报

ID:966442 发表于 2021-12-13 13:27 | 显示全部楼层
188610329 发表于 2021-12-12 22:38
1)  既然你知道问题在 while(1)  上面,为什么你还要用 while(1)?
2)  你把中断当什么了? 我还真没见过主 ...

这里的定时器中断我是来处理流水灯和数码管的倒计时可能代码有点多,ET0 = 0,确实可让数码管停在数字4上,但是后续我如果想再按下去数码管重新倒计时该咋办呢
回复

使用道具 举报

ID:843335 发表于 2021-12-13 15:47 | 显示全部楼层
你想用while停在这也不是非得用while(1),你可以整个while(key2==0){...};这样再次按键的时候就跳出去了,但是这样你得在前面做一个按键的松手检测
回复

使用道具 举报

ID:966442 发表于 2021-12-13 18:06 | 显示全部楼层
wuyui 发表于 2021-12-13 15:47
你想用while停在这也不是非得用while(1),你可以整个while(key2==0){...};这样再次按键的时候就跳出去了, ...

snipaste20211213_180142.jpg 这是我想到的,起码可以让数码管在倒计时结束能保持数字4的同时,也能响应我的按键让数码管重新倒计时,就是感觉这个时间有点慢慢的
回复

使用道具 举报

ID:966442 发表于 2021-12-13 18:09 | 显示全部楼层
电子浪人 发表于 2021-12-13 13:27
这里的定时器中断我是来处理流水灯和数码管的倒计时可能代码有点多,ET0 = 0,确实可让数码管停在数字4上 ...

snipaste20211213_180142.jpg 这是我想出来的方法,不用关闭ET0,就依靠标志位去切换,基本能满足要求,就是感觉有点慢啊,确实如你所说我在中断里的代码过于臃肿,主程序过于简洁,我感觉自己就是一定要想出跟别人不太一样的方法去应对一道题,可能是把这道题想的过于难了
回复

使用道具 举报

ID:624769 发表于 2021-12-13 19:18 | 显示全部楼层
电子浪人 发表于 2021-12-13 13:27
这里的定时器中断我是来处理流水灯和数码管的倒计时可能代码有点多,ET0 = 0,确实可让数码管停在数字4上 ...

后续想重新倒计时的时候 再 ET0 = 1 啊
回复

使用道具 举报

ID:966442 发表于 2021-12-13 19:56 | 显示全部楼层
188610329 发表于 2021-12-13 19:18
后续想重新倒计时的时候 再 ET0 = 1 啊

snipaste20211213_180142.jpg 这是我在你说之前,想到的方法,不用改变ET0也可以满足要求,就是感觉有点慢慢的,我的代码有什么需要改进的地方吗
回复

使用道具 举报

ID:624769 发表于 2021-12-13 23:11 | 显示全部楼层
需要改进的就是, 中断里面只做两件事, 一,就是计数 二,就是置位标志。 其他的事情统统在主程序里面通过if(cnt2==1)  也好, 通过 if(flag2)也好进行判断后,选择性的执行。
回复

使用道具 举报

ID:161164 发表于 2021-12-14 13:15 | 显示全部楼层
1.审题要小心,评分标准4的要求是Led和数码管都要用中断,你现在只用了一个中断
2.你这系统对按键中断的要求不高,可以不用消抖
3.要求没写是正计时还是倒记时,但写了要保持N,所以正计时更方便写代码
4.如果你"想出跟别人不太一样的方法"来达到题目要求可以让代码更简洁易读,欢迎使用,但如果让代码更累赘难懂,就是画蛇添足 2021-12-14_131238.png

2021-12-14_131249.png

2021-12-14_131301.png

回复

使用道具 举报

ID:966442 发表于 2021-12-14 18:58 | 显示全部楼层
lkc8210 发表于 2021-12-14 13:15
1.审题要小心,评分标准4的要求是Led和数码管都要用中断,你现在只用了一个中断
2.你这系统对按键中断的要 ...

我一个按键是外部中断控制LED,一个按键是定时器中断控制数码管,怎么还会是只有一个呢
回复

使用道具 举报

ID:966442 发表于 2021-12-14 19:51 | 显示全部楼层
电子浪人 发表于 2021-12-14 18:58
我一个按键是外部中断控制LED,一个按键是定时器中断控制数码管,怎么还会是只有一个呢

但是你的代码给我很大的启发,非常感谢
回复

使用道具 举报

ID:994053 发表于 2021-12-24 14:03 | 显示全部楼层
看着评论我也收获不少
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表