51单片机之串口_键盘_数码管.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一、实验目的和要求 熟悉定时器、键盘、数码管及串口的工作原理; 熟悉查询或者中断的概念和工作原理; 能够用汇编语言/C 语言编写相关程序。 二、实验内容和原理 Figure 1系统流程图 键盘识别 为提高键盘识别的灵敏性和优先级,键盘识别由定时器中断触发,定时器的中断间隔设置为10ms,利用定时间隔作为软件延时的时间;同时为避免长时间的按键导致按键重复扫描,键盘识别采用状态机控制,总共四个状态,其转换如下: Figure 2键盘识别流程图 三、实验项目 四实验器材 五操作方法与实验步骤 六实验数据 七实验结果与分析 Figure 3键盘-串口接收实验结果 按键按下能通过串口发送正确的信息,同时由于软件消抖的作用,按键不会出现抖动,多次识别等不稳定现象,较好的完成了要求的内容。 串口接收+数码管显示实验: Figure 4串口发送-数码管实验结果 从串口发送的数据0,1,2,3,……C,D,E,F都能够在数码管上正确显示,而其余的字符由于数码管段数有限,作为0显示。总体上满足了实验的要求。 八问题与建议 九 #includereg51.h //#includestdio.h /* 接口说明: P0口接键盘;P0^0……P0^7 -- 行3,行2,行1,行0,列3,列2,列1,列0 P1口接数码管字形数据a--dp P2口接数码管位选 功能说明: 同时集成了串口收发功能, 实验箱按键按下会同时发送至PC与数码管, PC发送的内容(仅限于字符0-9与a-f)会显示到数码管, 键盘采用线反转法,状态机控制,避免按键按下重复取值 采用并行数模管,显示内容会向左更新 设计说明: 定时器0计时中断用于更新 数码管显示 定时器1用于串口通信 */ unsigned char rec_buff;//接收缓存 unsigned char key_ptr; //按键状态标识 unsigned char x,y; //键盘扫描横纵坐标值 unsigned char key; //识别的键值 unsigned char send_ptr; //发送标识 unsigned char code key_to_char[]=0123456789ABCDEF; unsigned char code LedTable[] = {0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0xF7,0xFF,0xB9,0xBF,0xF9,0xF1};//0-9,a-f 的字型码 unsigned char A; //键盘比较临时变量 unsigned char LED_buff[6];//LED 缓存内容 unsigned char LED_ptr; //LED 更新时指针位置 int i; void Timer_Init(void); //定时器初始化 void Uart_Init(void); //串口初始化 void init_main(void); //主函数初始化 void push_LED(unsigned char a); //数码管内容向左更新 unsigned char convert(unsigned char a); //返回扫描线横向纵向的位权 unsigned char LED_loc_convert(unsigned char loc); //数码管位选输入转换 unsigned char char_to_LED(unsigned char b); //接收的ASCII字符转换 void key_scan(void); //定时器0中断处理 void Uart_ISR(void); //串口中断处理 void Timer_Init(void)////////定时器初始化 { /////////////定时器0 TL0=0x00; //定时10ms TH0=0xFC; ET0 = 1; //开T0中断 TR0=1; //启动T0定时 /////////////定时器1 */ TL1 = 0xF3; // 波特率为2400bps TH1 = 0xF3; //TL1 = 0xFD; // 波特率为9600bps //TH1 = 0xFD; ET1 = 0; // 关闭T1中断 TR1 = 1; // 启动T1定时 TMOD = 0x21; //T0处于方式1, T1处于方式2--8位自动重装 } void Uart_Init(void) /////串口初始

文档评论(0)

pangzilva + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档