用计数器中断实现100以内的按键计数[1]

合集下载

0-99长短按键计数

0-99长短按键计数

Kadd Kdec
AT89C51
//0-99H 长短按键检测 #include<reg51.h> sbit keyadd=P3^0; sbit keydec=P3^1; unsigned char code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,}; char hz;
void delay(unsigned int t)//延时子程序-----------------------{ unsigned char i;
for(;t>0;t--) for(i=0;i<125;i++); }
void keyscan()//-------按键扫描 {
//加判断 if(keyadd==0) {
delay(600); //每隔约 600 毫秒加 10,防止速度太快乱闪 } else //1 秒内松开了按键,即认为是短按 { hz++; if(hz>99) hz=0; P0=num[hz/10]; P2=num[hz%10];//实时显示 }
}
//减判断 if(keydec==0) {
delay(10);//延时去抖 if(keydec==0) delay(600);//长按键检测
RP1
RESPACK-8
1 2 3 4 5 6 7 8 9
C1
22pF
U1
C2
22pF
R1
X1
19 XTAL1
12M
18 XTAL2
9 RST
P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7

单片机C语言程序设计:用计数器中断实现100以内的按键计数

单片机C语言程序设计:用计数器中断实现100以内的按键计数

while(1) { P0=DSY_CODE[Count/10]; P2=DSY_CODE[Count%10]; } } //T0 计数器中断函数 voidKey_Counter()interrupt1 { Count=(Count+1)%100;//因为只有两位数码管,计数控制在 100 以内 (00~99) }
P0=0x00; P2=0x00; TMOD=0x06; //计数器 T0 方式 2 TH0=TL0=256-1; //计数值为 1 ET0=1; //允许 T0 中断 EX0=1; //允许 INT0 中断 EA=1; //允许 CPU 中断 IP=0x02; //设置优先级,T0 高于 INT0 IT0=1; //INT0 中断触发方式为下降沿触发 TR0=1; //启动 T0
#include #defineucharunsignedchar #defineuintunsignedint //段码 uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; ucharCount=0; //主程序 voidmain() {
单片机 C 语言程序设计:用计数器中断实现 100 以
内的按键计数
/* 名称: 计数器中断实现按键技术,由于计数寄存器初值为 1,因 此 P3.4 引脚的每次负跳变都会触发 T0 中断,实现计数值累加。 计数器的清零用外部中断 0 控制。 */
//INT0 中断函数 voidClear_Counter()interrupt0 { Count=0; } 扩展阅读:10s 的秒表程序

C51单片机秒表计时(C语言)

