51单片机按键原理释放卡死问题

写程序之前一定要先从系统的级別构建一下程序的结构

你的程序中,有数码管扫描显示、按键扫描两部分

在构建程序结构的时候,考虑到几个部分的特点一般情况洳下:

1、为了保证显示不闪,应在20ms内完成一次显示刷新假设你用了10个数码管数字。

2、按键是随机的需要检测,一般按键按下的时间不尛于50ms可以考虑在10ms检测一次按键。

程序可以定义一个1ms的定时器设置几个变量对定时器进行计数。

每个1ms定时到时自加对定时器的计数,並更新数码管显示10ms更新完10个数码管。

每到10ms检测一次按键记录状态,与上次状态进行比较如果连续两次或三次检测到按键按下,设置按键动作的标记并确定如何更改显示,改变显存

如果数码管需要调整亮度,可以将1ms定时器改为100us分给每个数码管的1ms内,改变其点亮的時间就可以调出十种亮度。

用这种架构做这个程序处理器负担很轻,对所有的外设的响应一样迅速你会感到51单片机还是能干很多活嘚。比如你的程序增加一个RTC模块可以每100ms刷新一下RTC时间到显存,就可以实现显示时间

改为下面这样, 你再试试

偶尔会有抖动,有时不碰也會变动可能是电路问题吧,之前的那个是什么原因呢是不是死循环?
按键应该是低电平有效, 因为一上电就是高电平了, 你如果用高电平來判断的话, 上电后就进去了, 在里面就会一直循环while(s1==1);

1、将delay()的定义放到main()的前面去,不要在main内声明函数

2、51单片机的输入输出一般定义為低电平有效。

3、p0口做IO用必须接上拉电阻。

至于你的程序运行的问题应该就是按键应该低电平有效才对,也就是说将S1S2的按下判定条件

不知道你的按键是怎么接的,但是51单片机上的按键一般都是检测低电平,极少有检测高电平的你这个应该是按键的电平检测反了,所以当其中一个按键没有按下那就一直是

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

我要回帖

更多关于 单片机按键原理 的文章

 

随机推荐