用计数器中断实现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 -。

中断定时计数器课件

中断定时计数器课件

例 5 编写一段程序,功能要求为:当P1.0引脚的电平正跳变时,对P1.1的输入脉冲 进行计数;当P1.2引脚的电平负跳变时,停止计数,并将计数值写入R0、R1(高位 存R1,低位存R0)。 解答:将P1.1的输入脉冲接入INT0,即使用T0计数器完成对P1.1口的脉冲计数。编写程 序如下: ORG 0000H LJMP MAIN ORG 000BH LJMP IT0P MAIN: JNB P1.0,MAIN MOV TMOD,#05H ;定 时器/计数器T0为计数方式1 SETB TR0 ;启动T0,开 始计数 SETB ET0 ;允许T0中断 SETB EA ;CPU开中断 WAIT: JB CLR CLR MOV MOV AJMP INC RETI P1.2,WAIT EA TR0 R1,TH0 R0,TL0 $ R2
ORG 000BH CPL P1.0 MOV TL0, #9CH RETI ORG 001BH CPL P1.1 MOV TH0, #38H RETI ;TL0 中断服务程序 ;P1.0 取反 ;重新装入计数初值 ;中断返回 ;TH0 中断服务程序 ;P1.1取反 ;重新装入计数初值 ;中断返回
AJMP DEL REP:CPL P1.0 AJMP DEL ; ;若计数溢出,则输出取反
TINT0: JNB 20H.0,NEXT MOV TL0,#0B5H MOV TH0,#0FFH CLR P1.1 CPL 20H.0 SJMP LAST NEXT: MOV TL0,#0CEH MOV TH0,#0FFH SETB P1.1 CPL 20H.0 LAST:RETI
方法二: 采用方式2 定时器中断 加延时程序
ORG 0000H LJMP MAIN ORG 000BH LJMP IT0P MAIN: MOV TMOD,#02H;定时器/ 计数器T0为定时方式2 IT0P:CLR EA MOV TL0,#4AH;定时 CLR P1.0 ;关中断 364μs初值赋值 MOV R0,#9 ;延时26μs SETB TR0;启动T0,开始 DLY:DJNZ R0,DLY MOV TL0,#4AH ;定时364μs 计数 初值赋值 SETB ET0;允许T0中断 SETB P1.0 SETB EA;CPU开中断 SETB EA RETI SETB P1.0 WAIT: AJMP WAIT

LPC2138实验程序 中断 定时器 led 扫描 键盘

LPC2138实验程序 中断 定时器 led 扫描 键盘

LPC2138实验程序(尾部附有电路图)①实现键盘1中断(1~9数字),数码管1显示按键数字,同时用7个LED显示数码管1的相应位,即每个LED对应数码管相应位(a~g)。

②实现按键1中断,7个LED实现流水灯;实现按键2中断,7个LED实现跑马灯。

