单片机按键加减报告
查询按键加减实验报告(3篇)
第1篇一、实验目的1. 理解按键输入的基本原理。
2. 掌握C语言编程中按键扫描和响应的实现方法。
3. 实现基于按键输入的加减功能,并能够查询结果。
二、实验环境1. 开发工具:Keil uVision52. 实验平台:STM32F103系列单片机开发板3. 外设:按键模块三、实验原理1. 按键扫描原理:通过查询或中断方式检测按键是否被按下,并判断是哪个按键被按下。
2. 单片机编程:使用C语言编写程序,实现对按键的扫描和加减功能的实现。
四、实验步骤1. 准备实验环境,连接按键模块到单片机开发板上。
2. 编写按键扫描函数,实现按键的检测和识别。
3. 编写加减功能函数,实现加法和减法运算。
4. 编写主函数,实现按键输入和结果显示。
五、实验代码```cinclude "stm32f10x.h"// 按键定义define KEY_ADD GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) // PA0define KEY_SUB GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) // PA1// 全局变量volatile int result = 0;// 按键扫描函数void KeyScan(void) {if (KEY_ADD == 0) {while (KEY_ADD == 0); // 防抖动 result += 1;}if (KEY_SUB == 0) {while (KEY_SUB == 0); // 防抖动 result -= 1;}}// 加减功能函数void AddSub(void) {KeyScan();// 显示结果// ... (此处省略显示代码)}// 主函数int main(void) {// 初始化GPIO// ... (此处省略初始化代码)while (1) {AddSub();}}```六、实验结果与分析1. 实验结果:通过按键输入,可以实现对数字的加减操作,并实时显示结果。
单片机按键实验实训报告
一、实验目的1. 理解单片机按键的工作原理和电路连接方法;2. 掌握按键消抖原理及其实现方法;3. 学会使用单片机编程控制按键功能,实现简单的输入控制;4. 提高单片机实验操作能力和编程能力。
二、实验仪器及设备1. 单片机开发板(如STC89C52);2. 按键;3. 万用表;4. 电脑;5. Keil C编译器。
三、实验原理1. 按键原理:按键是一种电子开关,按下时导通,松开时断开。
在单片机应用中,按键常用于输入控制信号。
2. 按键消抖原理:由于按键机械弹性,闭合和断开时会有一连串的抖动。
若直接读取按键状态,容易导致误操作。
因此,需要进行消抖处理。
3. 消抖方法:主要有软件消抖和硬件消抖两种方法。
本实验采用软件消抖方法,即在读取按键状态后,延时一段时间再读取,若两次读取结果一致,则认为按键状态稳定。
四、实验步骤1. 硬件连接:将按键一端接地,另一端与单片机的某个I/O口相连。
2. 编写程序:使用Keil C编译器编写程序,实现以下功能:(1)初始化I/O口,将按键连接的I/O口设置为输入模式;(2)读取按键状态,判断按键是否被按下;(3)进行消抖处理,若按键状态稳定,则执行相应的功能。
3. 编译程序:将编写好的程序编译成HEX文件。
4. 烧录程序:将编译好的HEX文件烧录到单片机中。
5. 实验验证:观察实验现象,验证按键功能是否实现。
五、实验结果与分析1. 硬件连接正确,程序编译无误。
2. 实验现象:当按下按键时,单片机执行相应的功能;松开按键后,按键功能停止。
3. 分析:通过软件消抖处理,有效避免了按键抖动导致的误操作。
六、实验总结1. 本实验成功实现了单片机按键控制功能,掌握了按键消抖原理及实现方法。
2. 通过实验,提高了单片机编程和实验操作能力。
3. 在后续的单片机应用中,可以灵活运用按键控制功能,实现各种输入控制需求。
4. 本次实验为单片机应用奠定了基础,为进一步学习单片机技术打下了良好基础。
单片机2位加减乘除(参考实验范例)
first_ge equ 60h ;伪指令first_shi equ 61hsecond_ge equ 62hsecond_shi equ 63hresult_ge equ 64hresult_shi equ 65hresult_bai equ 66hresult_qian equ 67hal equ 68hp_can bit 40hc_can bit 41hover bit 42horg 0000hljmp startorg 0050hstart:mov first_ge,#0mov first_shi,#0mov second_ge,#0mov second_shi,#0mov al,#5mov result_ge,#0mov result_shi,#0mov result_bai,#0mov result_qian,#0mov 45h,#0mov 46h,#0mov 35h,#0mov 36h,#0mov 37h,#0mov 38h,#0clr p_canclr c_canclr overmov 10h,#0main: lcall xianshimov p0,#0f0hmov a,p0cjne a,#0f0h,next ;判断是否有键按下ljmp mainnext: lcall delay ;延时去斗mov p0,#0f0hmov a,p0cjne a,#0f0h,key_num ;确定有键按下ljmp mainlcall xianshikey_num:mov p0,#0f0h ;取键值mov a,p0mov 20h,amov p0,#0fhmov a,p0add a,20hmov 10h,await: mov P0,#0f0h ;等键放开mov a,P0cjne a,#0f0h,waitmov a,10hlcall displaylcall xianshiljmp main;============================== display: ;判断键值cjne a,#0eeh,next1ljmp display0next1:cjne a,#0edh,next2ljmp display1next2:cjne a,#0ebh,next3ljmp display2next3:cjne a,#0e7h,next4ljmp display3next4:cjne a,#0deh,next5ljmp display4next5:cjne a,#0ddh,next6ljmp display5next6:cjne a,#0dbh,next7ljmp display6next7:cjne a,#0d7h,next8ljmp display7next8:cjne a,#0beh,next9ljmp display8next9:cjne a,#0bdh,nextaljmp display9nexta:cjne a,#0bbh,nextbljmp displayanextb:cjne a,#0b7h,nextcljmp displaybnextc:cjne a,#7eh,nextdljmp displaycnextd:cjne a,#7dh,nexteljmp displaydnexte:cjne a,#7bh,nextfljmp displayenextf:cjne a,#77h,wrongljmp displayfwrong:ret;===================================display0: ;1jb c_can,d_0_0jb p_can,d_0_1mov first_ge,#1setb p_canretd_0_1: mov 61h , 60hmov 60h,#1retd_0_0:jb p_can,d_0_2mov second_ge,#1setb p_canretd_0_2:mov 63h , 62hmov 62h,#1retdisplay1: ;4jb c_can,d_1_0jb p_can,d_1_1mov first_ge,#4setb p_canretd_1_1: mov 61h , 60hmov 60h,#4retd_1_0:jb p_can,d_1_2mov second_ge ,#4setb p_canretd_1_2: mov 63h , 62hmov 62h,#4retdisplay2: ;7jb c_can,d_2_0jb p_can,d_2_1mov first_ge,#7setb p_canretd_2_1: mov 61h , 60hmov 60h,#7retd_2_0:jb p_can,d_2_2mov second_ge,#7setb p_canretd_2_2:mov 63h , 62hmov 62h,#7setb p_canretdisplay3: ;clrmov first_ge,#0mov first_shi,#0mov second_ge,#0mov second_shi,#0mov al,#5mov result_ge,#0mov result_shi,#0mov result_bai,#0mov result_qian,#0mov 45h,#0mov 46h,#0mov 35h,#0mov 36h,#0mov 37h,#0mov 38h,#0clr p_canclr c_canclr overmov 10h,#0retdisplay4: ;2jb c_can,d_4_0jb p_can,d_4_1mov first_ge,#2setb p_canretd_4_1: mov 61h , 60hmov 60h,#2retd_4_0:jb p_can,d_4_2mov second_ge,#2setb p_canretd_4_2:mov 63h , 62hmov 62h,#2setb p_canretdisplay5: ;5jb c_can,d_5_0jb p_can,d_5_1mov first_ge,#5setb p_canretd_5_1: mov 61h , 60hmov 60h,#5retd_5_0: jb p_can,d_5_2mov second_ge,#5setb p_canretd_5_2:mov 63h , 62hmov 62h,#5setb p_canretdisplay6: ;8jb c_can,d_6_0jb p_can,d_6_1mov first_ge,#8setb p_canretd_6_1: mov 61h , 60hmov 60h,#8retd_6_0:jb p_can,d_6_2mov second_ge,#8setb p_canretmov 62h,#8setb p_canretdisplay7: ;0jb c_can,d_7_0jb p_can,d_7_1mov first_ge,#0setb p_canretd_7_1: mov 61h , 60hmov 60h,#0retd_7_0:jb p_can,d_7_2mov second_ge,#0setb p_canretd_7_2:mov 63h , 62hmov 62h,#0setb p_canretdisplay8: ;3jb c_can,d_8_0jb p_can,d_8_1mov first_ge,#3setb p_canretd_8_1: mov 61h , 60hmov 60h,#3retd_8_0:jb p_can,d_8_2mov second_ge,#3setb p_canretd_8_2:mov 63h , 62hmov 62h,#3setb p_canretdisplay9: ;6jb c_can,d_9_0jb p_can,d_9_1mov first_ge,#6setb p_canretmov 60h,#6retd_9_0:jb p_can,d_9_2mov second_ge,#6setb p_canretd_9_2:mov 63h , 62hmov 62h,#6setb p_canretdisplaya: ;9jb c_can,d_a_0jb p_can,d_a_1mov first_ge,#9setb p_canretd_a_1: mov 61h , 60hmov 60h,#9retd_a_0:jb p_can,d_a_2mov second_ge,#9setb p_canretd_a_2:mov 63h , 62hmov 62h,#9setb p_canretdisplayb: ;=setb overmov a,al;````````````````cjne a,#0,d_b_0 ;加法程序mov a,first_shiswap aorl a,first_gemov 45h,amov a,second_shiswap aorl a,second_geadd a,45hda ajnc bai_no_addmov result_bai,#1bai_no_add:mov 46h,aanl a,#0fhmov result_ge,amov a,46hanl a,#0f0hswap amov result_shi,aret;``````````````````````````````d_b_0:cjne a,#1,d_b_1 ;减法程序mov a,first_shiswap aorl a,first_gemov 45h,amov a,second_shiswap aorl a,second_gemov 46h,amov a,#9ah ;取补码9ahsubb a,46hadd a,45hda amov 46h,aanl a,#0fhmov result_ge,amov a,46hanl a,#0f0hswap amov result_shi,aret;``````````````````d_b_1:cjne a,#2,tiao ;乘法程序sjmp chengtiao:ljmp d_b_2;-----------------;十进制个位与个位相乘cheng:mov a,first_gemov b,second_gemul ab ;结果不大于81,存放于a中mov b,#10div ab ;十位数存于a,个位数存于bmov result_ge,b ;求出个位数mov 35h,a ;存十位寄35h;-----------------;个位与十位相乘mov a,first_shimov b,second_gemul abmov b,#10div abmov 36h,a ; 存百位寄存36hmov a,badd a,35hmov 35h,a ;clr csubb a,#10jc bai_no_jin_1inc 36h;如有进位,加一mov 35h,abai_no_jin_1:mov a,36hclr csubb a,#10jc qian_no_jin_1inc 37hmov 36h,aqian_no_jin_1: ;----------------------;十位与个位相乘mov a,first_gemov b,second_shimul abmov b,#10div abmov 33h,a ;结果寄放clr cmov a,badd a,35hmov 35h,a ;十位处理clr csubb a,#10jc bai_no_jin_2inc 36hmov 35h,abai_no_jin_2:mov a,33hadd a,36hmov 36h,a ;百位处理clr csubb a,#10 ;千位处理jc qian_no_jin_2inc 37hmov 36h,aqian_no_jin_2:;--------------------------;十位与十位相乘mov a,first_shimov b,second_shimul abmov b,#10div abmov 33h,aclr cmov a,badd a,36hmov 36h,aclr csubb a,#10jc qian_no_jin_3inc 37hmov 36h,aqian_no_jin_3:mov a,33hadd a,37hmov 37h,a ;--mov result_shi,35hmov result_bai,36hmov result_qian,37hret;```````````````````````````d_b_2:cjne a,#3,d_b_3 ;除法程序mov a,first_shiswap aorl a,first_gemov 45h,a ;第一个bcd码数字存放mov a,second_shiswap aorl a,second_gemov 46h,a ;第二个bcd码数字存放recom:mov a,45hclr csubb a,46hjc xiaomov a,#9ahsubb a,46hadd a,45hda amov 45h,ainc 38hjmp recomxiao:mov a,38hmov b,#10div abmov result_shi,amov result_ge,bret;d_b_3:retdisplayc: ;+mov al,#0setb c_canclr p_canretdisplayd: ;-mov al,#1setb c_canclr p_canretdisplaye: ;*mov al,#2setb c_canclr p_canretdisplayf: ;/mov al,#3setb c_canclr p_canret;========================delay:mov r7,#10loop0:mov r6,#08fhloop1:djnz r6,loop1djnz r7,loop0ret ;===================================xianshi:mov dptr,#TABjb over,over_loopjb c_can,c_loopmov a,first_ge ;显示第一个数movc a,@a+dptrmov P1,amov P2,#0fehlcall delaymov P1,#0ffhmov P2,#0ffhmovc a,@a+dptrmov P1,amov P2,#0fdhlcall delaymov P1,#0ffhmov P2,#0ffhret;-----------------------;显示第二个数c_loop:mov a,second_gemovc a,@a+dptrmov P1,amov P2,#0fehlcall delaymov P1,#0ffhmov P2,#0ffhmov a,second_shimovc a,@a+dptrmov P1,amov P2,#0fdhlcall delaymov P1,#0ffhmov P2,#0ffhretover_loop: ;显示运算结果mov a,result_gemovc a,@a+dptrmov P1,amov P2,#0fehlcall delaymov P1,#0ffhmov P2,#0ffhmov a,result_shimovc a,@a+dptrmov P1,amov P2,#0fdhlcall delaymov P1,#0ffhmov P2,#0ffhmov a,result_baimovc a,@a+dptrmov P1,amov P2,#0fbhlcall delaymov P2,#0ffhmov a,result_qianmovc a,@a+dptrmov P1,amov P2,#0f7hlcall delaymov P1,#0ffhmov P2,#0ffhretTAB: DB 0C0H,0F9H,0A4H,0B0H,99H ;0,1,2,3,4, DB 92H,82H,0F8H,80H,90H ;5,6,7,8,9,DB 88H,83H,0C6H,0A1H,86H ;A,B,C,D,E,DB 8EH;f。
单片机原理与应用---按键计数器实验报告
实验报告(2021--2022学年第二学期)课程名称:单片机原理与应用实验项目名称:按键计数器实验一、实验目的1.掌握数码管的动态显示方法;2.掌握独立按键的扫描及去抖动方法。
二、实验仪器1、安装Keil uVison4的计算机;2、USB转串口驱动CH341SER.EXE;3、ISP下载软件stc-isp-15xx-v6.82e.exe;4、单片机开发板一块和USB线(公对公)一条。
三、实验内容编写程序对独立按键进行扫描,根据不同的按键完成不同的操作。
当S2按下时,执行加1操作;当S3按下时,执行减1操作;当S4按下时,执行加2操作;当S5按下时,执行减2操作,并将按键计数值显示在数码管上,显示格式如下所示。
四、实验步骤①在桌面建立一个文件夹。
先用Keil软件建立一个新的工程,芯片选择STC里的89C52RC芯片。
然后新建空白文件,将其保存为后缀为“.c”的文件并添加到这个工程中。
②根据实验要求把要调用的函数做出声明,按要求将代码编写完成。
写完之后要点击“Target Options”选项,在“Output”选项选择“Create HEX File”,将文件编译后生成后缀为“.hex”的文件。
③将程序烧入开发板中并运行,根据实验要求按下S2、S3、S4、S5按钮并拍照记录实验结果。
五、实验原始数据记录与数据处理#include <reg52.h>sbit WE=P2^7;sbit DU=P2^6;unsigned char code table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X0 7,0X7F,0X6F,0X00,0X40};unsigned char dspbuf[]={0,1,2,2,11,1,4,5};unsigned char dspcom;void delayms(unsigned int x);void Display();unsigned char counter;void main(){unsigned char temp;while(1){Display();P3=0X0F;/temp=P3&0X0F;if(temp!=0x0F);{delayms(10);temp=P3&0X0F;if(temp!=0X0F);{switch(temp){case 0X0E:counter--;break;case 0X0D:counter++;break;case 0X0b:counter+=2;break; case 0X07:counter-=2;break; default:break;}dspbuf[5]=counter/100;dspbuf[6]=counter/10%10;dspbuf[7]=counter%10; while((P3&0X0F)!=0X0F);}}}}void Display(){P0=0X00;DU=1;DU=0;P0=~(1<<dspcom);WE=1;WE=0;P0=table[dspbuf[dspcom]];DU=1;DU=0;if(++dspcom==8)dspcom=0;}void delayms(unsigned int x) {unsigned int i,j;for(i=x;i>0;i--);for(j=113;j>0;j--);}六、实验结果与分析讨论根据编写的程序,第一次运行时,显示的是“0138-122”当S2按下时,执行加1操作,屏幕显示为“0138-123”,当S3按下时,执行减1操作,屏幕显示还原为“0138-122”。
单片机实践简易计算器实验报告
单片机实践简易计算器实验报告本次实验的目的是通过单片机实现一个简易计算器,实现加减乘除四则运算。
在实验过程中,我们使用了STC89C52单片机,通过编写程序实现计算器的功能。
实验步骤:1. 确定硬件电路连接我们需要确定硬件电路连接。
本次实验使用的是STC89C52单片机,需要将其与LCD1602液晶屏、4x4矩阵键盘、蜂鸣器等硬件连接。
具体连接方式如下:STC89C52单片机:P0口:连接LCD1602液晶屏的数据线D0-D7P1口:连接LCD1602液晶屏的控制线RS、RW、EP2口:连接4x4矩阵键盘的行线R1-R4P3口:连接4x4矩阵键盘的列线C1-C4P4口:连接蜂鸣器2. 编写程序接下来,我们需要编写程序实现计算器的功能。
程序主要分为以下几个部分:(1)LCD1602液晶屏初始化(2)4x4矩阵键盘扫描(3)计算器功能实现(4)LCD1602液晶屏显示结果3. 调试程序编写完程序后,我们需要进行调试。
在调试过程中,我们需要注意以下几点:(1)检查硬件连接是否正确(2)检查程序是否有语法错误(3)检查程序是否能够正常运行4. 实验结果经过调试,我们成功实现了一个简易计算器。
在使用过程中,用户可以通过4x4矩阵键盘输入数字和运算符,计算器会自动进行计算,并在LCD1602液晶屏上显示结果。
同时,计算器还具有清零、退格等功能,方便用户进行操作。
总结:通过本次实验,我们学习了单片机的基本原理和编程方法,掌握了如何使用单片机实现一个简易计算器。
同时,我们还学习了如何进行硬件电路连接和程序调试,提高了我们的实践能力和动手能力。
单片机实验五报告_单片机键盘实验
单片机实验五报告_单片机键盘实验一、实验目的本次单片机键盘实验的主要目的是让我们深入了解单片机与键盘的接口技术,掌握如何通过编程实现对键盘输入的检测和响应,从而提高我们在单片机应用开发中的实际操作能力。
二、实验原理在单片机系统中,键盘通常是作为输入设备使用的。
常见的键盘有独立式键盘和矩阵式键盘两种类型。
独立式键盘是每个按键单独占用一根 I/O 线,其优点是电路简单,编程容易,但缺点是占用较多的 I/O 口资源。
矩阵式键盘则是将按键排列成矩阵形式,通过行线和列线的交叉来识别按键。
这种方式可以有效地节省 I/O 口资源,但电路和编程相对复杂一些。
在本次实验中,我们采用了矩阵式键盘。
其工作原理是通过逐行扫描或者逐列扫描的方式,检测行线和列线的电平状态,从而确定按下的按键。
三、实验设备及材料1、单片机开发板一块2、计算机一台3、编程软件(如 Keil C51)4、下载工具(如 STCISP)四、实验步骤1、硬件连接将矩阵式键盘与单片机的 I/O 口进行连接,注意行线和列线的对应关系。
连接好电源和地线,确保硬件电路正常工作。
2、软件编程打开编程软件,创建一个新的工程。
编写初始化程序,包括设置 I/O 口的工作模式、中断等。
编写键盘扫描程序,通过循环扫描行线和列线的电平状态,判断是否有按键按下。
当检测到按键按下时,根据按键的编码执行相应的操作,如在数码管上显示按键值、控制 LED 灯的亮灭等。
3、编译和下载对编写好的程序进行编译,检查是否有语法错误。
如果编译成功,使用下载工具将程序下载到单片机中。
4、实验调试观察硬件电路的工作状态,看是否有异常现象。
按下不同的按键,检查程序的响应是否正确。
如果出现问题,通过调试工具(如单步调试、断点调试等)查找并解决问题。
五、实验代码以下是本次实验的部分关键代码:```cinclude <reg51h>//定义键盘的行和列define ROW_NUM 4define COL_NUM 4//定义行线和列线的端口sbit ROW1 = P1^0;sbit ROW2 = P1^1;sbit ROW3 = P1^2;sbit ROW4 = P1^3;sbit COL1 = P1^4;sbit COL2 = P1^5;sbit COL3 = P1^6;sbit COL4 = P1^7;//定义按键值的编码unsigned char code KeyCodeMapROW_NUMCOL_NUM ={{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'','0','','D'}};//键盘扫描函数void KeyScan(){unsigned char i, j, temp;unsigned char keyValue = 0;//逐行扫描for (i = 0; i < ROW_NUM; i++){//先将所有行线置高电平ROW1 = ROW2 = ROW3 = ROW4 = 1;//将当前行线置低电平switch (i){case 0: ROW1 = 0; break;case 1: ROW2 = 0; break;case 2: ROW3 = 0; break;case 3: ROW4 = 0; break;}//读取列线的电平状态temp = COL1 | COL2 | COL3 | COL4;//如果有列线为低电平,则表示有按键按下if (temp!= 0xF0){//延迟去抖动delay_ms(10);//再次读取列线的电平状态temp = COL1 | COL2 | COL3 | COL4; if (temp!= 0xF0){//确定按下的按键for (j = 0; j < COL_NUM; j++){if ((temp &(1 << j))== 0){keyValue = KeyCodeMapij;break;}}//执行相应的操作switch (keyValue){case '1'://具体操作break;case '2':break;//其他按键的操作}}}}}//主函数void main(){while (1){KeyScan();}}```六、实验结果及分析在实验过程中,我们成功地实现了对矩阵式键盘的输入检测,并能够根据不同的按键执行相应的操作。
PIC之闪烁显示及按键的串键加减实验
PIC之闪烁显示及按键的串键加减实验实验环境: Proteus编程语言:汇编编程环境: MPLAB单片机:PIC16F877晶振:20MHz功能说明:该实验旨在对按键调试过程中的闪烁显示和串键加减进行研究和实验,如图所示.主体显示采用的是定时器定时的数字时钟,为防止误按加减而导致时钟数据的改变,采用了两级锁定的方式,首先要按下总键,按一次进入分钟调试,两次为小时,第三次退出按键模式.在按键调试模式下,还要按移位键才能对分钟或小时进行加减,按下移位键后(可通过它选择是对十位调节还是对个位调节),选中的位会闪烁显示,然后才可通过加减键对数值进行调节.长按加减键半秒以上可实现连加连减.图(1)无按键显示图图(2)按移位键后的闪烁显示,上图为个位闪烁,下图(3)为十位闪烁图(3)部分源程序:;*******************ORG 0X0000GOTO MAINORG 0X0004MOVWF BWSW APF STA TUS,0CLRF STA TUSMOVWF BSTA TUSMOVF FSR,0MOVWF BFSRMOVF PCLA TH,0MOVWF BPCH;***************************以上是中断现场保护CLRF PCLA THBTFSS INTCON,5GOTO INTOUTBTFSC INTCON,2GOTO T0INT;******************以上是中断源判别INTOUT: CLRF STA TUSMOVF BFSR,0MOVWF FSRMOVF BPCH,0MOVWF PCLA THSW APF BSTA TUS,0MOVWF STA TUSSW APF BW,1SW APF BW,0RETFIE;***********************************以上是中断现场恢复T0INT: BCF INTCON,2MOVLW 0X14MOVWF TMR0INCF T01MMOVLW .20;1ms刷新一次显示XORWF T01M,0BTFSS STA TUS,ZGOTO INTOUTCLRF T01MCLRF PORTDMOVLW .8SUBWF DSPC,0;DSPC起到显示指针的作用BTFSC STA TUS,CCLRF DSPCMOVF DSPC,0ADDLW DIS0MOVWF FSRBTFSC FLAG1,6;移位标志BTFSS FLAG1,5;闪烁标志GOTO NSHFTMOVLW .5BTFSC FLAG1,1MOVLW .2MOVWF SHIFT1MOVF SHIFT,0BTFSC STA TUS,ZGOTO NSHFTSUBWF SHIFT1,0XORWF DSPC,0BTFSS STA TUS,ZGOTO NSHFTCLRF ICOMMOVLW ICOMMOVWF FSRNSHFT: MOVLW H'E8'ANDWF PORTAMOVF DSPC,0IORWF PORTAMOVF INDF,0MOVWF PORTDINCF DSPCDECFSZ T020MGOTO INTOUTMOVLW .23MOVWF T020MBSF FLAG1,7DECFSZ T01SGOTO INTOUTMOVLW .39MOVWF T01SINCF SECONDMOVLW .60XORWF SECOND,0BTFSS STA TUS,ZGOTO INTOUTCLRF SECONDINCF MINUTEMOVLW .60XORWF MINUTE,0BTFSS STA TUS,ZGOTO INTOUTCLRF MINUTEINCF HOURMOVLW .24XORWF HOUR,0BTFSS STA TUS,ZGOTO INTOUTCLRF HOURGOTO INTOUT;************************************************* MAIN: CALL INITGOTO KEYSCAN;*******待分解数据在com0中,显示单元在FSR中******** LEDS: SW APF COM0,0ANDLW H'0F'CALL LEDDISMOVWF INDFINCF FSRMOVF COM0,0ANDLW H'0F'CALL LEDDISMOVWF INDFINCF FSRRETURN;***********************************************LEDDIS: ADDWF PCLDT 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6FDT 0X77,0X7C,0X39,0X5E,0X79,0X71;****************************;************除十,被除数存入com3,出口:com3为商,com5为余数DIV10: MOVLW D'10'MOVWF COM4CLRF COM5MOVLW D'8'MOVWF COM6DIV101: BCF STA TUS,CRLF COM3RLF COM5BSF COM3,0MOVF COM4,0SUBWF COM5BTFSS STA TUS,CCALL ADDDECFSZ COM6GOTO DIV101RETURNADD: MOVF COM4,0ADDWF COM5BCF COM3,0RETURN;********************************************************** MUL10: MOVF COM3,0;八位乘10MOVWF COM4BCF STA TUS,CRLF COM3RLF COM3RLF COM3RLF COM4,0ADDWF COM3,0RETURNKEYSCAN:BTFSS FLAG1,7GOTO DISBCF FLAG1,7;定时20msGOTO $+9INCF T0SHMOVLW .15XORWF T0SH,0;BTFSS STA TUS,ZGOTO $+4CLRF T0SHMOVLW H'20'XORWF FLAG1;每隔半秒左右取反flag1,5MOVF PORTB,0ANDLW H'F0'XORLW H'F0'BTFSC STA TUS,Z;判断是否有键按下GOTO NKEYMOVWF KEYCOM0INCF KEYCMOVLW .30XORWF KEYC,0BTFSS STA TUS,ZGOTO DISCLRF KEYC;按键计时单元BTFSC KEYCOM0,KEY2GOTO KADDBTFSC KEYCOM0,KEY3GOTO KSUBGOTO DISNKEY: CLRF KEYCBTFSC KEYCOM0,KEY0GOTO KSETBTFSC KEYCOM0,KEY1GOTO SHFTBTFSC KEYCOM0,KEY2GOTO KADDBTFSS KEYCOM0,KEY3GOTO DISKSUB: BTFSC FLAG1,0BTFSS FLAG1,6GOTO KOUTMOVLW MINUTEBTFSC FLAG1,1MOVLW HOURMOVWF FSRMOVLW .1MOVLW .10SUBWF INDFMOVLW .59BTFSC FLAG1,1MOVLW .23BTFSC INDF,7;无论哪个键按下,处理后都要清KEYCOM0键值寄存器MOVWF INDFGOTO KOUTKSET: BTFSC FLAG1,0GOTO KSET1BSF FLAG1,0GOTO KOUTKSET1: INCF FLAG1BSF FLAG1,0CLRF SHIFTBTFSC FLAG1,2CLRF FLAG1GOTO KOUTSHFT: BTFSS FLAG1,0GOTO KOUTINCF SHIFTMOVLW .3SUBWF SHIFT,0BTFSS STA TUS,CGOTO $+3MOVLW .1MOVWF SHIFTBSF FLAG1,6GOTO KOUTKADD: BTFSC FLAG1,0BTFSS FLAG1,6GOTO KOUTMOVLW MINUTEBTFSC FLAG1,1MOVLW HOURMOVWF FSRMOVLW .1BTFSC SHIFT,1MOVLW .10ADDWF INDFMOVLW .60BTFSC FLAG1,1MOVLW .24BTFSC STA TUS,CCLRF INDFGOTO KOUTKOUT: CLRF KEYCOM0DIS: MOVF SECOND,0MOVWF COM3CALL DIV10MOVF COM5,0CALL LEDDISMOVWF DIS7MOVF COM3,0CALL LEDDISMOVWF DIS6MOVF MINUTE,0MOVWF COM3CALL DIV10MOVF COM5,0CALL LEDDISMOVWF DIS4MOVF COM3,0CALL LEDDISMOVWF DIS3MOVF HOUR,0MOVWF COM3CALL DIV10MOVF COM5,0CALL LEDDISMOVWF DIS1MOVF COM3,0CALL LEDDISMOVWF DIS0GOTO KEYSCANINIT: CLRF INTCON;初始化函数CLRF PIR1CLRF PIR2CLRF FLAG1CLRF FLAG2MOVLW .1MOVWF T01SMOVWF T020MMOVWF T0TMMOVWF T01MBANKSEL TRISACLRF PIE1CLRF PIE2MOVLW H'F0'MOVWF TRISBCLRF TRISACLRF TRISDMOVLW H'0F'MOVWF OPTION_REGBANKSEL PORTAMOVLW H'06'MOVWF DIS0MOVLW H'66'MOVWF DIS1MOVLW H'40'MOVWF DIS5MOVWF DIS2MOVLW H'7F'MOVWF DIS4MOVLW H'6D'MOVWF DIS3MOVLW H'4F'MOVWF DIS6MOVLW H'3F'MOVWF DIS7MOVLW .14MOVWF HOURMOVLW .58MOVWF MINUTEMOVLW .30MOVWF SECONDMOVLW H'14'MOVWF TMR0MOVLW H'E0'MOVWF INTCONRETURNEND。
按键式加减计数器 论文
北方民族大学电子制作报告学院电气信息工程专业测控技术与仪器班级测控一班课程名称数字电子技术设计题目名称按键式加减计数器组长姓名及学号余金权 20120425组员姓名及学号马涛 20120399 李波 20120382 许鑫凯 20120422 顾磊 20120377 马俊 20120395 起止时间2013年11月17号至 2013年12月30号北方民族大学电气信息工程学院制摘要计数器是数字电路中最为基本的一个单元电路。
本次实验的目标是要我们参考资料设计一个十进制按键式加减计数器,学会利用软件(Proteus)对电路进行仿真,并会简单的dxp制板操作。
实验报告简要地陈述了电路结构,然后就对其有关理论知识作了一些简要的介绍,设计出整体电路图并且在软件Proteus中进行仿真,最后通过protel 做出电路板验证是否达到技术要求,总结实验体会。
关键字:计数器,脉冲,按键式目录1.设计任务与要求 (1)2.参考电路及完善 (2)2.1参考电路 (2)2.2完善的电路图 (3)3.电路原理 (4)3.1脉冲发生电路 (4)3.2加减计数器电路 (7)3.3时间显示电路 (8)4.Proteus仿真 (9)5.制板与调试 (10)5.1DXP注意事项 (10)5.2制作PCB板的流程 (11)5.3注意事项 (11)5.4调试结果与分析 (12)6.实验总结 (12)1.设计任务及要求1.1设计任务用一个拨动开关控制加减,用按键或一个秒脉冲发生器来产生时钟脉冲,当开关拨动到加时,按键实现加计数,当开关拨动到减时,按键实现减计数。
该设计包括秒脉冲发生器电路(或按键)、计数器加减控制、显示译码器和数码管4个部分。
通过一个开关来控制加减计数控制,通过按键来实现加减计数。
显示译码器驱动数码显示对应时间,秒脉冲电路给计数器提供时钟脉冲。
1.2设计要求(1)要做出multisim或proteus仿真图。
(2)要做出protel原理图和PCB图,设置最小线宽及线间距大于等于8mil (0.2mm),焊盘内径为20mil-40mil(0.6-1mm),焊盘外径大于等于60mil (1.5mm)。
单片机实验报告——加减法
单片机实验一一、实验目的1.学习多字节压缩BCD 码加减法运算的程序设计;2.学习单字节有符号数加减运算的程序设计。
二、实验设备统一电子开发平台三、实验要求1.编写通用4 字节压缩BCD 码的加、减法运算程序;2.编写通用单字节有符号二进制数加、减法运算程序;四、实验原理对于简单的8 位加减可以直接调用指令就可以了。
例如加法可以使用指令ADD 以及带进位加ADDC,但单字节加减法只能在256 之内进行运算;在实际应用中经常需要进行多字节运算,从而处理更大的数据。
该实验介绍单片机BCD 码多字节加、减运算通用程序的设计。
1.多字节无符号压缩BCD 码加法运算假设多字节无符号被加数的最低字节的地址为R0,加数的最低字节地址为R1,字节数共为len;计算结果的地址于被加数相同。
◆入口参数:R0:被加数地址指针;R1:加数地址指针;len:字节数。
◆出口参数:@R0:计算结果;rLen:计算结果字节数。
◆使用资源:ACC,R0、R1,内部RAM 单元len、rlen 及存放被加数、加数、计算结果的内存单元。
示例程序如下:;多字节无符号压缩BCD 码加法运算rlen data 30h; 存放计算结果字节数len data 31h; 存放相加字节数; r0 定位40h,r1 定位50h; 此处的程序的问题是前面字节的进位没有处理,; 只是对最后字节相加处理了进位ORG 0000h;ADDl: PUSH PSW ;保护标志寄存器内容CLR C ;进位位清0MOV rlen,#00H ;和的字节数先清0ADD: MOV A,@R0 ;取被加数ADD A,@R1 ;求和DA A ;十进制调整MOV @R0,A ;保存INC R0 ;地址增1INC R1INC rlen ;字节数增1DJNZ len,ADD ;所有字节未加完继续,否则向下执行JNC ADD20 ;和的最高字节无进位转ADD20MOV @R0,#01H ;和的最高字节地址内容为01HINC rlenADD20: POP PSWRETEND多字节加法运算一般是按从低字节到高字节的顺序进行的,所以必须考虑低字节向高字节的进位情况,被加数和加数的压缩BCD 码,最大不超过99,而99+99+1(进位)=199,此时不需要使用ADDC 指令,但当两字节当最低两字节相加后,必须使用“DA A”进行十进制调整,调整后产生进位。
按键加减计数(数码管显示,中断方式)
按键加减计数(数码管显⽰,中断⽅式)按键加减计数(数码管显⽰,中断⽅式)(合肥⼯⼤周宁)课程设计对象A08电⽓⼯程及⾃动化本科班,共38+39⼈。
⼀.课程设计的任务和⽬的本课程设计要求学⽣在1.5周内编程设计⼀个单⽚机应⽤系统,完成设计报告。
通过设计实践,使学⽣掌握单⽚机的应⽤特点、编程⽅法,学会单⽚机实际应⽤系统的设计开发过程及设计报告的规范书写,为毕业设计打下良好的基础。
⼆.课程设计内容及要求(⼀)、课程设计题⽬可从如下⽅⾯参考选择(⾃⼰出题的必须经⽼师批准):1.单⽚机在计时控制⽅⾯的应⽤设计。
如:时钟、频率计、彩灯、交通灯2.单⽚机在计数控制⽅⾯的应⽤设计。
如:计数器、计分器、抢答器、报警器3.单⽚机在运算控制⽅⾯的应⽤设计。
如:密码锁、计算器、乒乓球游戏机4.单⽚机在波形发⽣⽅⾯的应⽤设计。
如:电⼦琴、⾳乐盒、调光LED灯5.单⽚机在通讯技术⽅⾯的应⽤设计。
如:双机通讯、PC可控单⽚机系统、对话机器⼈6.单⽚机A/D转换技术⽅⾯的应⽤设计。
如:电压表、温度计、照度计(⼆)、具体要求:1.完成控制程序的编制,能演⽰系统功能。
2.完成设计并上交纸质设计报告1份。
3.系统功能要求及设计报告格式范⽂见附件1、附件2。
三.时间与学时安排1.课程设计时间在本学期第16-17周(共1.5周)。
2.总体教学时间安排:课程设计成绩按学⽣设计报告按五级评分制综合评定。
六.评分标准1.设计报告:按版⾯格式、⽂字语法、观点正确性、图表规范性等综合评分。
机电⼯程学院电⽓系胡佳⽂2010年12⽉12⽇附件1:单⽚机原理与应⽤课程设计功能要求1.单⽚机在计时控制⽅⾯应⽤的设计功能要求:(1)时钟能计时,可校准时间,⾄少有⼀种附带功能(如秒表、定时器或闹钟功能);(2)频率计能测试并显⽰1HZ—10KHZ频率、5V的⽅波,可附带⽅波发⽣器功能;(3)彩灯要求控制16个LED有两种以上闪烁⽅式;(4)交通灯要求模拟控制⼗字路⼝交通信号,有倒计时显⽰。
单片机按键实验报告
单片机按键实验报告篇一:单片机按键扫描实验报告键盘扫描一.实验目的(1)掌握矩阵键盘接口电路和键盘扫描编程方法。
(2)掌握按键值处理与显示电路设计。
二.实验任务(1)设计4*4键盘,编写各个键的特征码和对应的键值(0~F);(2)编程扫描按键,将按键对应的数字值使用数码管显示出来。
三.实验电路及连线方法1.采用动态显示连线方法:电路由2 片74LS573,1 个六字一体的共阴数码管组成。
由U15 输出段选码,U16 做位选码,与单片机的采用I/O 口连接方式,短路片J22 连接P2.0,J23 连接P2.3,做输出信号锁存。
(实际电路连接是d7-d6-d5-d4-d3-d2-d1-d0?h-c-d-e-g-b-a-f)。
PW12 是电源端。
2.键盘电路连线方法:电路由16 个按键组成,用P1 口扩展4×4 行列式键盘。
J20 是键盘连接端,连接到P1 口。
J21 是行列键盘、独立键盘选择端,当J21 的短路片连接2-3脚时,构成4×4 行列式键盘;当J21 的短路片连接2-1 脚时,可形成3×4 行列式键盘,4 个独立式按键S4、S8、S12、S16,这4 个独立按键分别连接P1.4~P1.7;其他12 个键3×4 行列式键盘。
PW15 是电源端。
四.编程思路1.采用反转法识别按键的闭合。
2.采用动态显示将键值显示出来。
五.算法流程图六.资源分配1.用P1口进行查找按键2.用R3做键值指针3.用R1做动态显示为选码指针。
4.R5为延时指针。
七.程序设计KPIN:ORG MOV MOV ANL MOV 0000H P1,#0F0H A,P1 A,#0F0H B,AMOVP1,#0FHMOVA,P1ANLA,#0FHORLA,BCJNE A,#0FFH,KPIN1AJMP EXITKPIN1: MOVB,AMOVDPTR,#TABKPMOVR3,#0KPIN2: MOVA,R3MOVC A,@A+DPTRCJNE A,B,KPIN3MOVA,R3LOOP: MOVR1,#0FEH;键盘动态显示 LOOP1: MOVA,R3ANLA,#0FHMOV DPTR,#TABMOVC A,@A+DPTRCLRP2.0CLRP2.1MOVP0,ASETB P2.0NOPCLRP2.0LOOP2: MOVA,R1;位选码MOVP0,ASETB P2.1MOVR5,#250LOOP3: DJNZ R5,LOOP3CLRP2.1SJMP LOOPKPIN3: INCR3CJNE A,#0FFH,KPIN2EXIT: RETTABKP: DB0EEH,0DEH,0BEH,7EH,0EDH,0DDH,0BDH,7DH,0EBHDB 0DBH,0BBH,7BH,0E7H,0D7H,0B7H,77H,67H,0FFHTAB: DB77H,44H,3EH,6EH,4DH,6BH,7BH,46H,7FH,6FH,5FHDB 79H,33H,7CH,3BH,1BHEND八.调试出现的问题及解决问题1:程序正常运行,但按键显示出现乱码解决:动态显示笔形码错误,并改正。
用单片机语言设计16位加法计算器实验报告
湖北第二师范学院计算机学院09计应单片机课程设计实验报告课程设计名称:电子计算器课程设计单位:10计应(1)班课设小组成员:徐凡(1060310039)凡平(1060310058)彭浩(1060310045)桂银(1060310010)潘光卉(1060300033)完成时间:2012年04月02日至2012年04月 24 日单片机课程设计实验报告课程设计题目:简易计算器作品功能描述:当通过输入键盘数字时,能够在显示器上显示输出的数值,并且通过想实现的简单运算功能,实现计算器的加、减、乘、除和清零,并将结果显示出来。
小组成员工作分工:徐凡:程序主框架的构造和主要功能函数的设计。
凡平:原理图的设计和硬件的焊接。
彭浩:基本功能函数的设计(“+,-,*,/”)。
桂银:程序流程图的设计和键盘扫描程序的实现。
潘光卉:编写文档和功能测试。
硬件电路设计:本设计中我们用的是AT89C52芯片,LCD1602 (PROTEUS中为LM016L)就是那个液晶屏,因为可以显示2行16个字符,故叫做LCD1602.11.0592M或12M晶振(CRYSTAL),两者均可,但要涉及到串口需选用12MKEYPAD-SMALLCALC就是那个4X4键盘电容20~30PF(CAP),接最小电路电容10PF主要接复位电路RESPACK-8排阻,为20K的,一个引脚接正极,另8个引脚接I/O口接RES电阻10K,接复位电路实物照片:硬件原理图原理说明:1,上电后,屏幕初始化;2,计算。
按下数字键,屏幕显示要运行的第一个数字,再按下符号键,然后再按下数字键,屏幕显示要运算的第二个数字,最后按下“=”号键,屏幕上显示出计算结果。
3,如果要再次计算,可以按下“ON/C”键清零,或者继续按下数字键,即可重新计算。
键盘使用说明如下:按键功能说明:Array“+”实现两个数的相加“-”实现两个数的相减“×”实现两个数的乘积“÷”实现两个数商的运算“ON/C”计算器显示的清零和接通电源程序控制流程图:软件设计:在程序设计方法上,模块化程序设计是单片机应用中最常用的程序设计方法。
按键功能实验报告总结(3篇)
第1篇一、实验背景按键作为电子设备中常见的输入装置,其功能丰富,应用广泛。
本实验旨在通过设计和实现一系列按键功能,加深对按键工作原理的理解,并提高电子设计实践能力。
二、实验目的1. 掌握按键的基本原理和电路设计方法。
2. 熟悉按键在不同应用场景下的功能实现。
3. 培养电子设计实践能力,提高问题解决能力。
三、实验内容1. 实验器材:51单片机最小核心电路、按键、LED灯、电阻、电容、面包板等。
2. 实验内容:(1)单按键控制LED灯闪烁(2)按键控制LED灯点亮与熄灭(3)按键控制LED灯亮度调节(4)按键实现数字时钟调整(5)按键实现多功能计数器(6)按键实现密码输入与验证四、实验步骤1. 根据实验要求,设计电路图,并选择合适的元器件。
2. 使用面包板搭建实验电路,包括单片机、按键、LED灯、电阻、电容等。
3. 编写程序,实现按键功能。
4. 对程序进行调试,确保按键功能正常。
5. 实验完成后,撰写实验报告。
五、实验结果与分析1. 单按键控制LED灯闪烁实验结果:按下按键,LED灯闪烁;松开按键,LED灯停止闪烁。
分析:本实验通过单片机定时器实现LED灯的闪烁。
当按键按下时,定时器开始计时;当定时器达到设定时间后,LED灯点亮;定时器继续计时,当达到设定时间后,LED灯熄灭。
如此循环,实现LED灯的闪烁。
2. 按键控制LED灯点亮与熄灭实验结果:按下按键,LED灯点亮;再次按下按键,LED灯熄灭。
分析:本实验通过单片机的I/O口控制LED灯的点亮与熄灭。
当按键按下时,单片机将I/O口置为高电平,LED灯点亮;当按键再次按下时,单片机将I/O口置为低电平,LED灯熄灭。
3. 按键控制LED灯亮度调节实验结果:按下按键,LED灯亮度逐渐增加;松开按键,LED灯亮度保持不变。
分析:本实验通过单片机的PWM(脉宽调制)功能实现LED灯亮度的调节。
当按键按下时,单片机调整PWM占空比,使LED灯亮度逐渐增加;松开按键后,PWM占空比保持不变,LED灯亮度保持不变。
单片机原理(按键识别 )实验报告
教育资料
.
while (1) {
if(key==0) {
delay(1000); if(key==0) {
led=~led; while(key==0); }
} } } (2)按键识别 ( 按下灭,再按闪) #include<reg51.h> #define uint unsigned int #define uchar unsigned char sbit led=P2^6; sbit key=P2^7;
.
switch(j) { case 0 : led=0;break; case 1 : led=~led;delay(100);break; default:break; }
}
}
(3)按键识别 ( 按下数码管数值加 1) #include<reg51.h> #define uint unsigned int #define uchar unsigned char uchar code LedCode[]={ 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00}; uchar DispBuf[8]; sbit led=P2^6;
教育资料
.
if(hour>=24) {
hour=0; }
}
void main() {
uint i=2; while (1) {
if(key==0) {
delay(1000); if(key==0) {
i++; while(key==0); i=i%3;
教育资料
.
} } switch(i)
单片机实验五报告-单片机键盘实验
南昌大学实验报告学生姓名:学号:专业班级:实验类型:⃞验证 ⃞综合■设计 ⃞创新实验日期:2018.05.18 实验成绩:实验五单片机键盘实验(一)实验目的1.掌握单片机键盘控制;2.掌握数码管显示控制。
(二)设计要求1.行列扫描按键键值为0~F;2.按键只支持单键按下,不支持多键同时按下;3.要求用数码管显示按键值。
(三)实验原理1.矩阵式键盘的设计按键数目较多的杨合常采用矩阵式(也称行列式)键盘。
键盘由行线和列线组成,按键位于行、列的交叉点上,如下图所示,一个4×4的行列结构可构成一个16个按键的键盘,需要一个8位的并行I/O口。
很明显,在按键数目较多的场合,矩阵式键盘要比独立式键盘节省较多的I/O口线。
对下图所示的矩阵式键盘的查询扫描,一般包括以下4个步骤。
(1)首先判别整个键盘有无按键按下方法为单片机驱动列线P0.0-P0.3输出全0,然后读行线P0.4-P0.7的状态,若全为1,则键盘上没有闭合键;若P0.4-P0.7,则有键按下。
(2)去除键的抖动当判别出可能有键按下时,软件延时一段时间(10ms左右)再判别键盘的状态,若仍有键闭合,则认为键盘上有确定的键按下,否则是键抖动。
(3)求出按下键的键号上图中的16个按键,键号依次为0,1,...15。
各行的首键号分别为0,4,8,12,列号依次为0,1,2,3。
行线通过上拉电阻接+5V,当无键按下时,行线为高电平,当有按键按下时,对应的行线与列线短接,行线的电平将由此行线相连的列线电平决定。
如果把行线设置为单片机的输入口线,列线设置为单片机的输出口线,则按键号的识别过程是:先令0列线P0.0为低电平0,其余3根列线都为高电平,遂行检查行线状态。
如果行线P0.4-P0.7都为高电平1,则P0.0这列上没有按键闭合,若P0.4-P0.7中有一行为低电平,则该行线与列线交叉的按键按下。
如果P0.0这一列上没有按键闭合,接着再使P0.1为低电平,其余列线为高电平。
单片机按键加减报告
单片机实验报告一、实验目的1、学习利用单片机设计简单加减计数,并学会定时/计数器T0/T1的使用.2、学习使用keil和proteus软件.3、熟悉汇编语言并能利用汇编语言编写程序.二、实验思路用T0、T1设计10位以内的按键加减计数:利用T0/T1计数功能实现每次按键的中断,且采用方式2,可以自动重载初值,较为方便.这里不考虑优先级的问题.再分别对T0、T1编写中断处理的程序.要注意的是,加法时, 9加1显示0的情况;减法时,0减1显示9的情况.三、实验原理〔以下不考虑T2的情况〕1、中断的概念CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理〔中断发生〕;CPU暂时中断当前的工作,转去处理事件B〔中断响应和中断服务〕;待CPU 将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A〔中断返回〕,这一过程称为中断.2、定时/计数器(1)中断控制寄存器〔TCON〕TCON的高4位用于控制定时/计数器的启动和中断申请.其格式如下:TF1<TCON.7>:T1溢出中断请求标志位.T1计数溢出时由硬件自动置TF1为1.CPU响应中断后TF1由硬件自动清0.T1工作时,CPU可随时查询TF1的状态.所以,TF1可用作查询测试的标志.TF1也可以用软件置1或清0,同硬件置1或清0的效果一样.TR1<TCON.6>:T1运行控制位.TR1置1时,T1开始工作;TR1置0时,T1停止工作.TR1由软件置1或清0.所以,用软件可控制定时/计数器的启动与停止.TF0<TCON.5>:T0溢出中断请求标志位,其功能与TF1类同.TR0<TCON.4>:T0运行控制位,其功能与TR1类同.本次试验要用到T0、T1,即TR0、TR1置1.(2)中断允许控制〔IE〕EX0<IE.0>,外部中断0允许位;ET0<IE.1>,定时/计数器T0中断允许位;EX1<IE.2>,外部中断1允许位;ET1<IE.3>,定时/计数器T1中断允许位;ES<IE.4>,串行口中断允许位;EA <IE.7>,CPU中断允许〔总允许〕位.以上都是为1时开启,为0时关闭.本次试验需要开启EA、ET1、ET0,即令IE 为8AH.(3)工作方式寄存器TMODGATE:门控位.GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作.C/T:定时/计数模式选择位.C/T=0为定时模式;C/T =1为计数模式.M1M0:工作方式设置位.定时/计数器有四种工作方式,由M1M0进行设置.这次试验需要计数模式且为方式二,所以,TMOD值设为66H.3、数码管在这里我们使用的是7SEG-COM-AN-GRN数码管,由7个发光管组成的8字形构成的,如下图所示,左边接线顺序下来分别命名为ABCDEFG数码管的接线为共阳接法,即低电平亮,高电平灭.实验中用P0.0-P0.6控制数码管的7段,P0口的八位与发光管的对应关系见下表所示.显示P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0HEX——G F E D C B A 0 0 1 0 0 0 0 0 0 40H 1 0 1 1 1 1 0 0 1 79H 2 0 0 1 0 0 1 0 0 24H 3 0 0 1 1 0 0 0 0 30H 4 0 0 0 1 1 0 0 1 19H 5 0 0 0 1 0 0 1 0 12H 6 0 0 0 0 0 0 1 0 02H 7 0 1 1 1 1 0 0 0 78H 8 0 0 0 0 0 0 0 0 00H 91118H四、设计流程N YYNYN<a>主程序 <b>中断响应 五、原理图存数寄存器初始化 中断初始化 开始 数码管显示等待中断按键扫描R0置0是否为加法R0是否为9R0是否为0R0加1R0加1 R0减1 中断返回运行后,初始如上图所示,当按一下第一个键时,数码管显示1,此后每按一次数码管显示数值加1,当数码管显示为9时,按下第一个键,显示为0;初始状态下,当按下第二个键时,数码管显示9,此后每按一次第二个键,数码管显示数值减1.说明实验成功六、汇编程序ORG 0000HJMP MAINORG 000BH //T0〔加法〕中断入口JMP T0_ADDORG 001BH //T1〔减法〕中断入口JMP T1_SUBMAIN: //主程序MOV TMOD,#66H //设置T1、T0方式2计数MOV TL1,#0FFH //为T1、T0设置初值MOV TH1,#0FFHMOV TL0,#0FFHMOV TH0,#0FFHMOV IE,#8AH //CPU、T0、T1开启中断SETB TR1 //启动T1计数器SETB TR0 //启动T0计数器MOV R0,#0 //设置显示的初始值与其地址MOV DPTR,#TABLOOP:MOV A,R0 //输出显示数值MOVC A,A+DPTRMOV P0,ASJMP LOOP //等待中断T0_ADD:CJNE R0,#9,T_END0 //是否需要进位MOV R0,#0RETIT1_SUB:CJNE R0,#0,T_END1 //是否需要借位MOV R0,#9RETIT_END0:INC R0 //加1RETIT_END1:DEC R0 //减1RETITAB: //选择0-9的输出DB 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18END七、小结这次实验中,我进一步加深了对单片机与其应用的了解.通过查找资料和老师的帮助,进一步熟练了对keil和proteus软件的操作.在编写程序的过程中也遇到了一些问题,一些语句的使用不够熟练,但现在对它们有了更深的记忆.在编写程序的过程中,我加深了对中断概念和对计数器工作原理的理解.同时,感受了设计程序的流程,为以后的实验积累了一定经验.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机实验报告
一、实验目的
1、学习利用单片机设计简单加减计数,并学会定时/计数器T0/T1的使用。
2、学习使用keil和proteus软件。
3、熟悉汇编语言并能利用汇编语言编写程序。
二、实验思路
用T0、T1设计10位以内的按键加减计数:
利用T0/T1计数功能实现每次按键的中断,且采用方式2,可以自动重载初值,较为方便。
这里不考虑优先级的问题。
再分别对T0、T1编写中断处理的程序。
要注意的是,加法时,9加1显示0的情况;减法时,0减1显示9的情况。
三、实验原理
(以下不考虑T2的情况)
1、中断的概念
CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。
2、定时/计数器
(1)中断控制寄存器(TCON)
TCON的高4位用于控制定时/计数器的启动和中断申请。
其格式如下:
TF1(TCON.7):T1溢出中断请求标志位。
T1计数溢出时由硬件自动置TF1为1。
CPU响应中断后TF1由硬件自动清0。
T1工作时,CPU可随时查询TF1的状态。
所以,TF1可用作查询测试的标志。
TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。
TR1(TCON.6):T1运行控制位。
TR1置1时,T1开始工作;TR1置0时,T1停止工作。
TR1由软件置1或清0。
所以,用软件可控制定时/计数器的启动与停止。
TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。
TR0(TCON.4):T0运行控制位,其功能与TR1类同。
本次试验要用到T0、T1,即TR0、TR1置1。
(2)中断允许控制(IE)
EX0(IE.0),外部中断0允许位;
ET0(IE.1),定时/计数器T0中断允许位;
EX1(IE.2),外部中断1允许位;
ET1(IE.3),定时/计数器T1中断允许位;
ES(IE.4),串行口中断允许位;
EA (IE.7),CPU中断允许(总允许)位。
以上都是为1时开启,为0时关闭。
本次试验需要开启EA、ET1、ET0,即令IE为8AH。
(3)工作方式寄存器TMOD
GATE:门控位。
GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。
C/T:定时/计数模式选择位。
C/T=0为定时模式;C/T =1为计数模式。
M1M0:工作方式设置位。
定时/计数器有四种工作方式,由M1M0进行设置。
这次试验需要计数模式且为方式二,所以,TMOD值设为66H。
3、数码管
在这里我们使用的是7SEG-COM-AN-GRN数码管,由7个发光管组成的8字形构成的,如下图所示,左边接线顺序下来分别命名为ABCDEFG
数码管的接线为共阳接法,即低电平亮,高电平灭。
实验中用P0.0-P0.6控制数码管的7段,P0口的八位与发光管的对应关系见下表所示。
显示P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0
HEX ——G F E D C B A
0 0 1 0 0 0 0 0 0 40H
1 0 1 1 1 1 0 0 1 79H
2 0 0 1 0 0 1 0 0 24H
3 0 0 1 1 0 0 0 0 30H
4 0 0 0 1 1 0 0 1 19H
5 0 0 0 1 0 0 1 0 12H
6 0 0 0 0 0 0 1 0 02H
7 0 1 1 1 1 0 0 0 78H
8 0 0 0 0 0 0 0 0 00H
9 0 0 0 1 1 0 0 0 18H
四、设计流程
N
Y
Y
N Y N
(a)主程序(b)中断响应
五、原理图
存数寄存器
初始化
中断初始化
开始
数码管显示
等待中断
按键扫描
R0置0
是否为加法
R0是否为9
R0是否为0
R0加1
R0加1
R0减1
中断返回
运行后,初始如上图所示,当按一下第一个键时,数码管显示1,此后每按一次数码管显示数值加1,当数码管显示为9时,按下第一个键,显示为0;初始状态下,当按下第二个键时,数码管显示9,此后每按一次第二个键,数码管显示数值减1。
说明实验成功
六、汇编程序
ORG 0000H
JMP MAIN
ORG 000BH //T0(加法)中断入口
JMP T0_ADD
ORG 001BH //T1(减法)中断入口
JMP T1_SUB
MAIN: //主程序
MOV TMOD,#66H //设置T1、T0方式2计数
MOV TL1,#0FFH //为T1、T0设置初值
MOV TH1,#0FFH
MOV TL0,#0FFH
MOV TH0,#0FFH
MOV IE,#8AH //CPU、T0、T1开启中断
SETB TR1 //启动T1计数器
SETB TR0 //启动T0计数器
MOV R0,#0 //设置显示的初始值及其地址
MOV DPTR,#TAB
LOOP:
MOV A,R0 //输出显示数值
MOVC A,@A+DPTR
MOV P0,A
SJMP LOOP //等待中断
T0_ADD:
CJNE R0,#9,T_END0 //是否需要进位
MOV R0,#0
RETI
T1_SUB:
CJNE R0,#0,T_END1 //是否需要借位
MOV R0,#9
RETI
T_END0:
INC R0 //加1
RETI
T_END1:
DEC R0 //减1
RETI
TAB: //选择0-9的输出
DB 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18
END
七、小结
这次实验中,我进一步加深了对单片机及其应用的了解。
通过查找资料和老师的帮助,进一步熟练了对keil和proteus软件的操作。
在编写程序的过程中也遇到了一些问题,一些语句的使用不够熟练,但现在对它们有了更深的记忆。
在编写程序的过程中,我加深了对中断概念和对计数器工作原理的理解。
同时,感受了设计程序的流程,为以后的实验积累了一定经验。