键盘数码管及串口间的通信实验报告.docx
- 文档编号:13808391
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:13
- 大小:215.06KB
键盘数码管及串口间的通信实验报告.docx
《键盘数码管及串口间的通信实验报告.docx》由会员分享,可在线阅读,更多相关《键盘数码管及串口间的通信实验报告.docx(13页珍藏版)》请在冰点文库上搜索。
键盘数码管及串口间的通信实验报告
《本科实验报告》填写说明
1.学员完成人才培养方案和课程标准要所要求的每个实验后,均须提交实验报告。
2.实验报告封面必须打印,报告内容可以手写或打印。
3.实验报告内容编排及打印应符合以下要求:
(1)采用A4(21cm×29.7cm)白色复印纸,单面黑字打印。
上下左右各侧的页边距均为3cm;缺省文档网格:
字号为小4号,中文为宋体,英文和阿拉伯数字为TimesNewRoman,每页30行,每行36字;页脚距边界为2.5cm,页码置于页脚、居中,采用小5号阿拉伯数字从1开始连续编排,封面不编页码。
(2)报告正文最多可设四级标题,字体均为黑体,第一级标题字号为4号,其余各级标题为小4号;标题序号第一级用“一、”、“二、”……,第二级用“
(一)”、“
(二)”……,第三级用“1.”、“2.”……,第四级用“
(1)”、“
(2)”……,分别按序连续编排。
(3)正文插图、表格中的文字字号均为5号。
一、实验目的和要求
1、熟悉定时器、键盘、数码管及串口的工作原理;
2、熟悉查询或者中断的概念和工作原理;
3、能够用汇编语言/C语言编写相关程序。
二、实验内容和原理
(一)实验内容为:
1.键盘输入+串口发送实验,串口发送内容为键盘输入键值,键值自行定义;
2.串口接收+数码管显示实验,把串口接收的内容通过数码管显示出来。
(二)依据的原理:
1.根据实验箱的硬件环境,单片机选为NXP公司的P89V51RD2(与80C51兼容),时钟频率为6.144MHz,串口处于工作方式1,波特率为2400bps。
2.按照要求编写相应程序,采用KeilC51进行编译,首先在集成开发环境上进行仿真,确保程序正确,然后下载到实验箱上进行检查。
3.单片机和微机都带有符合RC232C的串口,利用实验箱上的键盘、数码管和串口进行通信实验,进一步熟悉单片机的硬件、程序设计以及单片机系统开发流程。
三、实验项目
(一)实验项目:
键盘、数码管及串口间的通信
(二)实验原理:
1.初始化:
启动定时器0(用于更新数码管的显示与键盘扫描)、定时器1(用于串口与实验箱通信),串口初始化,置各种值为0,中断置1,开中断
2.
键盘数码管:
当键盘按下后,与键盘相连的P0口发生变化,当检测到这种变化时,将行、列的变化值用x,y记录下来,经过转换,可以得到键盘上的数字值,再通过与数码管相连的P1、P2口显示到数码管上,这里,用P2控制位选,P1控制字形
3.
键盘PC机:
自初始化置TI为1后,出发串口中断循环执行,当发生按键时,不仅会在数码管上显示出来,而且会将send_ptr(发送标志位)设为1,此时,会将键值变换成ASCII码后送给串口的SBUF,然后即可在串口调试助手的窗口中显示出来
4.
PC机数码管:
在串口调试助手的输入窗口中输入一串十六进制数字,串口串行地将数字送给SBUF,SBUF通过P1和P2口显示到数码管上
四、实验器材
(一)清华科教TMC-2实验箱、USB转串口电缆;
(二)华硕F80cPC机及Win7操作系统、KeilC51集成开发环境、FlashMagic、串口调试助手。
五、操作方法与实验步骤
写出实验操作的总体思路、操作规范和主要注意事项;按顺序记录实验中每一个环节和实验现象。
画出必要的实验装置结构示意图,并配以相应文字说明;
(一)总体思路:
已在“实验项目”中说明;
(二)操作规范和主要注意事项:
我认为有这么几点,一是芯片一定要放对位置;二是要分清阴极和阳极;三是线要接对;四是要正确配置好各种参数;五是要走正确的步骤。
(三)实验环节及现象:
1.编写键盘、数码管及串口通信程序,代码在文档的后面章节中;
2.采用KeilC51集成开发环境进行编译、仿真,生成hex文件;
3.准备实验箱运行环境,将实验箱连接到PC机上,调试参数;
4.将hex文件下载到实验箱上,复位后,可以开始在键盘或PC机上操作。
六、实验数据
七、实验结果与分析
发送123456877后,数码管上出现456877六个数字,这说明串口是串行地将数字发送过去,并且会一位位向左移动,最后只留下6位数字。
八、问题与建议
这次实验感觉比较难,要理解各种操作的原理、细节,而且实验箱不同,做出来的效果不同,然后我觉得要多向教员、小教员或者同学请教,通过交流,能更深地理解原理之类的。
我认为老师应该多给些辅助性的文档,让我们个人能钻研地更深。
九、源程序
#include
unsignedcharrec_buff;//接收缓存
unsignedcharkey_ptr;//按键状态标识
unsignedcharx,y;//键盘扫描横纵坐标值
unsignedcharkey;//识别的键值
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缓存内容
unsignedcharLED_ptr;//LED更新时指针位置
inti;
voidTimer_Init(void);//定时器初始化
voidUart_Init(void);//串口初始化
voidinit_main(void);//主函数初始化
voidpush_LED(unsignedchara);//数码管内容向左更新
unsignedcharconvert(unsignedchara);//返回扫描线横向纵向的位权
unsignedcharLED_loc_convert(unsignedcharloc);//数码管位选输入转换
unsignedcharchar_to_LED(unsignedcharb);//接收的ASCII字符转换
voidkey_scan(void);//定时器0中断处理
voidUart_ISR(void);//串口中断处理
voidTimer_Init(void)////////定时器初始化
{
/////////////定时器0
TL0=0x00;//定时10ms
TH0=0xFC;
ET0=1;//开T0中断
TR0=1;//启动T0定时
/////////////定时器1*/
TL1=0xF3;//波特率为2400bps
TH1=0xF3;
ET1=0;//关闭T1中断
TR1=1;//启动T1定时
TMOD=0x21;//T0处于方式1,T1处于方式2--8位自动重装
}
voidUart_Init(void)/////串口初始化
{
PCON=0x80;//波特率加倍
SCON=0x50;//方式1,波特率可编程T1,允许接收
ES=1;//使能串口中断
}
voidinit_main(void)////主函数初始化
{
x=0;
y=0;//键盘扫描的横纵坐标值
key=0;//识别的键值
key_ptr=0;//按键状态标识
send_ptr=0;//发送标识
LED_ptr=0x01;//LED更新时指针位置
EA=1;//全局中断开;
TI=1;
}
voidpush_LED(unsignedchara)//数码管内容向左更新
{
for(i=5;i>0;i--)LED_buff[i]=LED_buff[i-1];
LED_buff[0]=a;
}
unsignedcharconvert(unsignedchara)//返回扫描线横向纵向的位权
{
switch(a)
{
case0x0E:
return0x00;
case0x0D:
return0x04;
case0x0B:
return0x08;
case0x07:
return0x0C;
case0xE0:
return0x00;
case0xD0:
return0x01;
case0xB0:
return0x02;
case0x70:
return0x03;
}
return0x00;
}
unsignedcharLED_loc_convert(unsignedcharloc)//数码管位选输入转换
{
switch(loc)
{
case0x00:
return0x01;
case0x01:
return0x02;
case0x02:
return0x04;
case0x03:
return0x08;
case0x04:
return0x10;
case0x05:
return0x20;
default:
return0x00;
}
}
unsignedcharchar_to_LED(unsignedcharb)//接收的ASCII字符转换
{
if(b>=0x30&&b<=0x39)returnb-0x30;
if(b>=0x41&&b<=0x46)returnb-0x37;
return0;
}
voidkey_scan(void)interrupt1//定时器0中断处理
{
TL0=0x00;//定时10ms
TH0=0xFC;
if(LED_ptr==0x05)LED_ptr=0x00;
elseLED_ptr++;
P2=LED_loc_convert(LED_ptr);//由LED_ptr获得位选
P1=LED_buff[LED_ptr];//从数码管BUFF得到显示内容
//printf("timer0\n");
switch(key_ptr)//键盘扫描状态机
{
case0x03:
{
P0=0x0F;
A=(P0&0x0F);
if(A==0x0F)
key_ptr=0x00;
elsekey_ptr=0x02;
break;
}
case0x02:
{
P0=0x0F;
A=(P0&0x0F);
if(A==0x0F)
key_ptr=0x03;
break;
}
case0x01:
{
P0=0x0F;
A=(P0&0x0F);
if(A!
=0x0F)//这就是有键盘按下,检测到有某列发生变化
{
x=A;//得到列的数值,
P0=0xF0;
A=(P0&0xF0);
y=A;//得到行的数值
key=convert(x)+convert(y);//得到键值
send_ptr=0x01;//发送标识设为1
push_LED(LedTable[key]);//数码管内容向左更新,然后最右边那位设为a,放到缓存中
key_ptr=0x02;
}
elsekey_ptr=0x00;
break;
}
case0x00:
{
P0=0x0F;
A=(P0&0x0F);
if(A!
=0x0F)
key_ptr=0x01;
break;
}
default:
key_ptr=0x00;
}
}
voidUart_ISR(void)interrupt4//串口中断处理
{
if(RI)//接收中断
{
RI=0;//清除接收中断标志
rec_buff=SBUF;//这里拿到的是ASCII码
push_LED(LedTable[char_to_LED(rec_buff)]);//先变成16进制的数字,放入LED缓存的是字形码
}
elseif(TI&&(send_ptr!
=0x00))//有发送中断并且发送标识不为0
{
TI=0;//清除发送中断标志
SBUF=key_to_char[key];
send_ptr=0x00;//发送标识清零
}
}
voidmain()
{
//初始化
Timer_Init();
Uart_Init();
init_main();
while
(1)
{
//死循环,等待中断
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 键盘 数码管 串口 通信 实验 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)