③实现按键3中断,7个LED闪烁10次,延时采用定时器#include <LPC213X.H>#define uchar unsigned charint k=0; //定时器中断计数器uchar a=0; //LED闪烁函数标志void delay(int x) //普通延时函数{int i;for(;x>0;x--)for(i=10000;i>0;i--);}void ms(unsigned int x) //定时器中断延时函数{T0TCR = 0X01;while(k!=x);T0TCR = 0X00;T0TC = 0;T0PC = 0;k=0;}void LED_1() //流水灯函数{unsigned char i;for(i=0;i<7;i++){IO1SET = 1<<(i+16);delay(20);IO1CLR = 1<<(i+16);}}void LED_2() //跑马灯函数{unsigned char i;for(i=0;i<15;i++){if(i<7){IO1SET = 1<<(i+16);delay(20);IO1CLR = 1<<(i+16);}else{IO1SET = 1<<(29-i);delay(20);IO1CLR = 1<<(29-i);}}}void LED_3() //LED闪烁函数{unsigned char i;for(i=0;i<10;i++){IO1SET = 0x7F<<16;delay(20);IO1CLR = 0X7F<<16;delay(20);}}void display(uchar x) /*数码管显示函数x为显示的数字*/ {unsigned char table[10]={0x00, 0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};IO0SET = (table[x]<<25);IO1SET = (table[x]<<16);delay(20);IO0CLR = (table[x]<<25);IO1CLR = (table[x]<<16);}void key_w() //键盘按行低电平扫描函数{IO0SET = 0X7<<20;IO0CLR = 1<<20;delay(2);IO0SET = 1<<20;IO0CLR =1<<21;delay(2);IO0SET =1<<21;IO0CLR =1<<22;delay(2);IO0SET =1<<22;}unsigned char key_r() /*键盘按列读取扫描数值返回值为键盘对应数字*/ {int a=0,b;switch(IO0PIN&(7<<16)){case 0x00060000:b=1;break;case 0x00050000:b=2;break;case 0x00030000:b=3;break;default:break;}switch(IO0PIN&(7<<20)){case 0x00600000:a=1;break;case 0x00500000:a=2;break;case 0x00300000:a=3;break;default :break;}if(a!=0)a=(a-1)*3+b;else a=0;return(a);}void EINT0()__irq //外部中断0服务函数,对应矩阵键盘{unsigned char num;num=key_r();display(num);EXTINT = 0x0f;VICVectAddr=0;}void EINT1()__irq //外部中断1服务函数,对应流水灯{LED_1();VICVectAddr=0;}void EINT2()__irq //外部中断2服务函数,对应跑马灯{LED_2();EXTINT = 0x0f;VICVectAddr=0;}void EINT3()__irq //外部中断3服务函数,对应LED闪烁标志a=1 {a=1;EXTINT = 0x0f;VICVectAddr=0;}void time0()__irq //定时器服务函数,对应k++{k++;T0IR = 1;VICVectAddr = 0;}void init () //初始化函数,引脚功能设置{PINSEL0 = 0X000CC0CC;PINSEL1 = 0X0;IO0DIR = 0XFE700000;IO1DIR = 0X00FF0000;}void EXTinit (uchar x,uchar y) /*外部中断初始化设置x为中断触发方式,y为中端极性,x,y为两位HEX*/{EXTMODE = x;EXTPOLAR = y;}void TIMEinit() //定时器初始化(未给使能){T0TC = 0;T0PR = 0;T0PC = 0;T0MCR= 0x03;T0MR0= 1105920;}void VIC() //中断标志,优先级,指向函数设置{VICIntSelect&= (~(0xF<<14));VICIntSelect&= (~(0x1<<4));VICVectCntl1 = 0x20|14;VICVectAddr1 = (unsigned int)EINT0;VICVectCntl2 = 0x20|15;VICVectAddr2 = (unsigned int)EINT1;VICVectCntl3 = 0x20|16;VICVectAddr3 = (unsigned int)EINT2;VICVectCntl4 = 0x20|17;VICVectAddr4 = (unsigned int)EINT3;VICVectCntl0 = 0x20|4;VICVectAddr0 = (unsigned int)time0;EXTINT = 0x0f;VICIntEnable|= 0xF<<14;VICIntEnable|= 0x1<<4;}int main(void) //主函数{init();EXTinit(0x00,0x00);VIC();TIMEinit();while(1){key_w();if(a==1){LED_3();a=0;}}}。

单片机考试题库附有答案

单片机考试题库附有答案

一、填空题1、把无符号字符型变量i、j,定义在片内RAM低128字节的一般数据区域。

其定义为unsigned char data i,j;2、一台计算机所能执行的全部指令的集合,称为这个CPU的(指令系统)。

3、使用单片机T0对生产线上的工件进行计数,每够150个进行一项处理,试分析应该设置T0以模式(2)计数,模式寄存器TMOD的低4位应设置为(6),计数初值应该是(106 )。

4、单片机的复位信号输入端是( A )。

A、RSTB、ALEC、PSEND、EA5、定时器/计数器T0、T1的控制寄存器TCON的格式如下,当T0计数溢出时,TF0位自动(置1)。

┌──┬──┬──┬──┬──┬──┬──┬──┐│TF1 │TR1 │TF0 │TR0 │IE1 │IT1 │IE0 │IT0 │└──┴──┴──┴──┴──┴──┴──┴──6、写出把RAM 21H和A的数据相加的指令(ADD A,21H )。

7、DPTR是一个16位的寄存器,其高字节寄存器用( DPH)表示,低字节寄存器用( DPL)表示。

、8、定时器/计数器T0的计数输入引脚为(P3.4)。

9、寻找指令当中(操作数)或(操作数地址)的方式就叫做寻址方式。

10、使用printf、putchar、puts函数输出数据,必须先对串行口初始化,初始化内容之一是写SCON设置串行口工作方式。

设串行通信传输格式为8个数据位、1个停止位,不校验,则设置SCON的数值为(0x40或0x50(后者允许接收))。

11、PSW中RS1、RS0的作用是(选择工作寄存器组)。

