一、实验目的
单片机A发送矩阵键盘输入自己学号后8位,单片机B接收后用8位数码管动态显示。
二、实验原理
1. 矩阵键盘原理
行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。
2. 数码管动态显示原理
动态显示的特点是将所有数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
3. 双机通信原理
甲机和乙机的RXD和TXD相互交叉相连,甲机(左)设为发送端,乙机(右)作为接收端,甲机读取矩阵按键的键值后,通过串行口发送到乙机,乙机将接收到的甲机的键值传送到数码管进行动态显示。
4. TH1、TL1初值计算(方式2)
此处采用4800kbit/s的波特率,SMOD = 1,根据初值计算公式有:
因此,TH1和TL1的初值都为0XF3。
三、使用仪器及软件
①Keil uVision5 ②Proteus 8 Professional ③PZ-ISP ③51单片机开发板
四、实验方案设计
此单片机双机通信的设计中,串行口工作方式设置为1,计数器工作方式设置为2,使用定时器T1,
波特率采用4800kbit/s,矩阵键盘采用行列扫描方式,先定义一个unsigned char格式的变量k,并用k获取矩阵键盘行列扫描的键值,然后将k串行发送出去。
五、实验步骤
- 定义k并初始化
- 串口初始化
- 矩阵键盘行列扫描得到键值
- 将键值传给k
- 当k的值发生变化时,将k穿行发送
- 发送完毕后发送标志位置0
六、实验结果及分析
硬件仿真
源代码
一、甲机
main.c
#include "key.h"
u8 keyvalue;
u8 receiveData;
void UsartInit()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,波特率4800
TL1=0XF3;
ES=0; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
void Usart() interrupt 4{
}
void main(void)
{
u8 k = 16;
UsartInit();
while(1)
{
k = keyscan();
if(k != 16)
{
SBUF = k; //启动串口发送
while(!TI);
TI = 0; //发送完毕,置位TI=0