资源描述:
《51单片机之串口_键盘_数码管》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、一、实验目的和要求Ø熟悉定时器、键盘、数码管及串口的工作原理;Ø熟悉查询或者中断的概念和工作原理;Ø能够用汇编语言/C语言编写相关程序。二、实验内容和原理(一)实验内容:Ø键盘输入+串口发送实验,串口发送内容为键盘输入键值,键值自行定义;Ø串口接收+数码管显示实验,把串口接收的内容通过数码管显示出来。(二)实验原理:单片机和微机都带有符合RC232C的串口,利用实验箱上的键盘、数码管和串口进行通信实验;键盘识别采用线反转法,同时利用软件延时消抖,扫描由定时器0每隔10ms触发一次。1.系统流程图:Figure1系统流程图111.键盘识别为提
2、高键盘识别的灵敏性和优先级,键盘识别由定时器中断触发,定时器的中断间隔设置为10ms,利用定时间隔作为软件延时的时间;同时为避免长时间的按键导致按键重复扫描,键盘识别采用状态机控制,总共四个状态,其转换如下:Figure2键盘识别流程图三、实验项目键盘、数码管及串口通信的实现四、实验器材Ø清华科教TMC-2实验箱、USB转串口电缆;ØPC机及Windowns7操作系统、KeilC51集成开发环境、串口调试助手。五、操作方法与实验步骤Ø编写程序代码;Ø搭建实验环境,将实验箱上的导线和串口通信线连好;Ø根据实验要求,对系统进行功能测试。六、实验
3、数据Ø键盘输入+串口发送实验:键盘分别按下0,1,2,3,……C,D,E,F;Ø串口接收+数码管显示实验:串口分别发送0,1,2,3,……C,D,E,F。七、实验结果与分析(一)键盘输入+串口发送实验结果与分析11Figure3键盘-串口接收实验结果按键按下能通过串口发送正确的信息,同时由于软件消抖的作用,按键不会出现抖动,多次识别等不稳定现象,较好的完成了要求的内容。(一)串口接收+数码管显示实验:Figure4串口发送-数码管实验结果从串口发送的数据0,1,2,3,……C,D,E,F都能够在数码管上正确显示,而其余的字符由于数码管段数有
4、限,作为0显示。总体上满足了实验的要求。11八、问题与建议程序最初编写完时,会出现各种bug,需要耐心调试和隔离测试,慢慢找出有问题的部分并予以改正。同时最开始,键盘按下时会一直扫描,而得到多个同样的值,最后将识别按下的方法也应用到识别松开按键的过程,同时用状态机识别控制,较好的解决了问题。通过本次实验我熟悉了串口,键盘和数码管的使用,对单片机综合能力的提升有较大益处。九、源程序#include//#include/*接口说明:P0口接键盘;P0^0……P0^7--行3,行2,行1,行0,列3,列2,列1
5、,列0P1口接数码管字形数据a--dpP2口接数码管位选功能说明:同时集成了串口收发功能,实验箱按键按下会同时发送至PC与数码管,PC发送的内容(仅限于字符0-9与a-f)会显示到数码管,键盘采用线反转法,状态机控制,避免按键按下重复取值采用并行数模管,显示内容会向左更新设计说明:定时器0计时中断用于更新数码管显示定时器1用于串口通信*/unsignedcharrec_buff;//接收缓存unsignedcharkey_ptr;//按键状态标识11unsignedcharx,y;//键盘扫描横纵坐标值unsignedcharkey;//识
6、别的键值unsignedcharsend_ptr;//发送标识unsignedcharcodekey_to_char[]="0123456789ABCDEF";unsignedcharcodeLedTable[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0xF7,0xFF,0xB9,0xBF,0xF9,0xF1};//0-9,a-f的字型码unsignedcharA;//键盘比较临时变量unsignedcharLED_buff[6];//LED缓存内容unsignedcharLE
7、D_ptr;//LED更新时指针位置inti;voidTimer_Init(void);//定时器初始化voidUart_Init(void);//串口初始化voidinit_main(void);//主函数初始化voidpush_LED(unsignedchara);//数码管内容向左更新unsignedcharconvert(unsignedchara);//返回扫描线横向纵向的位权unsignedcharLED_loc_convert(unsignedcharloc);//数码管位选输入转换unsignedcharchar_to_LE
8、D(unsignedcharb);//接收的ASCII字符转换voidkey_scan(void);//定时器0中断处理voidUart_ISR(void);//串口中断处理vo