12、串行通信的数据或字符是一帧一帧地传送,一帧数据由四个部分组成:(起始位)、(数据位)、(奇偶校验位)和(停止位)13、89C52单片机的定时器2有一个8位控制特殊功能寄存器T2CON,它的地址是0xc8,定义该特殊功能寄存器T2CON的方法是:sfr T2CON=0xc8;14、根据信息的传送方向,串行通信通常有三种:(单工)、(半双工)和(全双工)。

单片机模拟pt2272解码12路遥控器用tp2264编码的汇编源代码有详细注释

单片机模拟pt2272解码12路遥控器用tp2264编码的汇编源代码有详细注释

民用315M调制频率下,单片机模拟解码芯片2272工作中需要控制12个开关。

而且要遥控的。

就想到了通用的315M传输模块。

市场上只有少见的多路无线遥控。

找到一个设计很巧妙的12路无线遥控发射和接收模块。

拆开一看,原来如此发射模块用2264芯片,8位地址码,每位地址有3种状态(高电平,低电平,悬空),共3^8(65535)种地址,4位数据码,每个数据3种状态(共12种状态)。

只不过一般2272解码芯片把悬空状态和低电平等同。

输出4个开关状态(每个开关有高电平和低电平2种状态)。

综合上述,2264芯片其实每发送一帧编码,可以有3^12(531441)种帧编码。

也就是说。

我们不用2272解码芯片,而是用单片机解码,其实就可以实现8位地址(65535种)码,和12种数据,然后扩展控制12个动作。

这就是12路遥控的原理。

我在网上查了一下汇编源代码所有的源代码都是一个。

注释比较少。

我就自己写了一个,实际调试也成功了。

现在将代码共享如下。

STC单片机用的是4052AD,12M晶振,原因是计时器是1um的。

比较好算一点。

呵呵。

以下是源代码,复制编译即可。

接收模块接P1.7引脚。

;=================================================;STC单片机。

本人用了很多该单片机,最多的是STC12c4052AD这款;接收模块,315M,发射端用PT2264调制震荡电阻式1.2M的,电阻标示125;网上只搜索到一个汇编程序,注释比较少。

所以我调试成功之后写了一个;我在应用过程中硬件调试成功。

实际测得窄脉冲为100um左右,宽脉冲在300um左右,同步位低电平为3800um左右;遥控器有12个案件。

是市场上比较少见的。

一般2272解码后,4路输出,把悬空和0做相同处理;遥控器可以发出12种状态,4路(每路有0,1,悬空三种状态)故共12种状态。

这个遥控器设计比较巧妙。

接收只能用单片机实现,输出12种状态;程序调试通过。

任务5 51单片机实验板功能演示(按键计数器)

任务5 51单片机实验板功能演示(按键计数器)

上电或复位后程序计数指针PC的值为0000H,则CPU总是从0000H地址单元读取指令,
并执行程序,如果用户程序不是从0000H单元开始存放,则要在0000H单元存放无条件转 移指令以改变PC的值,使其转移到用户程序所在的地方去执行程序。0003H-002AH共40 个地址单元,每8个单元为一组,分别用来存储5个中断源的中断服务程序,所以用户程序 一般从002BH之后的地址单元开始存放。
任务5 51单片机实验板项目介绍 ---------按键计数器
• (1)工作寄存器区(00H-1FH) • 工作寄存器区共有32个单元。这32个单元每连续的8个单元分成1 组,共有4组,在任何时刻,CPU只能使用其中一组工作寄存器,被使 用的那组称为当前工作寄存器组,并且分别用R1-R7来表示其中8个存 储单元。没有被使用的可以当一般的RAM使用。通过对特殊功能寄存 器的PSW中的RS0、RS1位的设置来选择哪一组为当前工作寄存器组, 其选择与地址分配如表5-1。使用有R0-R7表示的当前工作寄存器组为 工程人员编写程序带来很大的灵活性。
0000h0002单元一般用来存放一条无条件转移指令因为单片机上电或复位后程序计数指针pc的值为0000h则cpu总是从0000h地址单元读取指令并执行程序如果用户程序不是从0000h单元开始存放则要在0000h单元存放无条件转移指令以改变pc的值使其转移到用户程序所在的地方去执行程序
任务5 51单片机实验板项目介绍 ---------按键计数器
(2)位寻址区(20H-2FH) 位寻址区可作为一般的RAM单元按字节操作,也可以进行位操作。这16个字节
共128位,位地址范围从20H单元的D0位(位地址为00H)到2FH单元的D7位(位
地址为7FH)。其位地址空间分布如表5-2所示。

