单片机按键程序设计
- 格式:ppt
- 大小:248.50 KB
- 文档页数:10
东北石油大学实习总结报告实习类型生产实习实习单位东北石油大学实习基地实习起止时间 2018年7月7日至2018年7月16日指导教师刘东明、孙鉴所在院(系)电子科学学院班级电子科学与技术15-2学生姓名学号 022018年 7月 16日目录第1章按键控制流水灯设计 (1)实习目的.............................. 错误!未定义书签。
实习要求.............................. 错误!未定义书签。
第2章电路工作原理 (2)STC89C52单片机工作原理 (2)LED工作原理 (3)按键工作原理 (3)整体电路图 (5)本章小结 (6)第3章 C程序设计 (7)程序设计流程图 (7)实验结果 (8)本章小结 (9)总结及体会 (10)参考文献 (11)附录 (12)第1章按键控制流水灯设计1.1实习目的本次实习以STC89C52单片机为控制核心。
通过它实现对八盏LED 灯的亮灭进行设定,并在设定完成之后能够按照之前的设定实现流水灯效果。
外部电路为按键控制流水灯。
P0口控制八盏灯,P1口控制矩阵键盘,P2口控制独立按键,程序利用单片机内部计时器中断实现流水效果。
要求流水灯能够自行设定、暂停、复位,工作稳定,可靠性高。
生产实习的主要目的是培养理论联系实际的能力,提高实际动手操作能力。
本专业的生产实习旨在广泛了解实际单片机电子产品工作的全过程,熟悉电子产品的主要技术管理模式,并在实习的操作过程中学习掌握电子产品的焊接安装调试的实际操作技能。
巩固和加深理解所学的理论,开阔眼界,提高潜力,为培养高素质大学本科人才打下必要的基础。
透过学习,是理论与实际相结合,能够使学生加深对所学知识的理解,并为后续专业课的学习带给必要的感性知识,同时直接了解本业的生产过程和生产资料,为将来走上工作岗位带给必要的实际生产知识。
1.2实习要求1.深入学习单片机开发软件Keil的使用,熟悉单片机电路设计,根据实际应用电路对程序进行调试。
• 87•单片机按键程序的编写各种教材上都有介绍,但在工程应用上却存在某些不足。
本文通过工程实践,从多种按键程序各自特点进行了研究,以几种优选程序供各位单片机使用者参考。
为了能说明问题,以下分析均以图1常开按钮开关与单片机硬件的连接为准。
许多的按键程序设计思想是等待键释放才执行按键按下后的动作,这虽然解决了按键被按住不放而引发的问题。
“待键释放”编程思想在程序比较短小的情况下问题还不突出,较大型些的程序则一直在反复等待键释放不仅电路灵敏度降低且会让单片机工作状态不稳甚至“死机”。
为此,实际使用中的按键程序一般都不采用等键释放的编程思想。
图1 按键与P1口连接图1 设置标志位以记录按键状态程序的主要部分及注释如下:void main( ){ bit flag=0;//定义按键标志位变量,初态为0while(1)//让程序在语句4至语句9之间不断循环{if(0==K1&&flag==0)//按键接通并且标志位是0时 {delayms(10);//延时10ms,避开键抖动 if(0==K1){//二次确认键被按下flag=1;//标志位置1,防止一次按键被重复执行 {按键对应语句}}//在此安排按键后要执行的动作语句if(1==K1)flag=0;}}//键释放标志位置0该编写方法好处是在按键被长按住不放时,不会重复执行“按键对应语句”且按键刚被按下“按键对应语句”即被执行。
而且若要记录同一按键被按下了几次也容易实现:只要在上例程序的语句8改为:count=(count+1)%9;(count 是无符号全局变量)并在语句9后面添加以下的语句:switch(count){ case 1:按第1次键要执行的语句;break ; case 2:按第2次键要执行的语句;break ;……}}}2 同时判别几个按键状态根据图1写出按键函数:void key( )//按键函数{P1=P1|0X0F;//置P1低四位为高电平if(Pre_key==(P1&0X0F))return; //按键状态不变时提前结束按键函数Pre_key=P1&0X0F;//保存当前新的按键状态if(!K1){//如果四个键中是K1被按下delayms(10)//10ms消键抖if(!K1){//二次确认K1被按下K1按下后要执行的语句}}}K2、K3、K4被按下程序也同语句5至语句8类似编写,不再赘述。
单片机按键程序设计单片机按键的基本原理其实并不复杂。
通常,按键就是一个简单的开关,当按键按下时,电路接通,对应的引脚电平发生变化;当按键松开时,电路断开,引脚电平恢复到初始状态。
在程序设计中,我们需要不断检测引脚的电平变化,从而判断按键是否被按下。
在实际的按键程序设计中,有多种方式可以实现按键检测。
其中一种常见的方法是查询法。
这种方法是通过不断地读取按键对应的引脚状态来判断按键是否被按下。
以下是一个简单的查询法示例代码:```cinclude <reg51h> //包含 51 单片机的头文件sbit key = P1^0; //定义按键连接的引脚void main(){while(1) //无限循环{if(key == 0) //如果按键按下,引脚为低电平{//执行按键按下的操作//比如点亮一个 LED 灯P2 = 0xfe;while(key == 0);//等待按键松开}}}```上述代码中,我们首先定义了按键连接的引脚`key`,然后在主函数的无限循环中不断检测按键引脚的状态。
当检测到按键按下时,执行相应的操作,并通过`while(key == 0)`等待按键松开。
除了查询法,还有中断法可以用于按键检测。
中断法的优点是能够及时响应按键动作,不会因为程序的其他操作而导致按键响应延迟。
```cinclude <reg51h> //包含 51 单片机的头文件sbit key = P1^0; //定义按键连接的引脚void int0_init()//中断初始化函数{IT0 = 1; //下降沿触发中断EX0 = 1; //使能外部中断 0EA = 1; //开总中断}void int0() interrupt 0 //外部中断 0 服务函数{//执行按键按下的操作//比如点亮一个 LED 灯P2 = 0xfe;}void main(){int0_init();//初始化中断while(1);//无限循环,保持程序运行}```在上述代码中,我们首先在`int0_init` 函数中对中断进行了初始化设置,然后在`int0` 函数中编写了按键按下时的处理代码。
单片机程序设计案例随着科技的发展,单片机作为一种重要的计算机控制器件,被广泛应用于各个领域。
单片机程序设计是指基于特定单片机平台,通过编程实现对硬件设备进行控制和操作的过程。
本文将以一个实际案例来介绍单片机程序设计的基本步骤和注意事项。
1. 硬件介绍以“智能温控器”为例,该设备用于对室内温度进行自动调节。
硬件包括温度传感器、LCD显示屏、按键开关等。
单片机作为控制核心,通过读取传感器的温度数值,根据设定值进行比较,并控制加热或制冷装置,实现温度的自动调节。
2. 基本流程首先,需要了解所选择的单片机的硬件引脚功能和操作指令。
根据硬件的接口需求,设计合适的接线连接,确保硬件设备能够正常工作。
接下来,编写程序代码,包括引入所需的头文件、定义相关变量和函数,以及编写主要功能模块的代码。
最后,通过编译和下载,将程序烧录到单片机中,实现对硬件的控制。
3. 程序设计针对智能温控器,首先需要初始化各硬件设备,包括温度传感器、LCD显示屏和按键开关。
接着,编写温度读取功能,从传感器中获取实时的温度数值。
根据设定的目标温度值,编写温度比较函数,判断当前温度是偏高还是偏低,并相应控制加热或制冷装置。
同时,将温度数值和控制结果显示在LCD上,方便用户查看。
4. 调试和优化在程序设计完成后,需要进行调试和优化。
首先,通过单步调试和断点调试等方式,逐行分析程序的执行过程,确保每个功能模块都能正确运行。
其次,要注意检查是否存在逻辑错误、语法错误以及硬件连接错误等。
最后,根据实际使用情况,对程序进行优化,提高性能和稳定性。
5. 实际应用通过单片机程序设计,可以实现各种应用场景下的控制需求。
比如,智能家居中的灯光控制、电子秤中的显示和计量、机器人中的运动控制等等。
这些都需要根据具体硬件设备和功能需求来进行程序设计。
总结单片机程序设计是一项具有挑战性和创造性的工作。
通过学习和实践,我们可以熟练掌握单片机的基本原理和编程技巧,实现各种有趣的应用。
单片机c语言程序设计---矩阵式键盘实验报告课程名称:单片机c语言设计实验类型:设计型实验实验项目名称:矩阵式键盘实验一、实验目的和要求1.掌握矩阵式键盘结构2.掌握矩阵式键盘工作原理3.掌握矩阵式键盘的两种常用编程方法,即扫描法和反转法二、实验内容和原理实验1.矩阵式键盘实验功能:用数码管显示4*4矩阵式键盘的按键值,当K1按下后,数码管显示数字0,当K2按下后,显示为1,以此类推,当按下K16,显示F。
(1)硬件设计电路原理图如下仿真所需元器件(2)proteus仿真通过Keil编译后,利用protues软件进行仿真。
在protues ISIS 编译环境中绘制仿真电路图,将编译好的“xxx.hex”文件加入AT89C51。
启动仿真,观察仿真结果。
操作方完成矩阵式键盘实验。
具体包括绘制仿真电路图、编写c源程序(反转法和扫描法)、进行仿真并观察仿真结果,需要保存原理图截图,保存c源程序,总结观察的仿真结果。
完成思考题。
三、实验方法与实验步骤1.按照硬件设计在protues上按照所给硬件设计绘制电路图。
2.在keil上进行编译后生成“xxx.hex”文件。
3.编译好的“xxx.hex”文件加入AT89C51。
启动仿真,观察仿真结果。
四、实验结果与分析void Scan_line()//扫描行{Delay(10);//消抖switch ( P1 ){case 0x0e: i=1;break;case 0x0d: i=2;break;case 0x0b: i=3;break;case 0x07: i=4;break;default: i=0;//未按下break;}}void Scan_list()//扫描列{Delay(10);//消抖switch ( P1 ){case 0x70: j=1;break;case 0xb0: j=2;break;case 0xd0: j=3;break;case 0xe0: j=4;break;default: j=0;//未按下break;}}void Show_Key(){if( i != 0 && j != 0 ) P0=table[ ( i - 1 ) * 4 + j - 1 ];else P0=0xff;}五、讨论和心得。
单片机矩阵按键扫描程序设计作者:谭艳来源:《数字化用户》2013年第09期【摘要】单片机矩阵键盘是常用的人机对话输入设备,本文提出一种新的矩阵键盘扫描程序设计,可以大大李节省系统资源,提高效率。
【关键词】单片机矩阵键盘扫描程序键盘是微型计算机系统中最常用的人机对话输入设备。
在单片机应用系统中,为了控制系统的工作状态,以及向系统输入数据,应用系统需要单独设计专用的小键盘。
矩阵按键扫描程序是一种节省系统资源的方法,按键数目越多节省的系统资源就越可观,本程序的思路:先判断某一列(行)是否有按键按下,再判断该行(列)是那一只键按下。
但是,在程序的写法上,采用了最简单的方法,使得程序效率最高。
一、设计理念本程序中,如果检测到某键按下了,就不再检测其它的按键,这完全能满足绝大多数需要,又能节省大量的CPU时间。
另外,键盘用延时程序来消除抖动,完全是浪费时间。
试想,如果不用中断执行(用中断执行需要更多的硬件资源)的方法来扫描键盘,每秒钟扫描20-100次,每次都要延时10-20MS的话,单片机还有多少时间做正事呢?其实,延时的这段时间,CPU可以做其它的事务。
所以,本键盘扫描程序的前面后面都可以加入一些代码,既可以达到完美的消抖动效果,又可以扩展其它的功能(例如按键封锁、按键长按等按键功能复用)。
二、设计程序本键盘扫描子程序名叫key,每次要扫描时用call key调用即可。
以下子程序内容:key:mov p0,#00001111b;上四位和下四位分别为行和列,所以送出高低电压检查有没有按键按下jmp k10;跳到K10处开始扫描,这里可以改成其它条件转移指令来决定本次扫描是否要继续,例如减1为0转移或者位为1或0才转移,这主要用来增加功能,确认上一按键功能是否完成?是否相当于经过了延时?是否要封锁键盘?goend:jmp kend;如果上面判断本次不执行键盘扫描程序,则立即转到程序尾部,不要浪费CPU的时间k10:jb p0.0,k20;扫描正式开始,先检查列1四个键是否有键按下,如果没有,则跳到K20检查列2k11:mov p0,#11101111b;列1有键按下时,P0.0变低,到底是那一个键按下?现在分别输出各行低电平jb p0.0,k12;该行的键不按下时,p0.0为高电平,跳到到K12,检查其它的行mov r1,#1;如果正好是这行的键按下,将寄存器R0写下1,表示1号键按下了k12:mov p0,#11011111bjb p0.0,k13mov r1,#2;如果正好是这行的键按下,将寄存器R0写下2,表示2号键按下了k13:mov p0,#10111111bjb p0.0,k14mov r1,#3;如果正好是这行的键按下,将寄存器R0写下3,表示3号键按下了k14:mov p0,#01111111bjb p0.0,kend;如果现在四个键都没有按下,可能按键松开或干扰,退出扫描(以后相同)mov r1,#4如果正好是这行的键按下,将寄存器R0写下4,表示4号键按下了jmp kend;已经找到按下的键,跳到结尾。
单片机课程设计报告组号: 04组员: 45号31号10号03号43号班级: 09机电(4)班相关说明(一)设计目的1.熟悉51系列单片机的使用。
2.熟悉汇编语言编程。
3.掌握单片机应用系统的设计方法过程及实现。
(二)设计任务描述、要求键控彩灯系统:1.键盘控制其运行及其停止。
2.键盘控制其流水作业及流动方向。
3.键盘控制其点亮方式成员分工情况:袁德:04组长。
总设计,将任务说明、框图、功能模块图及相关说明分给成员,协助程序编辑和错误处理,查找资料心得体会。
汤跃:担任软件设计,根据功能模块图细分出流程图编辑相应程序与功能相关说明,查找资料。
曾玉珍:担任硬件设计,根据总框图在DXP软件中画出原理图、PCB 板,查找资料。
邱根:进行WORD排版,与协助汤跃的软件设计和查找资料。
曹琦:对进行编辑完的程序在仿真软件上进行仿真训练和错误处理。
目录第1章硬件设计 (1)总体框图 (1)1.2 原理图与PCB板图 (2)1.3 80C51相关说明: (4)第2章软件设计 (6)2.1 功能模块图 (6)主控流程图 (7)键盘检测流程图 (9)功能键处理流程图 (13)2.5显示彩灯流程图 (15)2.6代码实现 (20)第3章仿真与调试 (29)调试步骤 (29)错误处理 (31)仿真结果 (32)第4章设计体会 (33)参考文献 (35)第1章硬件设计功能说明:电源:80C51单片机使用5V电源,其中正极接40引脚,负极接20引脚。
振荡电路:在80C51单片机内部集成了一个高增益方向放大器,用于构成放大器,只要接上晶振和电容即可构成完整的振荡电器。
晶振跨接于18 (XTAL2出)和19( XTAL1入)引脚之间,18和19引脚对地并联两只小电容,其中晶振可以使用12MHz的小卧式晶振,电容可在18~47pF之间取值,一般可以使用27pF的小磁片电容。
复位电路:单片机上的9引脚(RST)是复位引脚,采用的是手动复位,其中其中电容用10uF,而接到RST与地之间的电阻用10kΩEA/Vpp引脚:31引脚为EA/Vpp,该引脚接地。
#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define LCD_IO P2sbit KK1 = P3^2; //按键输入;sbit KK2 = P3^3; //按键输入;sbit LCD_RS = P3^5;sbit LCD_RW = P3^6;sbit LCD_EN = P3^7;uchar code LCD_line1[] = " The Counter";int idata mydata=0;/************************************************************** * 名称: Delay_1ms()* 功能: 延时子程序,延时时间为1ms * x* 输入: x (延时一毫秒的个数)* 输出: 无***************************************************************/ void Delay_1ms(uint x){uchar i, j;for(i = 0; i < x; i++) for(j = 0; j <= 148; j++);}/************************************************************** * 名称: lcd_bz( )* 功能: 测试忙碌子程序* 输入: 无* 输出: result***************************************************************/ bit lcd_bz(){bit result;LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;_nop_();_nop_();_nop_();_nop_();result=(bit)(P3&0x80);LCD_EN = 0;return result;}/*************************************************************** 名称: W_LCD_Com( )* 功能: 写指令子程序* 输入: com* 输出: 无***************************************************************/void W_LCD_Com(uchar com){while(lcd_bz());LCD_RS = 0; LCD_RW=0; LCD_EN = 0; // LCD_RS和R/W同时为低电平时,可以写入指令LCD_IO = com; Delay_1ms(5); //下面用EN输入一个高脉冲LCD_EN = 1; Delay_1ms(5); LCD_EN = 0;}/*************************************************************** 名称: W_LCD_Dat( )* 功能: 写数据子程序* 输入: dat* 输出: 无***************************************************************/void W_LCD_Dat(uchar dat){while(lcd_bz());LCD_RS = 1; LCD_RW=0;LCD_EN = 0; // LCD_RS为高,LCD_RW为低时,可以写入数据LCD_IO = dat; Delay_1ms(5); //下面用EN输入一个高脉冲LCD_EN = 1; Delay_1ms(5); LCD_EN = 0;}/*************************************************************** 名称: W_LCD_STR( )* 功能: 写字符串子程序* 输入: *s* 输出: 无***************************************************************/void W_LCD_STR(uchar *s){while(*s > 0) {W_LCD_Dat(*s); s++;}}/*************************************************************** 名称: LCD_cursor( )* 功能: 设置光标位置子程序* 输入: pos* 输出: 无***************************************************************/void LCD_cursor(uchar pos) //LCD光标定位到处{W_LCD_Com(pos+0x80); //第一行地址是0x80}/*************************************************************** 名称: initial( )* 功能: 初始化子程序* 输入: 无* 输出: 无* 指令:#define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一#define LCD_DISPLAY_ON 0x0C //显示开#define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示***************************************************************/void initial(){W_LCD_Com(0x06|0x04);W_LCD_Com(0x0c|0x08);W_LCD_Com(0x38);W_LCD_STR(LCD_line1);}/*************************************************************** 名称: Main()* 功能: 主函数***************************************************************/void main(){bit flag;uchar temp;uchar pos;Delay_1ms(10) ;initial();while(1){pos=0x4f;if(mydata>255)mydata=0;else if(mydata<0)mydata=255;if(mydata>127) //把mydata当做-128~127的有符号数来显示{flag=1;temp=256-mydata;}else {temp=mydata;flag=0;}LCD_cursor(pos);W_LCD_Dat((temp%10)+'0');pos--;//光标左移(其实光标不显示,只是为了输出高位)Delay_1ms(10);if(temp/100 || temp/10){LCD_cursor(pos);W_LCD_Dat((temp/10)%10+'0');pos--;}Delay_1ms(10);if(temp/100){LCD_cursor(pos);W_LCD_Dat((temp/100)%10+'0');pos--;}if(flag){LCD_cursor(pos);W_LCD_Dat('-');//负号}else{ LCD_cursor(pos);W_LCD_Dat(' ');//清除负号(空格代替)}if(!KK1){while(KK2);while(!KK2);mydata++;}else if(!KK2){while(KK1);while(!KK1);mydata--;}} }。