写在前面: 我是按照老师视频一步步来写的,但是到了输出字符串那一步就怎么也实现不了,无奈只能用之前串行基础的代码复制过来,终于成功发送了字符串。有同样情况的也建议用以前代码
0 基础知识
微控制器和外部设备的数据通信可分两种
串行通信 一位一位的顺序发送
并行通信 同时接发
串行通信有IIC SPI UART多种,通常是指UART
串行通信制式有 单工 半双工(可以接收或者发送,但同一时间只能是接受或发送中的一种) 全双工(可以同时进行接受发送)
串行通信的主要方式有 同步 和 异步
同步串行通信:需要使用一个时钟,以数据块为单位传送数据
异步串行通信 :每个设备都有自己的时钟信号,通信双方 波特率要保持一致 ,进行数据帧传送,一次传送一个帧
1 题目
2 完整代码
此代码以完全实现题目要求
板子为蓝桥杯指定板子
#include"reg52.h"
sfr AUXR = 0x8e;
void selectHC573()
{
P2 = (P2 | 0X1F) & 0x80;//打开LED所用的锁存器
}
unsigned char urdat;
void SendByte(unsigned char dat);
void SendString(unsigned char *str);
void InitUart()
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
SCON = 0x50;
AUXR = 0x00;
ES = 1;
EA = 1;
}
unsigned char command = 0x00;
void ServiceUart() interrupt 4
{
if(RI == 1)
{
RI = 0;
command = SBUF;
}
}
void working()
{
if(command != 0x00)
{
switch(command & 0xf0)
{
case 0xa0:
P0 = (P0 | 0x0f) & (~command | 0xf0);//P0 ¸ßËÄλ²»±ä£¬µÍËÄλ±ä³ÉÒªµãÁÁµÄÖµ
command = 0x00;
break;
case 0xb0:
P0 = (P0 | 0xf0) & ((~command <<4 )| 0x0f);//µÍËÄλ»¹ÊÇP0µÍËÄλ²»±ä£¬¸ßËÄλ±ä³ÉÒªµãÁÁµÄ´úÂë
command = 0x00;
break;
case 0xc0:
SendString("The System is Running..\r\n");
command = 0x00;
break;
}
}
}
void SendByte(unsigned char dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
void SendString(unsigned char *str)
{
while(*str != '\0')
{
SendByte(*str++);
}
}
void main()
{
InitUart();
selectHC573();
while(1)
{
working();
}
}
3 代码拆分讲解
void InitUart()
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
SCON = 0x50;
AUXR = 0x00;
ES = 1;
EA = 1;
}
3.1这是串口中断的初始化代码, 串口通信,我们先来看看怎么控制串口
模式选择 01 8位UART,波特率可调,REN位置1 ,允许接收,其他位置0不管
SCON = 0x50;
定时器用8位重装模式
TMOD = 0x20;
设置波特率位9600
TH1 = 0xfd;
TL1 = 0xfd;
3.2
void working()
{
if(command != 0x00)
{
switch(command & 0xf0)
{
case 0xa0:
P0 = (P0 | 0x0f) & (~command | 0xf0);//高四位不变,低四位变成能直接控制LED的代码
command = 0x00;
break;
case 0xb0:
P0 = (P0 | 0xf0) & ((~command <<4 )| 0x0f);//低四位不变,高四位变成能直接控制LED的代码
command = 0x00;
break;
case 0xc0:
SendString("The System is Running..\r\n");
command = 0x00;
break;
}
}
}
代码用到了简单数电知识,
P0 = (P0 | 0x0f) & (~command | 0xf0)
P0 | 0x0f 0与任意相或任意不变 这样就高四位还是P0的原来值,
(~command | 0xf0) f 与任意相或都是1 ,这样,后面的高四位就都是1,
最后整体 相与 ,前面的高四位是P0原来值,后面高四位是1 1 与任意相与 任意不变
低四位同样分析
case b0 同样分析
这个代码很巧妙的地方是 控制低四位时,高四位是不变的,即不影响L5-L8工作状态,控制高四位同理