单片机控制秒表显示时间为00—99(每秒自动加1),暂停,复位

单片机控制秒表显示时间为00—99(每秒自动加1),暂停,复位

9创新实践实训报告学籍号姓名指导教师蒋野单片机控制秒表电路一、电路工作原理1.工作原理用STC89C52设计一个2位的LED数码显示作为“秒表”:显示时间为00—99秒,每秒本系统采用STC89C51单片机为中心器件,利用其定时器/计数器定时计数的原理,结合硬件电路如电源电路,晶振电路,复位电路和显示电路,以及一些按键电路等来设计计数器,将软硬件有机结合起来,其中软件系统采用汇编语言编写程序,包括显示程序,计数程序,中断,硬件系统利用Protues强大的功能来实现,简单易于观察,在仿真中就可以观察到实际的工作状态。

2.元器件作用(1)STC89C52单片机在电子行业中有着广泛的应用。

AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2 个读写口线,STC89C52可以按照常规方法进行编程,也可以在线编程。

其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的 Flash存储器可有效地降主程序流程图三、检测安装与调试1.元件检测3.调试(1)安装好后,接通电源,电路没有反应,数码管不亮。

二、问题与解决如图可以看出利用两个数码管,首次焊接没有检测数码管器件为共阴极数码管,与设计程序不符,导致乱码,而后改接电路,重新安装共阳极数码管。

单片机与排座接触不良,解决方法:利用废弃的二极管的管脚,插入排座排孔,增大接触面积。

