单片机原理及应用实验六--按键识别数码管显示实验
- 格式:docx
- 大小:301.76 KB
- 文档页数:11
数码管显示控制实验原理
嘿,朋友们!今天咱来聊聊数码管显示控制实验原理。
想象一下,数码管就像是一个个小小的窗户,每个窗户里都能显示出不同的数字或符号。
其实啊,这原理就好像是一个聪明的指挥家在控制着一场精彩的灯光秀。
数码管里的每一段就像是一个小灯,通过巧妙地控制这些小灯的亮灭,就能组合出我们想要的数字啦。
比如说,要显示数字“8”,那就得让数码管的所有段都亮起来,就像把所有的灯光都打开,一下子就呈现出一个完整的“8”啦。
而要显示其他数字呢,就按照特定的组合让相应的段亮起来就行。
这就好像我们家里的电灯开关,想开哪个灯就按哪个开关,只不过这里的开关是通过电路和程序来控制的哦。
在实验里,我们就是要搞清楚怎么去设置这些开关,让数码管乖乖地显示出我们想要的东西。
是不是感觉挺有意思的呀?就像是在玩一个超级有趣的电子游戏,只不过这个游戏是关于数字和电路的。
所以,下次当你看到数码管显示出清晰的数字时,就可以想象一下背后那个神奇的“指挥家”是怎么工作的啦!。
第1篇一、实验目的1. 熟悉按键电路的基本原理和设计方法。
2. 掌握按键电路的搭建和调试方法。
3. 了解按键电路在实际应用中的重要性。
4. 提高动手实践能力和电路分析能力。
二、实验原理按键显示电路是一种将按键输入转换为数字信号,并通过显示设备进行显示的电路。
本实验主要涉及以下原理:1. 按键原理:按键通过机械触点实现电路的通断,当按键被按下时,电路接通,产生一个低电平信号;当按键释放时,电路断开,产生一个高电平信号。
2. 译码电路:将按键输入的信号转换为相应的数字信号,以便后续处理。
3. 显示电路:将数字信号转换为可视化的信息,如LED灯、数码管等。
三、实验器材1. 电路板2. 按键3. 电阻4. LED灯5. 数码管6. 电源7. 基本工具四、实验步骤1. 按键电路搭建(1)根据电路原理图,在电路板上焊接按键、电阻、LED灯等元器件。
(2)连接电源,确保电路板供电正常。
2. 译码电路搭建(1)根据电路原理图,在电路板上焊接译码电路所需的元器件。
(2)连接译码电路与按键电路,确保信号传输正常。
3. 显示电路搭建(1)根据电路原理图,在电路板上焊接显示电路所需的元器件。
(2)连接显示电路与译码电路,确保信号传输正常。
4. 电路调试(1)检查电路连接是否正确,确保无短路、断路等问题。
(2)按下按键,观察LED灯或数码管显示是否正常。
(3)根据需要调整电路参数,如电阻阻值、电源电压等,以达到最佳显示效果。
五、实验结果与分析1. 实验结果通过实验,成功搭建了一个按键显示电路,按下按键后,LED灯或数码管能够正确显示数字信号。
2. 结果分析(1)按键电路能够正常工作,实现电路通断。
(2)译码电路能够将按键输入转换为相应的数字信号。
(3)显示电路能够将数字信号转换为可视化的信息。
六、实验总结1. 通过本次实验,掌握了按键电路的基本原理和设计方法。
2. 提高了动手实践能力和电路分析能力。
3. 了解了按键电路在实际应用中的重要性。
《单片机原理及应用》实验报告姓名:学号:班级:应用物理指导教师:日期:实验1 计数显示器一、实验目的熟悉51单片机的基本输入输出应用,掌握Proteus模块的原理图绘图方法及单片机系统仿真运行方法二、实验原理由共阴极数码管LED1和LED2、P0口、P2口,上拉电阻RP1及Vcc组成的输出电路;由按钮开关BUT、P3.7和接地点组成的输入电路,该电路在编程软件的配合下,可实现计数显示功能:可统计按钮BUT的按压次数,并将按压结果以十进制数形式显示出来;当显示值达到99后可自动从1开始,无限循环。
三、实验内容(1)观察Proteus模块的软件结构,熟悉菜单栏、工具栏、对话框等基本单元功能(2)学会选择元件、画导线、修改属性等基本操作(3)学会可执行文件加载及程序仿真运行方法(4)验证计数显示器的功能四、实验要求提交实验报告并包括如下内容:电路原理图、电路原理分析、仿真运行截图及实验小结1.实验原理图2.仿真运行截图3.实验小结通过这次实验让我认识了kell和proteus软件的基本功能,学会了用kell编写程序用proteus仿真运行。
在这次实验中同时也遇到了很多问题。
比如因为第一次使用这两个软件对界面还不太熟悉,浪费了很多的时间也产生了很多错误,但之后与同学们的交流过程中,慢慢的对这两个软件有了更深入的了解,在后期仿真的时候才能得心应手的处理问题。
这个计数显示器的实验让我进一步了解了单片机与数码管的魅力,看到了电子元件的神奇之处,只要按动按键就能让数码管的数字逐次加一,这大大激发了我的学习单片机兴趣,这次实验也会成为我以后学习单片机的奠基石,因为它打开了我认识单片机的大门,让我认识到了单片机的魅力,并让我沉浸其中。
实验2 指示灯开关控制器一、实验目的学习51单片机I/O口基本输入输出功能,掌握汇编语言的编程与调试方法。
二、实验原理输入电路由外接在P1口的8只拨动开关组成;输出电路由外接在P2口的8只低电平驱动的发光二极管组成。
单片机实验报告信息处理实验实验二矩阵键盘专业:电气工程及其自动化指导老师:***组员:明洪开张鸿伟张谦赵智奇学号:152703117 \152703115\152703118\152703114室温:18 ℃日期:2017 年10 月25日矩阵键盘一、实验内容1、编写程序,做到在键盘上每按一个键(0-F)用数码管将该建对应的名字显示出来。
按其它键没有结果。
二、实验目的1、学习独立式按键的查询识别方法。
2、非编码矩阵键盘的行反转法识别方法。
3、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。
4、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。
5、掌握利用Keil51软件对程序进行编译。
6、会根据实际功能,正确选择单片机功能接线,编制正确程序。
对实验结果能做出分析和解释,能写出符合规格的实验报告。
三、实验原理1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。
2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。
3、识别键的闭合,通常采用行扫描法和行反转法。
行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。
行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。
然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。
这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。
由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。
基于单片机的按键控制LED数码管共阴极动态显示电路设计报告毕业论文本篇报告将详细介绍基于单片机的按键控制LED数码管共阴极动态显示电路的设计。
一、引言LED数码管是一种常用的数字显示器件,广泛应用于各种计数器、时钟和计时器等电子设备中。
本设计旨在利用单片机实现对LED数码管的动态显示,并通过按键控制显示的数字。
二、设计方案1.系统结构本系统采用基于单片机的数字显示方案,其中包括一个单片机、数码管显示模块和按键模块。
单片机负责接收按键输入信号,并根据输入信号控制数码管显示相应的数字。
2.系统设计(1)数码管显示模块:该模块由共阴极LED数码管组成,共阴极接地,通过接通不同的端口线来控制数码管显示不同的数字。
(2)按键模块:该模块由多个按键组成,用于用户输入指定的数字。
每个按键接一个IO脚,通过按下不同的按键,触发不同的端口输入。
(3)单片机:本设计选用51单片机作为控制核心,通过IO口与数码管显示模块和按键模块连接。
单片机根据按键输入信号的变化,对数码管进行动态显示。
3.设计过程(1)针对单片机的接线设计:将单片机的IO口分别与数码管显示模块和按键模块连接。
将数码管的共阳极接电源正极,数码管的各段(即a、b、c、d、e、f、g)接单片机的IO脚。
(2)针对单片机软件设计:设计单片机程序实现按键输入的检测和数码管动态显示的控制。
首先初始化IO口,设置按键引脚为输入端口,设置数码管引脚为输出端口。
然后循环检测按键的状态。
当检测到按键被按下时,根据按键的不同选择分别显示不同的数字。
4.功能要求(1)按下不同的按键,数码管能够显示相应的数字,实现动态显示。
(2)按键输入具有去抖功能,避免误触发。
(3)程序运行稳定,能够正确响应按键输入,显示正确的数字。
三、实验结果经过实验验证,本设计实现了按键控制LED数码管共阴极动态显示的功能要求。
按下不同的按键,数码管能够正确显示相应的数字,程序运行稳定,无误触发现象。
单片机的键盘和显示实验报告㈠实验目的1.掌握单片机I/O的工作方式;2.掌握单片机以串行口方式0工作的LED显示;3.掌握键盘和LED显示的编程方法。
㈡实验器材1.G6W仿真器一台2.MCS—51实验板一台3.PC机一台4.电源一台㈢实验内容及要求实验硬件线路图见附图从线路图可见,8051单片机的P1口作为8个按键的输入端,构成独立式键盘。
四个LED显示器通过四个串/并移位寄存器74LS164接口至8051的串行口,该串行口应工作在方式0发送状态下,RXD端送出要显示的段码数据,TXD则作为发送时钟来对显示数据进行移位操作。
编写一个计算器程序,当某一键按下时可执行相应的加、减、乘、除运算方式,在四个显示器上显示数学算式和最终计算结果。
注:①通过按键来选择加、减、乘、除四种运算方式。
②输入两个数字均为一位十进制数,可预先放在内存中。
㈣实验框图(见下页)㈤思考题1.当键盘采用中断方式时,硬件电路应怎样连接?P1.4~P1.7是键输出线,P1.0~P1.3是扫描输入线。
输入与门用于产生按键中断,其输入端与各列线相连,再通过上拉电阻接至+5 V电源,输出端接至8051的外部中断输入端。
2.74LS164移位寄存器的移位速率是多少?实验中要求计算的式子和结果之间相差一秒,移位寄存器的移位速率应该是每秒一位吧。
其实这个问题确实不知道怎么回答。
LED 显示用的段码与教科书所提供的不同,本实验采用如下段码:显示数符段码显示数符段码0BBH A DBH109H B F1H2EAH C B2H36BH D E9H459H E F2H573H F D2H否有否P1口置输入读P1口开 始显示“0000”是否有键按下?延迟消抖是否有键按下?是读键码加法运算减法运算除运算6F3H—40H70BH.04H8FBH┗┛A1H97BH┗┛1AH灭00H P DAH实验代码:ORG 0000HAJMP MAINORG 0030HMAIN:MOV 41H,#0BBH ;对几个存放地址进行初始化MOV 42H,#0BBHMOV 43H,#0BBHMOV 44H,#0BBHMOV SCON,#00H ;初始化串行口控制寄存器,设置其为方式0 LCALL DISPLAY ;初始化显示KEY:MOV R3,#08H;用来存放两个数据MOV R4,#02HMOV P1,#0FFH ;初始化P1口MOV A,P1 ;读取按键状态CPL A ;取正逻辑,高电平表示有键按下JZ KEY ;A=0时无键按下,重新扫描键盘LCALL DELAY1;消抖MOV A,P1 ;再次读取按键状态CPL AJZ KEY ;再次判别是否有键按下PUSH AKEY1:MOV A,P1CPL AANL A,#0FH ;判别按键释放JNZ KEY1 ;按键未释放,等待LCALL DELAY1;释放,延时去抖动POP AJB ACC.0,ADD1 ;K1按下转去ADD1JB ACC.1,SUB1 ;K1按下转去SUB1JB ACC.2,MUL1 ;K1按下转去MUL1JB ACC.3,DIV1 ;K1按下转去DIV1LJMP KEYADD1:LCALL BUFFER ;显示加数和被加数MOV 43H,#049HLCALL DISPLAY ;显示加号MOV A,R3ADD A,R4DA AMOV R3,A ;相加结果放入R6ANL A,#0FHMOV R4,A ;结果个位放入R7MOV A,R3SWAP A ;半字节交换,高四位放入低四位ANL A,#0FHMOV R3,A ;结果的高位放入R6LCALL L;显示缓存区设置LCALL DELAY2;延时一秒后显示LCALL DISPLAYLJMP KEYSUB1:LCALL BUFFER ;显示减数和被减数MOV 43H,#40HLCALL DISPLAY ;显示减号MOV A,R3CLR CY ;CY清零SUBB A,R4 ;做减法PUSH ARLC A ;带进位循环左移,最高位放入CYJC F ;判断最高位,若为1则跳转到负数ZHENG: POP AMOV R4,AMOV R3,#00H ;高位清零SJMP OUTFU:POP ACPL A ;取绝对值INC AMOV R4,AMOV R3,#11H ;显示负号OUT: LCALL L ;显示缓存区设置LCALL DELAY2 ;延时1s后显示LCALL DISPLAYLJMP KEYMUL1:LCALL BUFFER ;显示两位乘数MOV 43H,#99HLCALL DISPLAY ;显示乘号MOV A,R3MOV B,R4MUL AB ;结果放入AB,A中是低8位,B中是高8位MOV B,#0AHDIV AB ;十进制转换MOV R4,B ;结果个位放入R7MOV R3,A ;结果的十位放入R6LCALL LLCALL DELAY2LCALL DISPLAY ;延时1s后显示LJMP KEYDIV1:LCALL BUFFER ;显示除数和被除数MOV 43H,#62HLCALL DISPLAY ;显示除号MOV A,R3MOV B,R4DIV AB ;A除以BMOV R4,B ;余数放在R4中MOV R3,A ;商放在R3中MOV A,R4MOVC A,@A+DPTR ;调用段选号MOV 41H,A ;显示余数MOV A,R3MOVC A,@A+DPTRMOV 43H,A ;显示商MOV 42H,#00HMOV 44H,#00HLCALL DELAY2 ;延时1S后显示LCALL DISPLAYLJMP KEYBUFFER: MOV 41H,#22H ;显示初始化,在做计算之前显示两个操作数,显示等号MOV DPTR,#TABLMOV A,R4MOVC A,@A+DPTRMOV 42H,AMOV A,R3MOVC A,@A+DPTRMOV 44H,ARETDISPLAY:MOV R5,#04H;共四位需要显示MOV R0,#41HDISPLAY1:MOV A,@R0MOV SBUF,ADISPLAY2:JNB TI,DISPLAY2;是否传完了CLR TIINC R0DJNZ R5,DISPLAY1RETL:MOV A,R4MOVC A,@A+DPTRMOV 41H,A ;R4对应的段码MOV A,R3MOVC A,@A+DPTRMOV 42H,A ;R3对应的段码MOV 43H,#00HMOV 44H,#00HRETDELAY1: ;普通延时MOV R1,#20HDS1:MOV R2,#0FFHDS2:DJNZ R2,DS2DJNZ R1,DS1RETDELAY2:MOV R6,#14H ;定时1SMOV TMOD,#01HDS3:MOV TH0,#3CHMOV TL0,#0B0H ;50msSETB TR0LOOP:JNB TF0,LOOPCLR TF0CLR TR0DJNZ R6,DS3 ;1s到,中断返回RETTABL:DB 0BBH 09H 0EAH 6BH ;段码表DB 59H 73H 0F3H 0BHDB 0FBH 7BH 00H 0DBHDB 0F1H 0B2H 0E9H 0F2HDB 0D2H 40H实验结果及分析按键1:8+2= 结果:10按键2:8-2= 结果: 6按键3:8*2= 结果:16按键4:8/2= 结果:4从上面的结果可以看出,本次实验基本完成了实验要求。
宁德师范学院计算机系
实验报告
(2014—2015学年第 2学期)
课程名称单片机原理
实验名称独立按键识别
专业计算机科学与技术(软工)年级 2012级
学号 B2012103145 姓名冯武
指导教师杨烈君
实验日期 2015.5.27
实验步骤、实验结果及分析:
1 实验步骤:
1、使用Proteus ISIS 7 Professional
应用程序,建立一个.DSN文件
2、在“库”下拉菜单中,选中“拾取元件”(快捷键P),分别选择以下元件:AT89C51、CAP、CAP-ELEC、CRYSTAL、RESPACK-8。
3、构建仿真电路
图1 按键识别1、2
图2 按键识别3
图3按一下暂停
图4归零
图5时钟调整
电路图
注:1、报告内的项目或设置,可根据实际情况加以补充和调整 2、教师批改学生实验报告应在学生提交实验报告10日内。
电子信息学院实验报告书课程名:《单片机原理及应用实验》题目:实验六按键识别数码管显示实验软件+硬件实验实验类别:【设计】班级:电子1313学号:26姓名:吴限评语:(1)电路连接调试:□正确□基本正确□不正确(2)实验程序编写:□正确□基本正确□不正确(3)数据测量分析:□准确□基本准确□不准确成绩:□A □B □C □D ,指导教师:王英赫1、实验内容或题目1)题目:按键识别数码管显示实验2)实验内容:数码管显示矩阵按键号。
2、实验目的与要求1)实验目的:掌握按键识别及数码管显示的实现方法。
2)实验要求:通过XL2000 的16 位矩阵按键,在数码管上分别显示0~9,A,B,C,D,E,F。
用Keil编译、Proteus仿真,代码下载到单片机实验箱上验证。
3、实验仪器(1)PC微机1台(2)实验箱 1台4、实验程序流程图5、实验程序 (实验程序清单作为附件放在最后)6、实验步骤1)keil 中C 语言程序实现。
2)在proteus 中完成电路图设计,并实现仿真。
开结初延显示有有判断N NY Y3)硬件实验部分:用一条8PIN 数据排线,把矩阵按键部份的JP50,接到CPU 部份的P1 口JP44;接8 位数码管的数据线。
将数码管部份的数据口JP5 接到CPU 部份的P0 口JP51;接8 位数码管的显示位线。
将数码管部份的显示位口JP8 接到CPU 部份的P2 口JP52.7、实验数据及结果8、思考题采用P3口控制矩阵按键输入,程序应该如何修改?答:本实验的程序中可以不用蜂鸣器驱动线,把以下程序的sbit BEEP = P3 ^ 7;及函数void beep()等删掉后;需要把扫描键值的函数改一下:unsigned char keyscan() {unsigned char scan1, scan2, keycode,j;P13= 0xf0;scan1 = P3;if (scan1 != 0xf0) //判键是否按下{delayms(10);scan1 = P3;if (scan1 != 0xf0) //二次判键是否按下{P1 = 0x0f;scan2 = P3;keycode = scan1 | scan2; //组合成键扫描编码for (j = 0; j < 16; j++){if (keycode == key_code[j]) //查表得键值{key = j;return (key); //返回有效键值}}}}elseP3 = 0xff;return (key = 16); //返回无效码} 即P1口换成P3口,而键编码数组是固定的,可以不变;此外主函数中的P1口也要改为P3口:void main(void) {P0 = 0xf7; //数码管初始显示"-"P2 = 0xfd;//数码管显示在第二位P3 = 0xff;while (1){keyscan();if (key < 16) //有效键值{P0 = disp_code[key]; //显示键值}}}<附件> 实验程序清单#include <reg52.h>#include <intrins.h>sbit BEEP = P3 ^ 7; //蜂鸣器驱动线unsigned char key;unsigned char code disp_code[] ={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xc0,0x86,0x8e,0xc0};unsigned char code key_code[] ={0xee, 0xed, 0xeb, 0xe7, 0xde, 0xdd, 0xdb, 0xd7, 0xbe, 0xbd, 0xbb,0xb7, 0x7e, 0x7d, 0x7b, 0x77 //键编码数组};char code SST516[3] _at_ 0x003b; //保留仿真器/********************延时子函数***************/void delayms(unsigned int ms){unsigned char t;while (ms--){for (t = 0; t < 114; t++);}}/*************x*0.14MS 延时子函数****************/void delayus(unsigned char x){unsigned char i;while (x--){for (i = 0; i < 14; i++){;}}}/******************蜂鸣器驱动子函数*****************/ void beep(){unsigned char i;for (i = 0; i < 250; i++){delayus(6);BEEP = !BEEP; //BEEP取反}BEEP = 1; //关闭蜂鸣器delayms(150); //延时}/******************键盘扫描子函数*********************/ unsigned char keyscan(){unsigned char scan1, scan2, keycode, j;P1 = 0xf0;scan1 = P1;if (scan1 != 0xf0) //判键是否按下{delayms(10); //延时10msscan1 = P1;if (scan1 != 0xf0) //二次判键是否按下{P1 = 0x0f;scan2 = P1;keycode = scan1 | scan2; //组合成键扫描编码for ( j = 0; j < 16; j++){if (keycode == key_code[ j]) //查表得键值{key = j;return (key); //返回有效键值}}}}elseP1 = 0xff;return (key = 16); //返回无效码}/*************************主函数***********************/void main(void){P0 = 0xf7; //数码管初始显示"-"P2 = 0xfd;//数码管显示在第二位P1 = 0xff;while (1){keyscan();if (key < 16) //有效键值{P0 = disp_code[key]; //显示键值beep(); //蜂鸣器响一声}}}。
单片机实验报告班级:学号:姓名:实验一:数码管实验一.实验目的1.了解数码管的显示原理;2.掌握JXARM9-2440 中数码管显示编程方法。
二.实验原理7段LED由7个发光二极管按“日”字形排列,所有发光二极管的阳极连在一起称共阳极接法,阴极连在一起称为共阴极接法。
LED显示器的接口一般有静态显示与动态显示接口两种方式。
本实验中采用的是动态显示接口,其中数码管扫描控制地址为0x20007000,位0-位5每位分别对应一个数码管,将其中某位清0 来选择相应的数码管,地址0x20006000 为数码管的数据寄存器。
数码管采用共阳方式,向该地址写一个数据就可以控制LED 的显示,其原理图如图所示。
三.实验内容及步骤1、六个数码管同时正向显示0-F ,然后反向显示F-0。
1)参照模板工程leddemo(modules\leddemo\leddemo.apj),添加相应的文件,并修改led 的工程设置;2)创建led.c 并加入到工程led 中;3)编写LED 显示函数void led_display(void),正向显示0-F 然后反向显示F-0,并循环执行以上动作,在每次显示之间延时一段时间;4)编译led,成功后,下载并运行,观察结果。
2、在六个数码管上依次显示“HELLO”,可分辨出轮流显示。
步骤同上。
3、在六个数码管上依次显示“HELLO”,分辨不出轮流显示。
步骤同上。
4、在每个数码管上递增显示0-9 。
步骤同上。
四.实验程序1、./*******************************************************************//*文件名称: LEDSEG7.C */ /*实验现象:数码管依次显示出0、1,2、……9、a、b、C、d、E、F */ /*******************************************************************/ #define U8 unsigned charunsigned char seg7table[16] = {/* 0 1 2 3 4 5 6 7*/0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,/* 8 9 A B C D E F*/0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e, };void Delay(int time);/*******************************************************************/ /* 函数说明: JXARM9-2410 7段构共阳数码管测试 */ /* 功能描述: 依次在7段数码管上显示0123456789ABCDEF */ /* 返回代码: 无 */ /* 参数说明: 无 */ /*******************************************************************/ void Test_Seg7(void){int i;*((U8*)0x20007000)=0x00; /*六个数码管都亮*/for( ; ;){for(i=0;i<0x10;i++) /*数码管从0到F依次显示出来*/{*((U8*)0x20006000)=seg7table[i];Delay(1000);}for(0xf;i>=0x0;i--) /*数码管从F到0依次显示出来*/{*((U8*)0x20006000)=seg7table[i];Delay(1000);}}// TODO}/*****************************************************************/ /* Function name : 循环延时子程序 *//* Description : 循环 'time' 次 */ /* Return type :void */ /* Argument : 循环延时计数器 */ /*****************************************************************/ void Delay(int time){int i;int delayLoopCount=1000;for(;time>0;time--);for(i=0;i<delayLoopCount;i++);}实验结果:6个数码管上一次显示0,1,2…F,然后从F到0循环。
师学院计算机系
实验报告
(2014—2015学年第 2学期)
课程名称单片机原理
实验名称独立按键识别
专业计算机科学与技术(软工)年级 2012级
学号 B2012103145 武
指导教师烈君
实验日期 2015.5.27
实验步骤、实验结果及分析:
1 实验步骤:
1、使用
Proteus ISIS 7 Professional应用程序,建立一个.DSN文件
2、在“库”下拉菜单中,选中“拾取元件”(快捷键P),分别选择以下元件:AT89C51、CAP、CAP-ELEC、CRYSTAL、RESPACK-8。
3、构建仿真电路
图1 按键识别1、2
图2 按键识别3
图3按一下暂停
图4归零
图5时钟调整
电路图
注:1、报告的项目或设置,可根据实际情况加以补充和调整 2、教师批改学生实验报告应在学生提交实验报告10日。
第1篇一、实验背景数码管是一种常用的显示器件,它可以将数字、字母或其他符号显示出来。
数码管广泛应用于各种电子设备中,如计算器、电子钟、电子秤等。
本实验旨在通过实践操作,让学生了解数码管的工作原理,掌握数码管的驱动方法,以及数码管在电子系统中的应用。
二、实验原理1. 数码管类型数码管分为两种类型:七段数码管和液晶数码管。
本实验主要介绍七段数码管。
七段数码管由七个发光二极管(LED)组成,分别代表七个笔画。
当七个LED中的某个或某几个LED点亮时,就可以显示出相应的数字或符号。
根据发光二极管的连接方式,七段数码管可分为共阳极和共阴极两种类型。
2. 数码管驱动方式(1)静态驱动静态驱动是指每个数码管独立驱动,每个数码管都连接到单片机的I/O端口。
这种方式下,数码管显示的数字或符号不会闪烁,但需要较多的I/O端口资源。
(2)动态驱动动态驱动是指多个数码管共用一组I/O端口,通过控制每个数码管的扫描时间来实现动态显示。
这种方式可以节省I/O端口资源,但显示的数字或符号会有闪烁现象。
3. 数码管显示原理(1)共阳极数码管共阳极数码管的特点是七个LED的阳极连接在一起,形成公共阳极。
当要显示数字时,将对应的LED阴极接地,其他LED阴极接高电平,即可显示出相应的数字。
(2)共阴极数码管共阴极数码管的特点是七个LED的阴极连接在一起,形成公共阴极。
当要显示数字时,将对应的LED阳极接地,其他LED阳极接高电平,即可显示出相应的数字。
4. 数码管驱动电路(1)BCD码译码驱动器BCD码译码驱动器是一种将BCD码转换为七段数码管所需段码的电路。
常用的BCD码译码驱动器有CD4511、CD4518等。
(2)74HC595移位寄存器74HC595是一种8位串行输入、并行输出的移位寄存器,常用于数码管的动态驱动。
它可以将单片机输出的串行信号转换为并行信号,驱动数码管显示。
三、实验目的1. 了解数码管的工作原理和驱动方式。
单片机按键扫描数码管显示C语言程序按键扫描数码管显示程序共定义了6个键的功能:K1、K2、K3、K4以及K5、K8组成的一对复合键,其中K2,K3为连击键,K5为上档键。
在正常工作模式下按K1则切换至状态,在设定模式下按K1键循环选择4个数码管中的某个,被选中的数码管闪烁,此时单按K2键显示数值加1;常按K2显示数值以一定速度递增,同时数码管停止闪烁,当K2松开,数码管恢复闪烁,显示数值停留在K2松开前的值上。
K3完成的功能和K2类似。
其完成减操作。
这2个键只有在设定状态才有效,可以有效防止误操作。
K4为确认键,按下该键回到正常显示状态,所有指示灯熄灭,数码管显示刚刚设定的数值。
K5+K8这对复合键执行复位操作,任何情况下同时按下K5和K8或先按下K5再按下K8,所有数码管的显示全为0,指示灯全灭,进入正常显示状态。
同时程序还对如下几个异常操作进行了处理:1. 2个或多个功能键同时按下2. 一个功能键按下未释放,又按另一个功能键,然后再松开其中一个功能键3. 先按下功能键再按下上档键4. 多个上档键和一个功能键同时按下,此时不做处理。
等到松开其他上档键,只剩下一个上5. 档键和一个功能键时才执行这对复合键;或松开所有上档键,处理单一功能键。
/****************************************************************************** */#include <iom8v.h>#include <macros.h>#define uchar unsigned char#define uint unsigned int#define RCtrl 0x20 //定义上挡键第5键#define RConti 0xfe //定义连击键第6键#define N 2 //去抖年龄下限#define MaxRate 50 //重复前的延迟值 600ms#define MinRate 20 //重复速度 240ms#define leddark 83 //闪烁时灭时间1s#define ledshow 83 //闪烁时亮时间1s#define decimal 0x80 //小数点的段数#define KEY_DDR DDRC#define KEY_PORTO PORTC#define KEY_PORTI PINC#define OUT 0x3f#define IN 0xc0#define KeyValue 0x3f#define LEDD_DDR DDRB#define LEDD_PORTO PORTB#define LEDS_DDR DDRD#define LEDS_PORTO PORTD#define LEDS_MASK 0xfc#define LEDS_NUM 0x06#define TRUE 1#define FALSE 0/*定义键盘扫描程序返回数据类型*/typedef struct{uchar shiftcnt; //上档键的个数值uchar funcnt; //功能键的个数值uchar shiftval; //最后扫描到的上档键的值uchar funval; //最后扫描到的功能键的值} keyret;/*定义显示字符段码*/uchar const led_stroke[19] ={//0,1,2,3,4,5,6,7,8,90x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,//a,b,C,d,e,F,P,0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x73,//all on all off0xff, 0x00};/*定义位选码*/uchar const led_cs[LEDS_NUM] ={0xfb, //111110110xf7, //111101110xef, //111011110xdf, //110111110xbf, //101111110x7f //01111111};uchar led_buf[LEDS_NUM] ={0x73, 0x81, 0x82, 0x83, 0x84,0x85};uchar *pb = &led_buf[1]; //定义指向数码管数据缓冲区的指针/*定义全局变量*/uchar task, state; //task:按键状态,0:去抖 1,重复的延迟 2,重复//state:显示位置变量uchar keydone, keyprocess; //keydone: 按键任务完成标志,为1表示已完成//keyprocess: 按键有效标志,为1时表示对按键执行uchar keypre[2] ={0x00, 0x00}; //存放上次功能键和上档键的键值//keypre0存放功能键uchar blink, ledtime; //blink:闪烁控制寄存器,某位为1时闪烁//d7d6d5d4d3d2d1d0//xxxx1111//ledtime:累计闪烁时已点亮和已熄灭的时间uchar ledtask; //ledtask: 当前的闪烁状态,0代表亮uchar keymark; //keymark:只是当前工作状态,为1时处于设定状态,为0时正常工作uchar enflash; //enflash:闪烁使能标志,1闪烁#define shut_dis() LEDS_PORTO|=LEDS_MASK; //shut display/****************************************************************************** **函数原型: uchar _crol_(uchar data,uchar shiftbit);*功能:字节左移shiftbit*参数:*说明:****************************************************************************** */uchar _crol_(uchar data,uchar shiftbit){data &=0xff;if(shiftbit>8)return 0;return ((~data)<<shiftbit);}/****************************************************************************** **函数原型: uchar _cror_(uchar data,uchar shiftbit);*功能:字节右移shiftbit*参数:*说明:****************************************************************************** */uchar _cror_(uchar data,uchar shiftbit){data &=0xff;if(shiftbit>8)return 0;return ((~data)>>shiftbit);}/****************************************************************************** **函数原型: void send_shift(uchar d);*功能: 将显示数据由B口送出****************************************************************************** */void send_shift(uchar data){LEDD_PORTO = data;}/****************************************************************************** **函数原型: void lflash();*功能:闪烁处理。
单片机实验报告二-数码管显示实验摘要:本实验使用单片机控制数码管的显示,在实验过程中通过学习单片机的GPIO口的编程,调试程序、调节电路来达到正确的显示效果。
最终按照要求实现了单片机控制数码管的计数器。
关键词:单片机、数码管、GPIO口、计数器一、实验介绍数码管是一种介于机械仪表和液晶显示器之间的电子显示器件,广泛应用于计时器、计数器、仪表等电子产品中。
本实验旨在通过单片机控制数码管的显示来加深对GPIO口的使用和调试程序的理解,同时了解数码管的原理。
本实验主要分为两部分:数码管显示基础实验和数码管控制开关实验。
通过这两部分的实验可以了解数码管的工作原理和单片机的基本控制方式。
二、实验原理2.1 数码管的基本原理数码管显示器将数字显示为一组符号,例如“0”到“9”。
表示不同数字的符号被编码成一个数字码。
七段数码管用一个七段数码字母来表示数字,如下表所示:| 数字 | a | b | c | d | e | f | g || ---- | - | - | - | - | - | - | - || 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 || 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 || 2 | 1 | 1 | 0 | 1 | 1 | 0 | 1 || 3 | 1 | 1 | 1 | 1 | 0 | 0 | 1 || 4 | 0 | 1 | 1 | 0 | 0 | 1 | 1 || 5 | 1 | 0 | 1 | 1 | 0 | 1 | 1 || 6 | 0 | 0 | 1 | 1 | 1 | 1 | 1 || 7 | 1 | 1 | 1 | 0 | 0 | 0 | 0 || 8 | 1 | 1 | 1 | 1 | 1 | 1 | 1 || 9 | 1 | 1 | 1 | 1 | 0 | 1 | 1 |通过控制数码管的七个LED灯的亮灭,可以实现不同符号显示。
实验七8255 键盘显示实验【实验目的】1.熟悉8255与单片机的接线和I/O编程方法;2.熟悉数码管的显示原理与编程;3.熟悉8255扫描键盘与读取键值的编程。
【实验内容】使用单片机、8255模块和数码管显示电路,编程实现在数码管上从右至左显示0-5,当有键按下时在数码管最右1位显示按键的键码。
【实验原理与设计】1.硬件电路设计本次实验使用实验箱上的E1、E3和F6模块电路。
如图7.1所示。
E1E3F6图7.1 实验箱(1)8255模块(E3区)PA口作为位扫描口(键扫描口),PB口输出字形码,PC口作为键值读入口,与数码管显示电路和矩阵键盘模块电路(F6区)相应接口连接,8255的数据总线D0-D7、读(/RD)、写(/WR)、端口选择A0、A1和片选/CS已和单片机接好。
各端口地址如下:PA口:0FF28H;PB口:0FF29H;PC口:0FF2AH;控制口:0FF2BH单片机与8255模块电路连接图如图7.2所示。
图7.2 单片机与8255的电路连接(2)数码管显示电路(F6区)实验箱上提供的数码管显示电路如图7.3所示。
实验时需将数码管显示电路中的JLED与8255的PB口相连,JS与8255的PA口相连,JLED和JS分别位于E6区,同时E6区SW3、SW4和SW4红色拨码开关打在“OFF”位置。
图7.3数码管模块连接电路(3)矩阵键盘模块电路(F6区)实验箱上提供的矩阵键盘模块电路如图7.4所示,实验时将该电路中的JR(位于E6区)与8255的PC口相连。
图7.4矩阵键盘模块电路2.程序设计根据实验内容程序主流程图如图7.5所示。
图7.5 主程序流程图(1)初始化MOV A, #81H ;PA口(位扫描口)和PB口(字形码)做输出,PC口(键扫描口)做输入MOV DPTR, #0FF2BH ;实验箱接线决定8255的控制口地址为FF2BHMOVX @DPTR, A ;将命令字82H送给8255控制口确定各口工作方式(2)显示数据子程序显示数据子程序流程图如图7.6所示。
______________________________________________________________________________________________________________ 电子信息学院
实验报告书
课程名:《单片机原理及应用实验》
题目:实验六按键识别数码管显示实验
软件+硬件实验
实验类别:【设计】
班级:电子1313
学号:26
姓名:吴限
评语:
(1)电路连接调试:□正确□基本正确□不正确
(2)实验程序编写:□正确□基本正确□不正确
(3)数据测量分析:□准确□基本准确□不准确
成绩:□A □B □C □D ,指导教师:王英赫
批阅时间:2016年月日
精品资料
1、实验内容或题目
1)题目:按键识别数码管显示实验
2)实验内容:数码管显示矩阵按键号。
2、实验目的与要求
1)实验目的:
掌握按键识别及数码管显示的实现方法。
2)实验要求:
通过XL2000 的16 位矩阵按键,在数码管上分别显示0~9,A,B,C,D,E,F 。
用Keil 编译、Proteus 仿真,代码下载到单片机实验箱上验证。
3、实验仪器
(1)PC 微机 1台
(2)实验箱 1台
4、实验程序流程图
开始
初始化程序
延时去抖动
有键按下
N
N
Y
5、实验程序
(实验程序清单作为附件放在最后)
6、实验步骤
1)keil 中C 语言程序实现。
2)在proteus 中完成电路图设计,并实现仿真。
3)硬件实验部分:
用一条8PIN 数据排线,把矩阵按键部份的JP50,接到CPU 部份的P1 口JP44;接8 位数码管的数据线。
将数码管部份的数据口 JP5 接到CPU 部份的P0 口JP51;接8 位数码管的显示位线。
将数码管部份的显示位口 JP8 接到CPU 部份的P2 口JP52.
7、实验数据及结果
结束
显示相应的数字
有键按下
判断哪个键按下
Y
8、思考题
采用P3口控制矩阵按键输入,程序应该如何修改?
答:本实验的程序中可以不用蜂鸣器驱动线,把以下程序的sbit BEEP = P3 ^ 7;及函数void beep()等删掉后;需要把扫描键值的函数改一下:unsigned char keyscan()
{
unsigned char scan1, scan2, keycode,j;
P13= 0xf0;
scan1 = P3;
if (scan1 != 0xf0) //判键是否按下
{
delayms(10);
scan1 = P3;
if (scan1 != 0xf0) //二次判键是否按下
{
P1 = 0x0f;
scan2 = P3;
keycode = scan1 | scan2; //组合成键扫描编码
for (j = 0; j < 16; j++)
{
if (keycode == key_code[j]) //查表得键值
{
key = j;
return (key); //返回有效键值
}
}
}
}
else
P3 = 0xff;
return (key = 16); //返回无效码
} 即P1口换成P3口,而键编码数组是固定的,可以不变;
此外主函数中的P1口也要改为P3口:void main(void)
{
P0 = 0xf7; //数码管初始显示"-"
P2 = 0xfd;//数码管显示在第二位
P3 = 0xff;
while (1)
{
keyscan();
if (key < 16) //有效键值
{
P0 = disp_code[key]; //显示键值
}
}
}
<附件> 实验程序清单
#include <reg52.h>
#include <intrins.h>
sbit BEEP = P3 ^ 7; //蜂鸣器驱动线unsigned char key;
unsigned char code disp_code[] =
{
0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,
0x90,0x88,0x83,0xc6,
0xc0,0x86,0x8e,0xc0};
unsigned char code key_code[] =
{
0xee, 0xed, 0xeb, 0xe7, 0xde, 0xdd, 0xdb, 0xd7, 0xbe, 0xbd, 0xbb, 0xb7, 0x7e, 0x7d, 0x7b, 0x77 //键编码数组
};
char code SST516[3] _at_ 0x003b; //保留仿真器
/********************延时子函数***************/
void delayms(unsigned int ms)
{
unsigned char t;
while (ms--)
{
for (t = 0; t < 114; t++);
}
}
/*************x*0.14MS 延时子函数****************/
void delayus(unsigned char x)
{
unsigned char i;
while (x--)
{
for (i = 0; i < 14; i++)
{;
}
}
}
/******************蜂鸣器驱动子函数*****************/ void beep()
{
unsigned char i;
for (i = 0; i < 250; i++)
{
delayus(6);
BEEP = !BEEP; //BEEP取反
}
BEEP = 1; //关闭蜂鸣器
delayms(150); //延时
}
/******************键盘扫描子函数*********************/ unsigned char keyscan()
{
unsigned char scan1, scan2, keycode, j;
P1 = 0xf0;
scan1 = P1;
if (scan1 != 0xf0) //判键是否按下
{
delayms(10); //延时10ms
scan1 = P1;
if (scan1 != 0xf0) //二次判键是否按下
{
P1 = 0x0f;
scan2 = P1;
keycode = scan1 | scan2; //组合成键扫描编码
for ( j = 0; j < 16; j++)
{
if (keycode == key_code[ j]) //查表得键值
{
key = j;
return (key); //返回有效键值
}
}
}
}
else
P1 = 0xff;
return (key = 16); //返回无效码
}
/*************************主函数***********************/ void main(void)
{
P0 = 0xf7; //数码管初始显示"-"
P2 = 0xfd;//数码管显示在第二位
P1 = 0xff;
while (1)
{
keyscan();
if (key < 16) //有效键值
{
P0 = disp_code[key]; //显示键值
beep(); //蜂鸣器响一声
}
}
}
______________________________________________________________________________________________________________
Welcome To Download !!!
欢迎您的下载,资料仅供参考!
精品资料。