社区
单片机/工控
帖子详情
单片机C编程 按键一下暂停再按一下继续,不用中断
deitydeSHIN
2012-07-01 01:21:18
主要的问题,应该是 抖动,
在 按键 按一下的时候,比如说P1_2==0.
但是 再 按一下 继续的时候,可能因为 按下去的时间过长,又进入到这个 函数里了。就死循环了。
if(P1_2==0)
{
while(1)
{
if(P1_2) ;//继续
}
}
怎么 解决 死循环问题?
...全文
3804
12
打赏
收藏
单片机C编程 按键一下暂停再按一下继续,不用中断
主要的问题,应该是 抖动, 在 按键 按一下的时候,比如说P1_2==0. 但是 再 按一下 继续的时候,可能因为 按下去的时间过长,又进入到这个 函数里了。就死循环了。 if(P1_2==0) { while(1) { if(P1_2) ;//继续 } } 怎么 解决 死循环问题?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wangxiaofengq5
2012-08-12
打赏
举报
回复
这就是一个死循环
aydf1
2012-08-12
打赏
举报
回复
如果P1_2==0 是按下的话,在死循环里如果P1_2 没有变化,仍然是0(按下),则再次循环,直到为1(抬起),抬起后执行if语句里的代码,这里面当然应该有一个跳出循环的语句。
xgbing
2012-08-12
打赏
举报
回复
如果用户按下键不放会有问题,最好改为用户按下键再弹起为一次输入
int isPressed()
{
int i=0, j=0;
while(1)
{
if(i <= 50)
i++; //计数
if(P1_2==1)
{
for(j = 0; j < 50 && P1_2==1; j++);
if(j >= 50)
break;
}
}
if(i > 50)
return(1);
else
return(0);
}
xgbing
2012-08-12
打赏
举报
回复
int isPressed()
{
int i=0;
while(P1_2==0)
{
i++; //计数
if(i > 50)
return(1); //计数超过50就认为键按下了;不超过,就认为是抖动
}
return(0);
}
void main()
{
int press = 0;
while(1)
{
if(isPressed())
{
press++;
if(press == 1) //第一次按下是暂停
{
//调用暂停函数
}
else if(press == 2) //第二次按下是继续
{
//调用继续函数
press = 0; //重新置为初始值
}
}
}
}
tangjs208
2012-08-12
打赏
举报
回复
可以考虑加个超时处理
Seong2020
2012-08-01
打赏
举报
回复
这根本就是一个死循环程序,一旦有按键按下,不管按下去的时间长或短,程序都会进入while死循环,永远跳不出来的。
help_wei
2012-07-30
打赏
举报
回复
可以试试这样,严格来说去抖是一定要的,不管是什么场合:
char flag=0;
while(flag==0)
{
if(P1_2==0)flag=1;
else break;
}
while(flag==1)
{
if(P1_2==0)
{
flag=0;
break;//继续
}
}
lbing7
2012-07-05
打赏
举报
回复
while(!P1_2)
{
}
IO直接作为循环条件即可
空影
2012-07-05
打赏
举报
回复
[Quote=引用 2 楼 的回复:]
break能跳出while吗?
[/Quote]break可以跳出while ,for ,switch
galle
2012-07-05
打赏
举报
回复
增加一个按键的标志位就可以解决了!
没有按下为0,按下为1,
每次要判断按键的时候结合标志位进行。
xufeng0218
2012-07-03
打赏
举报
回复
break能跳出while吗?
jianxuanzi
2012-07-01
打赏
举报
回复
这个代码看起来不像是解决再按下一次按键的问题吧,应该是检查按下后抬起的问题的。
如果P1_2==0 是按下的话,在死循环里如果P1_2 没有变化,仍然是0(按下),则再次循环,直到为1(抬起),抬起后执行if语句里的代码,这里面当然应该有一个跳出循环的语句。
[蓝桥杯竞赛资源]CT107D
单片机
实训平台实验例程
蓝桥杯竞赛资源中关于CT107D
单片机
实训平台的实验例程可能涵盖了多个方面,旨在帮助参赛者熟悉和掌握
单片机
的
编程
和应用。以下是一些可能的实验例程及其内容概述: (1)
按键
控制实验: 目的:学习如何使用
单片机
的IO口读取
按键
状态,并根据
按键
状态执行相应的操作。 内容:通过编写程序,检测独立
按键
的按下和释放状态,进而控制LED灯的亮灭或其他设备的动作。例如,可以实现
按键
控制LED灯的闪烁频率或模式。 (2)定时器与
中断
编程
实验: 目的:掌握定时器的配置和使用,以及
中断
服务程序的编写。 内容:包括设置特殊功能寄存器以配置定时器的工作模式,初始化计数寄存器的初值,以及编写
中断
服务函数来处理定时溢出事件。通过定时器实验,可以学习如何实现定时控制,如定时点亮LED灯或触发其他事件。 (3)秒表实验: 目的:在CT107D
单片机
综合训练平台上,设计一个具有清零、
暂停
、启动功能的秒表。 内容:利用定时器T0、数码管模块和独立
按键
,实现秒表的计时、显示和控制功能。独立
按键
用于控制秒表的启动、
暂停
和清零操作,数码管用于显示当前的时间。
单片机
课程设计--00-99计数器的设计.doc
单片机
课程设计 题 目 00~99计数器的设计 1 课程设计的目的 (1) 利用
单片机
定时器/计数器
中断
设计秒表,从而实现秒、十分之一秒的计时。 (2) 综合运用所学的《
单片机
原理与应用》理论知识,通过实践加强对所学知识的理解,具备 设计
单片机
应用系统的能力。 (3) 通过本次课程设计加深对
单片机
掌握定时器、外部
中断
的设置和
编程
原理的全面认识复 习和掌握,对
单片机
实际的应用作进一步的了解。 (4) 通过本次试验,增强自己的动手能力。认识
单片机
在日常生活中的应用的广泛性,实用 性。 明确学习目的,端正学习态度,提高对课程设计重要性的认识,以积极认真的态度参加 课程设计工作,按要求完成规定的设计任务。 2 设计思路 本实验利用
单片机
的定时器/计数器定时和计数的原理,通过采用仿真软件来模拟实 现。模拟利用AT89C2052
单片机
、LED数码管以及各种控制器件来控制表的计数以及计数 的开启/
暂停
/
继续
与复位等。利用
单片机
AT89S51
单片机
来制作一个手动计数器,在AT8 9S51
单片机
的P1.7管脚接一个轻触开关,作为手动计数的按钮,用
单片机
的P2.0- P2.7接一个共阴数码管,作为00-99计数的个位数显示,用
单片机
的P0.0- P0.7接一个共阴数码管,作为00-99计数的十位数显示。 3 设计过程 3.1 方案论证 3.1.1 用
单片机
技术来实现多功能定时计数器的控制 多功能定时计数器控制系统的原理。它主要由
单片机
、发光二极管、晶振和双位数码 管等部分组成。 1、总体描述 (1)
单片机
采用STC89C52型。 (2)数据显示电路:七段四位共阴极数码管,P1口控制八位段码,P3.4到P3.7控制 四位码。 (3)数据输入电路:四个
按键
完成输入,一号键控制个位加1,可以实现从1加到9; 二号键控制十位加一;三号键控制百位加一;四号键控制千位加一。 (4)功能指示电路:上电指示发光二极管,P26口控制蜂鸣器报警功能。 2、总体设计: 设计总体框架图如图3-1所示: 图3-1总体框架图 3.1.2 最小控制系统的设计 STC89C52
单片机
最小系统包括晶体振荡电路、复位开关和电源部分。图3- 2为STC89C52
单片机
的最小系统: 图3-2
单片机
最小控制系统 复位口为P3.0口,当RST引脚有一个高电平并维持两个机器周期,则 CPU就可以响应并将系统复位。需要200欧,1000欧电阻各一个,22微法电容一个,
按键
一个。时钟电路需要在XTAL1,2,两个端口跨接石英晶体及两个电容,电容一般取30pF 左右。 3.2 电路的设计 3.2.1 指示电路 图3-3蜂鸣器电路 3.2.2 数码管显示电路 图3-4数码管电路 我的数码管为共阴极,八段选端接P1口,四个位选端接P3口,如上图所示。 3.2.3键盘输入 图3-4 键盘输入 上图为3*3矩阵键盘扫描电路的接法,三行分别相连接P2.5,P2.4,P2.3口,三列分 别相连接P2.2,P2.1,P2.0口。先给所有行线一个低电平,然后将线口的电平状态读入
单片机
,如果有
按键
按下,总有一根线电平被拉至低电平,从而使输入不全为1. 判断键盘中哪一个键被按下是通过将行线逐行配置低电平后,检查列输入状态实现的。 方法是:依次进给低电平,然后检查所有列状态,称行扫描。如果全为1,则所按下的键 不在此行,如果不全为1,则所按下的键必在此行,而且是在与零电平线相交的交点上的 那个键。 3.2.4复位电路 图3-5 复位电路 3.2.5 总原理图 3-6电路图设计
编程
: #include
Unsignecharcode LEDcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char Count; sbit SP1=P1^7; void delay10ms(void) { unsigned char i,j,k; for(i=5;i>0;i--) for(j=4;j>0;j--) for(k=248;k>0;k--); } void main (void) {Count=0; P0=LEDcode[Count/10]; P2=LEDcode[Count%10]; while(1) {if(SP1==0) {delay10ms(); if(SP1==0) {Count++; if(Count==100) { Count=0;} P0=LEDcode[Count/10]; P2=LEDcode[Count%10]; while(SP1==0); do {delay10ms();} while(SP1==0); } } } } 4 系统调试与结果 系统通电后,进入计数设置功能,等待信号的数据输入,当完
C语言
编程
C语言是一门广泛应用于系统
编程
、嵌入式软件和高性能应用开发的高级
编程
语言。本课程旨在向你介绍C语言的基本概念、语法和
编程
技巧,使你能够掌握C语言的核心知识,并能够用C语言编写简单到中等复杂程度的程序。课程针对0基础初学者,所以课程会由浅入深,由表及里的探索C语言知识框架,慢慢触及C语言本质,课程结构先由简单程序引入,然后拆分程序各个细节,让你逐渐掌握C语言
编程
的精髓。也会讲解C语言编译过程,怎样将人类描述的语言让计算机能够识别并按我们的意愿运行。C语言程序怎样运行也会详细介绍,了解程序由静到动的过程。课程注重基础理论与实践结合,在重点关注C语言的基础理论知识的同时,我们会结合大量的实际
编程
练习,对每个重要的知识点和易错的地方都有代码演示并查看程序运行结果,深入理解C语言的运作原理。课程中一半内容是理论知识的讲解,另外一半是代码实操。课程由本人全部从0开始编写,从课程架构思考,内容组织,难易程度,章节划分,都融入了本人对C语言的思考,几乎全是干货,如果你渴望成为一名优秀的C语言
编程
者,那么不要犹豫!欢迎报名参加我们的课程,让我们一起踏上
编程
的旅程,共同学习和进步!课程源码:https://gitee.com/sliaowalker/c-language-programming
基于89C51
单片机
的秒表课程设计(4).doc
摘要 随着电子技术的发展,电子技术在各个领域的运用也越来越广泛,人对它的认识也 逐步加深。秒表计时器秒表计时器常常用于体育竞赛及各种其他要求有较精确时间的各 领域中。其中启/停开关的使用方法与传统的机械计时器相同,即按
一下
启/停开关,启 动计时器开始计时,再按
一下
启/停开关计时终止。而复位开关可以在任何情况下使用, 即使在计时过程中,只要按
一下
复位开关,计时应立即终止,并对计时器清零。本设计 就是利用所学到的电子元器件将脉冲源用数码管显示出来,以制承诺简易的秒表。 以
单片机
为核心,设计一个秒表,具有计时功能,
按键
有启动计时、数据清零、停 止、时间显示。 采用3个LED数码管显示时间,计时范围设置为0~99.9秒,即精确到0.1秒,用
按键
控制秒表的"开始"、"
暂停
"、"复位",按"开始"
按键
,开始计时;按"
暂停
"
按键
,系统
暂停
计时;再按"开始"键,系统
继续
计时;数码管显示当前计时值;按"复位"
按键
,系 统清零。 目录 一、设计任务 4 二、设计题目 4 三、功能分析 4 四、总体设计 4 4.1硬件设计 5 4.1.1 89C51
单片机
5 4.1.2晶体振荡电路 7 4.1.3复位电路 8 4.1.4
按键
电路 9 4.2引脚控制 11 五、电路原理图 11 六、程序流程图及程序设计 12 6.1程序流程图 12 6.2程序设计 13 七、程序仿真 23 八、心得体会 24 九、致谢 25 十、参考文献 26 一、设计任务 以
单片机
为核心,设计一个秒表,具有计时功能,
按键
有启动计时、数据清零、停 止、时间显示。 二、设计题目 秒表的设计 三、功能分析 采用3个LED数码管显示时间,计时范围设置为0~99.9秒,即精确到0.1秒,用
按键
控制秒表的"开始"、"
暂停
"、"复位",按"开始"
按键
,开始计时;按"
暂停
"
按键
,系统
暂停
计时;再按"开始"键,系统
继续
计时;数码管显示当前计时值;按"复位"
按键
,系 统清零。 四、总体设计 本实验利用
单片机
的定时器/计数器定时和计数的原理,通过采用Proteus仿真软件 来模拟实现。模拟AT89C51
单片机
、LED数码管以及控件来控制秒表的计数以及计时的开 启、
暂停
、
继续
、与复位。其中有三个数码管来显示数据,两个数码管显示秒(两位) ,另一个数码管显示十分之一秒,十分之一秒的数码管计数从0~9,满十进一后显示秒 得数码管的个位加一,并且十分之一秒显示清零重新从零计数。同理当个位满十进一后 个位也清零重新计数 ,当计时超过范围(即超过99.9秒)后,所有数码管全部清零重新计数。 4.1硬件设计 4.1.1 89C51
单片机
MCS- 51系列
单片机
是8位
单片机
产品,89C51是其中的典型代表,基本模块包括以下几个部分 : 1. CPU:89C51的CPU是8位的,另外89C51内部有1个位处理器 2. R0M:4KB的片内程序存储器,存放开发调试完成的应用程序 3. RAM:256B的片内数据存储器,容量小,但作用大 4. I/O口:P0-P3,共4个口32条双向且可位寻址的I/O口线 5.
中断
系统:共5个
中断
源,3个内部
中断
,2个外部
中断
6. 定时器/计数器:2个16位的可
编程
定时器/计数器 7. 通用串行口:全双工通用异步接收器/发送器 8. 振荡器:89C51的外接晶振与内部时钟振荡器为CPU提供时钟信号 9. 总线控制:89C51对外提供若干控制总线,便于系统扩展 89C51的引脚如下图: 89C51
单片机
引脚图 4.1.2晶体振荡电路 89C51
单片机
内部的振荡电路是一个高增益反相放大器,引线XTAL1和XTAL2分别为 反相振荡放大器的输入及内部时钟工作电路的输入和来自反相振荡器的输出,该反相放 大器可以配置为片内振荡器。 这里选用51
单片机
12MHZ的内部振荡方式,电路如下:C2、C3起稳定振荡频率、快 速起振的作用 晶振电路 4.1.3复位电路 采用上电复位,上电后,由于电容充电,使RST持续一段时间的高电平,从而实现 上电复位操作。这不仅能使
单片机
复位,还能是
单片机
的外围设备同时复位,当程序出 现错误时,可以随时使电路复位。 电路图如下: 复位电路 4.1.4
按键
电路 当
按键
被按下时,相应的引脚被拉低,经扫描后,获得键值,并执行键功能程序, 因此按下不同的
按键
,将执行不同的功能程序。 电路图如下:
按键
电路 4.1.5显示电路 采用3个LED数码管,LED是七段显示器,内部有7个条形发光二极管和1个小圆点发 光二极管,根据各管的亮暗组成字符。 在用数码管显示时,有静态和动态两种选择,这里采用LED动态显示,用P0、P1、 P2口驱动显示,由于P0口没有上拉电阻,因此P0口需要外接上拉电阻才能输出高电平 ,这里使用8个4.7k的电阻作为上拉电阻。 电路图如下: 显示电路
基于89C51
单片机
的秒表课程设计(3).doc
摘要 随着电子技术的发展,电子技术在各个领域的运用也越来越广泛,人对它的认识也 逐步加深。秒表计时器秒表计时器常常用于体育竞赛及各种其他要求有较精确时间的各 领域中。其中启/停开关的使用方法与传统的机械计时器相同,即按
一下
启/停开关,启 动计时器开始计时,再按
一下
启/停开关计时终止。而复位开关可以在任何情况下使用, 即使在计时过程中,只要按
一下
复位开关,计时应立即终止,并对计时器清零。本设计 就是利用所学到的电子元器件将脉冲源用数码管显示出来,以制承诺简易的秒表。 以
单片机
为核心,设计一个秒表,具有计时功能,
按键
有启动计时、数据清零、停 止、时间显示。 采用3个LED数码管显示时间,计时范围设置为0~99.9秒,即精确到0.1秒,用
按键
控 制秒表的"开始"、"
暂停
"、"复位",按"开始"
按键
,开始计时;按"
暂停
"
按键
,系统暂 停计时;再按"开始"键,系统
继续
计时;数码管显示当前计时值;按"复位"
按键
,系统 清零。 目 录 一、设计任务 3 二、设计题目 3 三、功能分析 3 四、总体设计 3 4.1硬件设计 4 4.1.1 89C51
单片机
4 4.1.2晶体振荡电路 5 4.1.3复位电路 6 4.1.4
按键
电路 7 4.1.5显示电路 9 4.2引脚控制 10 五、电路原理图 10 六、程序流程图及程序设计 11 6.1程序流程图 11 6.2程序设计 12 七、程序仿真 23 八、心得体会 24 九、致谢 25 十、参考文献 26 一、设计任务 以
单片机
为核心,设计一个秒表,具有计时功能,
按键
有启动计时、数据清零、停 止、时间显示。 二、设计题目 秒表的设计 三、功能分析 采用3个LED数码管显示时间,计时范围设置为0~99.9秒,即精确到0.1秒,用
按键
控制秒表的"开始"、"
暂停
"、"复位",按"开始"
按键
,开始计时;按"
暂停
"
按键
,系统
暂停
计时;再按"开始"键,系统
继续
计时;数码管显示当前计时值;按"复位"
按键
,系 统清零。 四、总体设计 本实验利用
单片机
的定时器/计数器定时和计数的原理,通过采用Proteus仿真软件 来模拟实现。模拟AT89C51
单片机
、LED数码管以及控件来控制秒表的计数以及计时的开 启、
暂停
、
继续
、与复位。其中有三个数码管来显示数据,两个数码管显示秒(两位) ,另一个数码管显示十分之一秒,十分之一秒的数码管计数从0~9,满十进一后显示秒 得数码管的个位加一,并且十分之一秒显示清零重新从零计数。同理当个位满十进一后 个位也清零重新计数 ,当计时超过范围(即超过99.9秒)后,所有数码管全部清零从新计数 4.1硬件设计 4.1.1 89C51
单片机
MCS- 51系列
单片机
是8位
单片机
产品,89C51是其中的典型代表,基本模块包括以下几个部分 : 1. CPU:89C51的CPU是8位的,另外89C51内部有1个位处理器 2. R0M:4KB的片内程序存储器,存放开发调试完成的应用程序 3. RAM:256B的片内数据存储器,容量小,但作用大 4. I/O口:P0-P3,共4个口32条双向且可位寻址的I/O口线 5.
中断
系统:共5个
中断
源,3个内部
中断
,2个外部
中断
6. 定时器/计数器:2个16位的可
编程
定时器/计数器 7. 通用串行口:全双工通用异步接收器/发送器 8. 振荡器:89C51的外接晶振与内部时钟振荡器为CPU提供时钟信号 9. 总线控制:89C51对外提供若干控制总线,便于系统扩展 89C51
单片机
引脚如下图: 4.1.2晶体振荡电路 89C51
单片机
内部的振荡电路是一个高增益反相放大器,引线XTAL1和XTAL2分别为 反相振荡放大器的输入及内部时钟工作电路的输入和来自反相振荡器的输出,该反相放 大器可以配置为片内振荡器。 这里选用51
单片机
12MHZ的内部振荡方式,电路如下:C2、C3起稳定振荡频率、快 速起振的作用。 晶振电路 4.1.3复位电路 采用上电复位,上电后,由于电容充电,使RST持续一段时间的高电平,从而实现 上电复位操作。这不仅能使
单片机
复位,还能是
单片机
的外围设备同时复位,当程序出 现错误时,可以随时使电路复位。 电路图如下: 复位电路 4.1.4
按键
电路 当
按键
被按下时,相应的引脚被拉低,经扫描后,获得键值,并执行键功能程序, 因此按下不同的
按键
,将执行不同的功能程序。 电路图如下:
按键
电路 4.1.5显示电路 采用3个LED数码管,LED是七段显示器,内部有7个条形发光二极管和1个小圆点发 光二极管,根据各管的亮暗组成字符。 在用数码管显示时,有静态和动态两种选择,这里采用LED动态显示,用P0、P1、 P2口驱动显示,由于P0口没有上拉电阻,因此P0口需要外接上拉电阻才能输出高电平 ,这里使用8个4.7k的电阻作为上拉电阻。 电路图如下: 显示
单片机/工控
27,373
社区成员
28,771
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章