附件1.利用单片机完成一定的任务,你的创意(创新)是什么?for(j=0;j<255;j++);}void To_INT(void) interrupt 1{TH0=0x3c;TL0=0xb0;msec++;if(msec==20){msec=0;TL0=0xb0;EA=1;ET0=1;TR0=1;while(1){if(W==0){TR0=1;} if(H==0){TR0=0;}。

最新微型计算机原理试题答案

最新微型计算机原理试题答案

微型计算机原理试题答案一、填空(每空1分,共37分)1、典型的微处理器的内部结构可分为:算术逻辑控制单元(ALU)、工作寄存器、控制器和I/O控制逻辑等四部分组成。

2、8086是16位CPU,它有20根地址线,可行成1MB的存储器地址空间;有16根数据线,通过数据线能传输的有符号整数的范围为-32768 ~ +32767;有 2种工作模式;总共能管理64级中断源。

3、中断向量是中断服务程序的入口地址,(也称为中断指针),在一个微机系统中,若有4片8259A级联工作,能管理29级外部可屏蔽中断源。

4、微处理器是在统一的时钟信号CLK控制下,按节拍进行工作的,一个CLK的时间(周期)称为一个时钟周期,它是衡量微处器快慢的一个重要参数;而衡量微处器快慢的另一重要参数是指令周期,它表示执行一条指令所需的时间。

5、8088/8086汇编语言中语句的种类包括指令语句、伪指令语句和宏指令语句。

6、微型计算机的输入/输出控制方式主要有无条件传送方式、程序查询方式、I/O中断方式和DMA方式等四种方式,其中DMA 传送方式的突出优点是传送过程无须处理器的控制,数据也无须经过微处理器,而是直接在I/O设备与主存储器间进行,因此节省了微处理器的时间,使传送速率大大提高。

7、在计算机系统中,微处理器对存储器单元和I/O端口的编址方法有统一编址和独立编址两种方法,8086/8088CPU对存储器单元和I/O端口的编址采用的是统一编址方法。

当8086CPU工作在最小方式时,用于区分访问存储器或I/O端口的控制信号为M/IO。

8、若要给某8086CPU组成的微机系统配置8K字节的SRAM电路,若选用1K×4的SRAM芯片,则共需16片。

9、在某I/O端口的地址译码当中,有3条地址线未参加译码,则有8个重叠地址。

10、8086CPU的RESET信号至少应保持4个时钟周期的高电平时才有效,该信号结束后,CPU内部的CS为_0FFFFH__,IP为_0000H__。

c51单片机计数器触发机制 -回复

c51单片机计数器触发机制 -回复

c51单片机计数器触发机制-回复C51单片机是一种广泛应用的单片机芯片,它具有强大的功能和灵活的编程能力,可以用于各种计数任务。

其中,计数器是C51单片机中常用的功能模块之一,其触发机制对于实现计数功能至关重要。

本文将对C51单片机计数器的触发机制进行详细的介绍和解释。

一、C51单片机计数器概述计数器是C51单片机中的一个重要模块,它能够根据外部输入的时钟信号进行计数操作,并将计数结果输出给用户。

C51单片机中的计数器模块通常由8位或16位计数器组成。

C51单片机计数器的触发机制是指计数器在何时开始计数,并在何时停止计数的一种规则或条件。

计数器的触发机制由两部分组成,分别是计数开始触发和计数停止触发。

二、C51单片机计数器的计数开始触发1. 外部中断触发C51单片机计数器可以通过外部中断触发开始计数。

通过设置计数器的触发源为外部中断,当外部中断引脚接收到触发信号时,计数器会开始计数。

2. 定时器触发C51单片机计数器可以通过定时器触发开始计数。

定时器模块可以产生一个周期性的定时信号,该信号可以作为计数器的触发源,当定时器产生的定时信号达到设定的触发条件时,计数器会开始计数。

3. 软件触发C51单片机计数器可以通过设置软件触发开始计数。

软件触发是指通过对计数器的控制寄存器进行写操作,使计数器开始计数。

4. 硬件触发C51单片机计数器可以通过硬件触发开始计数。

硬件触发是指通过外部硬件信号来触发计数器的计数操作。

以上四种触发方式是C51单片机计数器开始计数的常见方式,用户可以根据实际需求选择合适的触发方式。

三、C51单片机计数器的计数停止触发1. 达到最大值停止触发C51单片机计数器可以通过达到最大值停止触发。

当计数器计数达到其最大值时,计数器将停止计数。

对于8位计数器而言,其最大值为255;对于16位计数器而言,其最大值为65535。

2. 软件停止触发C51单片机计数器可以通过设置软件停止触发。

软件停止触发是指通过对计数器的控制寄存器进行写操作,使计数器停止计数。

按键实现0~9999计数器 单片机

按键实现0~9999计数器 单片机

按键调节数码管显示功能:通过按键加减数码管所显示的数字按下k1加1,最大加到9999按下k2减1,最小减到0按下k3清零复位C语言程序//---------------------------------------------------------------------- //名称:按键调节数码管显示//---------------------------------------------------------------------- //功能:通过按键加减数码管所显示的数字// 按下k1加1,最大加到9999// 按下k2减1,最小减到0// 按下k3清零复位//---------------------------------------------------------------------- //姓名:陈润源//地点:内江职业技术学院//时间:2019年4月6日21:40:41//---------------------------------------------------------------------- #include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit k1 = P1^0; //加sbit k2 = P1^1; //减sbit k3 = P1^2; //复位void key(void);void display(void);uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数组char m=99,n=98; //显示初值,m,n的值决定开机显示数值//****************************************//延时程序//****************************************void delayms(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}//***********************************************//显示程序//***********************************************void display(void){P2=0X08;P0=table[m%10]; //显示个位delayms(5);P2=0X04;P0=table[m/10]; //显示十位delayms(5);P2=0X02;P0=table[n%10]; //显示百位delayms(5);P2=0X01;P0=table[n/10]; //显示千位delayms(5);}//***************************************************//按键处理//***************************************************void key(){if(k1==0) //检测按键是否被按下{ //延时消抖delayms(10);if(k1==0) //再次检测是否真正按下按键{m++; //m自加一if(m>=100) //如果m加到100则n加一 (限制m的取值范围) 个位、十位最大显示99 {n++; //n自加一m=0; //使m又从0开始计数if(n>=100) //如果n加到100则m=n=99 (限制n的取值范围) 百位、千位最大显示99 {m=99; //最大显示9999n=99;}}}while(!k1); //按键松开}if(k2==0) //检测按键是否被按下{ //延时消抖delayms(10); //再次检测是否真正按下按键if(k2==0){ //m自减一m--;if(m<=0) //如果m减到0则n减一 (限制n的取值范围) 个位、十位最小显示00 {m=99; //重新给m装初值n--; //n自减一if(n==-1) //如果n减到-1,则m=n=0 (限制n的取值范围) 百位、千位最小显示00{n=0; //最小显示0000m=0;}}}while(!k2); //按键松开}if(k3==0) //检测按键是否被按下{delayms(10); //延时消抖if(k3==0) //再次检测是否真正按下按键{m=0; //复位,显示0000n=0;}while(!k3); //按键松开}}void main(){while(1){ //调用按键检测key(); //数码管显示display(); }}。

  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以内的按键计数的仿真运行。

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

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

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

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

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

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

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

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

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

相关文档
最新文档