1:串行通信的初步认识
所谓串口,就是在一条路上所有车辆排队依次穿过,STC12C5A60S2单片机有两个专门用来做UART串行通信,一个是P3.0一个是P3.1,他们还有另外一个名字叫RXD和TXD,由他们组成的通信接口叫串口。比如发送一个数据0x8A,转化为二进制为,10001010,在通信中以低位先发,高位后发的原则,先发送一个0一段时间又发送一个1,......一直把8位二进制全部发送完毕。
在这里引入一个概念,发送二进制数据位的速率——波特率,baud。
2:USB串口通信
开发板上面的是CH340芯片——照片如下,3号引脚加了个4148的二极管,因为单片机下载程序时事冷启动,就是先下载后上电,上电瞬间单片机会先检测需不需要下载程序。如果没有此二极管开关后级单片机在断电情况下,3引脚和P3.0连在一起有电流会通过这个引脚流入后级电路并且给后级的电容充电,造成有一定幅度的电压差,可能会影响正常的冷启动
3:实现计算机与单片机之间的信息交互,把信息在数码管上显示出来
#include <STC12C5A60S2.H>
unsigned char code LedChar[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};//数码管真值表
unsigned char LedBuff[7] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};//数码管缓冲区
unsigned char T0RH = 0;//TO重载值高字节
unsigned char T0RL = 0; //低字节
unsigned char RxdByte = 0; //串口接受的字节
void ConfigTimer0(unsigned int ms);
void ConfigUART(unsigned int baud);
void main()
{
EA = 1;
P11=0;//打开数码管显示
ConfigTimer0(1); //配置T0定制1毫秒ConfigUART(9600); //配置波特率9600
while (1)
{
LedBuff[0] = LedChar[RxdByte & 0x0F];
LedBuff[1] = LedChar[RxdByte >> 4];
}//将收到的字节化为十六进制显示出来
}
//配置启动定时器
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;
tmp = 32000000 / 12;
tmp = (tmp * ms) / 1000;
tmp = 65536 - tmp;
tmp = tmp + 18; //ҹӥא׏ЬӦғʱլԉքϳӮ
T0RH = (unsigned char)(tmp>>8);
T0RL = (unsigned char)tmp;
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = T0RH;
TL0 = T0RL;
ET0 = 1;
TR0 = 1;
}
//串口配置
void ConfigUART(unsigned int baud)
{
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TH1 = 256 - (32000000/12/32)/baud;
TL1 = TH1;
ET1 = 0;
ES = 1;
TR1 = 1; //Ǵ֯T1
}
//数码管动态扫描
void LedScan()
{
static unsigned char i = 0;
P0 = 0xFF; //
P2 = (P2 & 0xF8) | i;
P0 = LedBuff;
if (i < 6)
i++;
else
i = 0;
}
//T0中断
void InterruptTimer0() interrupt 1
{
TH0 = T0RH;
TL0 = T0RL;
LedScan();
//UART通讯中断
void InterruptUART() interrupt 4
{
if (RI) //接收到字节
{
RI = 0;
RxdByte = SBUF;
SBUF = RxdByte;
}
if (TI) //字节发送完毕
{
TI = 0;
}
}
|