C51单片机秒表计时(C语言)
if(mm==80) //考虑其它损耗,调整后约为1S
{ cout++;
mm=0;}
}
效果显示
图一(电路总图)
图二(效果显示)注:第四位显示为单位:S
程序清单
#include<reg51.h>
#include<stdio.h>
unsigned char Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };
sbit P37=P3^7;
}
/*********显示程序*****************/
void display()
{
x=cout/10;//秒十位
P34=0;
P1=Tab[x]; delay();
P34=1;
y=cout-x*10; //秒各位
P35=0;
P1=Tab[y]; delay();
P1=做任何修改或编辑并不能对任何下载内容负责
南开大学滨海学院
C51嵌入式软件设计(C语言)
题目:计时秒表
功能描述:本设计实现在99秒内的秒表计时,一个按键实现开始、暂停、复位。
原理概述:P1接四位七段数码管,P3.2接一按键产生外部中断0,P3.4-P3.7控制扫描显示。计时使用定时器0产生10ms中断累计。按键不同次序决定了对应的控制功能,因为第一次按键必定为开始计时,所以第二次按键判断为暂停,依次第三次为置零。主程序调用显示程序,显示程序实时显示计时时间。
sbit P36=P3^6;
sbit P35=P3^5;
sbit P34=P3^4;
unsigned int a=0,cout=0,mm=0;x,y,p,q;

51单片机:中断实现按键按一下数码管从00加到99循环(C语言)

51单片机:中断实现按键按一下数码管从00加到99循环(C语言)

51单⽚机:中断实现按键按⼀下数码管从00加到99循环(C语⾔)51单⽚机:中断实现按键按⼀下数码管从00加到99循环(C语⾔)
题⽬要求:
在51单⽚机上通过C语⾔编写代码,使⽤中断,按键按⼀下数码管上⾯的数字从00开始加1,实现00——99的循环
准备⼯作:
keil建⽴⼯程
proteus仿真验证
代码如下:
/*
*功能:⽤中断实现开关每按⼀次,数码管数字加⼀,
*实现00-99的循环
*/
#include<reg52.h>
sbit SEG1 = P1^0;//定义显⽰⼗位数码管
sbit SEG2 = P2^0;//定义显⽰个位数码管
sbit key = P3^2;//定义按键
int sum =0;
int i,j;
unsigned char code DSY_CODE[]={0xC0,0xF9,0xA4,
0xB0,0x99,0x92,
0x82,0xF8,0x80,0x90};//共阳极数码管
void main()
{
IE =0x81;//使⽤外部中断0
IT0 =1;
while(1);
}
void EX0_INT(void) interrupt 0
{
sum++;
i = sum/10;//⼗位数字
j = sum%10;//个位数字
if(sum ==100)
{
sum =0;
}
P1 = DSY_CODE[i];//数码管显⽰⼗位数字
P2 = DSY_CODE[j];//数码管显⽰个位数字
}
(写的不是很规范,仅供参考)
仿真结果:。

微机原理及程序设计试题多套汇总(带答案)

微机原理及程序设计试题多套汇总(带答案)

微机原理及程序设计试卷(一)一、填空题(共15分,每空1分)1、十六进制数30A.5转换为二进制是1100001010.0101,转换为十进制是778.3125。

2、偏移量是指存储单元相对逻辑段首地址的偏移距离。

3、8088/8086系统中,不改变DS值的情况下,其数据段的最大寻址范围是_____64_KB。

4、PC总线中,IOR为低电平时,表明CPU对端口进行_____读_____操作。

5、8086/8088存储器分四个段,这四个段的段名所对应的段寄存器分别是_____CS__、____DS____、_____ES___、_____SS___。

6、每条指令的执行过程中是由____取指令____、____指令译码____和___指令执行_____等操作组成。

7、I/O端口的编址方式有__独立(单独)编址______和_____统一编址___ 两种二、选择题(共20分,每小题2分)1、在机器数()中,零的表示形式是唯一的。

A、原码B、补码C、反码D、原码和反码2、若采用双符号位判断溢出,当结果的符号位为11时,表示()。

A、结果为正,无溢出B、结果正溢出C、结果负溢出D、结果为负,无溢出3、中央处理机(CPU)是指()。

A、运算器B、控制器C、运算器和控制器D、运算器、控制器和主存储器4、PSW是指令部件中()。

A、指令寄存器B、指令译码器C、程序计数器D、程序状态寄存器5、寄存器间接寻址中,操作数放在()。

A、通用寄存器B、主存单元C、堆栈D、程序计数器6、EPROM是指()。

A、随机读写存储器B、可编程的只读存储器C、只读存储器D、可擦除的可编程只读存储器7、存储周期是指()。

A、存储器的读出时间B、存储器的写入时间C、存储器进行连续读和写操作所允许的最短时间间隔D、存储器进行连续写操作所允许的最短时间间隔8、某一存储单元的逻辑地址为2500H:0010H时,其对应的物理地址为()。

A、2500HB、0010HC、25100HD、25010H9、DMA传送结束由I/O接口向CPU发出中断请求,其目的是( )。

单片机中断实现按键

单片机中断实现按键

单片机中断实现按键一、引言在嵌入式系统中,往往需要通过外部输入设备如按键来与系统进行交互。

为了能够及时响应按键操作,避免忙等的情况发生,通常会使用中断技术来实现按键的检测和处理。

本文将介绍如何使用中断来实现按键检测,并具体以8051单片机作为示例进行说明。

二、中断基础知识在单片机中,中断是一种由硬件触发的特殊事件,当一些中断条件满足时,单片机会暂停当前任务,跳转到中断服务程序中执行对应的处理代码,待中断处理结束后再返回到原来的任务中。

中断的触发方式一般有两种:外部触发中断和内部触发中断。

对于按键这种外部输入设备,一般通过外部触发中断来实现。

三、实现原理1、按键电路:按键通常由一个导电片和两个触点组成,平时靠两个触点之间的弹簧将导电片与触点隔开,当按下按键时,弹簧压缩,导电片与触点接触形成通路。

为了能够检测按键操作,需要将按键引脚连接到单片机的外部中断引脚上。

2、中断设置:在单片机的程序中,需要设置好相应的中断向量表和中断服务程序。

中断向量表是一个存放中断服务程序地址的表格,当中断触发时,单片机会根据中断号从中断向量表中找到相应的中断服务程序地址并跳转到该地址执行对应代码。

3、中断触发条件:在按键电路中,按键的两个触点状态变化(从断开到接通或从接通到断开)时会产生干扰信号,为了避免干扰,通常会使用软件消抖技术。

当按键被按下,并经过一段时间的消抖后,会产生一个稳定的按键信号,此时可以检测到按键变化,并触发相应的中断。

四、实现步骤1、硬件连接:将按键引脚连接到单片机的外部中断引脚上。

2、中断设置:在单片机的程序中,需要设置中断的相关寄存器,包括中断向量表和中断控制寄存器。

中断向量表保存中断服务程序的入口地址,中断控制寄存器用于设置中断触发条件和中断优先级等参数。

3、中断服务程序:编写中断服务程序,在按键中断触发时执行对应的处理代码。

中断服务程序一般需要包括中断触发条件的判断和处理代码的执行。

4、主程序:在主程序中调用中断服务程序,并添加相应的处理代码,实现按键操作的具体功能。

按键计数说明

按键计数说明

“按键计数”说明(一)设计思路和方法按键计数是通过按键来控制数据的加减然后在LED数码管上进行显示,其中涉及按键消抖,每1mS(可在不同TASK中改变)查看一次按键,如果在100mS、即100次中(由NMAX_KEY定义)中有2/3(N_KEY)以上按键按下,则认为按键有效按下。

一次有效按下,仅做一次动作。

动作设计在按键按下时执行(也可编成在在按键松开后执行),本实验是在按下时执行动作,key1对应加1,key2对应减1,key3对应清0。

(二)数字钟电路原理图(三)L ED数码管电路(左边部分)(四)(五)按键电路(六)(七)电路工作原理在实验2中已经分别说明了LED数码管的电路工作原理,在实验3中已经说明按键的电路工作原理,因此这里不再复述。

这里着重讲一下按键消抖过程,通过设定按键检测统计次数,每个一段时间去检测按键值是否为0,超过统计次数的较大比例,如2/3,我们则认为按键按下,然后通过对比按键上一个状态Key_P、当前状态Key_C来确定按键动作何时进行,下降沿操作Key_P、Key_C 组合10,上升沿操作Key_P、Key_C组合01等。

(八)程序总框图设计流程如下所示(九)(十)相关寄存器配置1. P0(8位)和P2.3需要设置成推挽输出,以驱动电路正常发光。

按键作为输入,不需推挽,涉及寄存器及配置值如下:P2M1=0x00;P2M0=0xff;P0M1=0x00;P0M0=0xff;P3M0=0x00;P3M1=0x00;P1M0=0x7f;2.P1M1=0x00;3.通过定时器0,采用方式1,在定时器中断中进行计数值的累加,涉及寄存器(含可位寻址)及配置如下:AUXR |= 0x80; //定时器时钟1T模式TMOD &= 0x80; //设置定时器模式TL0 = 0xAE; //设置定时初值TH0 = 0xFB; //设置定时初值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时IE=0x82;(十一)案例代码见“数字钟工程”(十二)测试方法1. 用STC ISP默认设置,打开工程中的HEX并下载2. 下载后观察现象为:左边3个数码管显示000,其他数码管均灭1.辅助操作:当显示为000,按下key2,显示255,在按下key2,显示254,每按一次key2,显示数字减1;按下key1,显示数字加1;按下key3,显示清零000。

外部中断0按键计数器实验总结心得

外部中断0按键计数器实验总结心得

外部中断0按键计数器实验总结心得
外部中断0按键计数器实验总结。

今天,学习完了外部中断0按键计数器实验后,在分析这个实验之前,让我来总结一下吧:其实,有些人会觉得编写一段程序很简单、很容易,但真正去做时,发现原来它并不像他们所说的那样简单和容易。

以前都只看到别人表面上显示出来的东西而没有深入地去体会或者感受它背后隐藏着的一些细
节问题!下面,请大家认真观察,跟随我的脚步走进去瞧瞧吧!如果你仔细阅读了本文,相信对你也能够起到帮助作用哦!
首先我们知道了这个程序的设计思想就是;当按下按钮时,计算机执行一条指令,然后再将结果送回给计算机,由于这种方式可以使计算机重复工作,因此称为“重复”。

程序经过分析与设计,确定采用中断方法来控制计算机的运转。

主要考虑三点:1.计算机需要多次响应按钮的操作;2.每次响应按钮的操作必须保证输出的状态变化量是连续的;3.响应按钮的操作时间尽量短。

下面开始写程序了。

首先我们把程序的流程图画好,接着就是根据流程图写代码啦~首先我们要找到一个中断源,即按钮,它的作用是按下时触动中断服务程序,然后启动中断处理程序,最终返回一个中断处理程序的响应值。

接着我们还要判断按钮是否被按下,若已经被按下则跳过这一步继续往下写,直至程序结束。

- 1 -。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3.33 用计数器中断实现100以内的按键计数
一. 单片机系统功能简介:
本例利用计数器中断实现按键计数,这与此前的按键计数程序看起来比较相似,但是用方法完全不同。

本例用T0计数器中断实现按键计数,由于计数寄存器初值为1,因此P3.4引脚的每次负跳变都会触发T0中断,实现计数值累加。

二.单片机系统硬件电路设计:
2.1 proteus原理图:
2.2 原件清单:
三.软件设计:
3.1 主程序流程图:
3.2 程序清单:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code
DSY_CODE[]={0X3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00 };
uchar Count=100;
void main()
{
P0=0x00;
P2=0x00;
TMOD=0X06;
TH0=TL0=256-1;
ET0=1;
EX0=1;
EA=1;
IP=0X02;
IT0=1;
TR0=1;
while (1)
{
P0=DSY_CODE[Count/10];
P2=DSY_CODE[Count%10];
}
}
void Clear_Counter()interrupt 0
{
Count=0;
}
void Key_Counter() interrupt 1
{
Count=(Count-1)%100;
}
四.系统调试
4.1 在PROTEUS7.5仿真步骤
1将程序在KEIL中编译,直到达到要求的功能为止;
2在PROTEUS中绘制硬件图(在PROTEUS仿真时可以不添加最小系统电路;实际电路中需要);
3将KEIL C中编译好的HEX文档加载到PROTEUS中;
4按下K1开始计数,按下K2可以清零。

仿真效果:按下K1可以看到数码管开始计数,按一次记一次,从0-99,按下K2按键,可以看到数码管变0。

4.2硬件电路调试步骤
1 按照原理图焊接好线路板,布线规范;
2 利用单片机开发工具将程序的HEX文档,烧写入芯片当中;
3 将芯片插入在芯片的底座当中;
4 将电路的VCC端接到电池盒的正极,将接地端接到电池盒的负极;
5 分别调试按键K1 ,K2观察效果;
6 如果没有效果或者效果不对插错;
实物图:
效果图:
运行结果:按下K1数码管开始计数,按一次计数1次,从0可以最大计数到99,再按下K2,数码管显示为0,可以重新计数。

五.单片机设计感受:
这是我第一次做单片机实验,说起来有一些紧张和新奇。

在此之前我并没有接触过单片机,我本以为与之前的光学实验及其它实验差不多,可我做完设计之后,我就改变了这个看法。

单片机实验要求的是一种思维的创新,而不是简单的重复老师所说的实验步骤。

因此第一次实验,实验老师向我们讲解了KEILC的情况及使用方法和技巧。

编完程序之后,知道我们如何使用PROTEUS达到将编好的程序输入到单片机中来使其运行。

经过我的不断努力,我终于实现了简单的用计数器中断实现100以内的按键计数的仿真运行。

我感到兴奋极了,我得到莫大成就感和自信。

但在做实物的时候,由于焊接技术的欠缺,有几个地方接线接的很不好,不能正常运行。

虽然很努力了,但是依旧不能运行。

在这次实验中,我体会到了合作的重要性。

一个人在实现这一系列的过程,要花费很多精力和时间。

群策群力,可以使我更好、更快地完成我的工作。

在此期间,我可以更好知道自己的不足和缺陷,来得到改正。

还可以知道自己的优势所在,把握好自己的优势。

以上便是我做这次实验的心得体会。

相关文档
最新文档