单片机学习笔记
C51单片机串口通信
刚学单片机,照着各种教程模拟实现了串口通信,记下笔记,供自己和小伙伴参考;
本文分两个部分:
- 串口初始化,方便后续debug,即用printf函数在串口打印数据;
- 模拟串口通信,向串口发送想要发送的数据;
1 串口初始化:
先贴上代码及注释:
#include <stdio.h>
#include <reg51.h>
void InitUART(void)//使用定时器1作为串口波特率发生器
{
TH1 = 0xF3; //晶振11.0592mhz,波特率设为2400,具体计算公式为:TH1= 255-11059200/12/32/2400=243=0xf3,开始设置波特率为9600,发现一直乱码,改为2400就可以了;
TL1 = TH1;
TMOD = 0x20; //定时器1方式2,芯片手册默认使用定时器1设置串口波特率;
SCON = 0x50; //串口接收使能
ES = 1; //串口中断使能
TR1 = 1; //定时器1使能
TI = 1; //发送中断标记位,必须设置
EA = 1; //开总中断
}
void delay_ms(unsigned int t)
{
unsigned char a,b;
while(t--)
{
for(b=102;b>0;b--)
for(a=3;a>0;a--);
}
}
void main()
{
InitUART(); //初始化串口函数
while(1)
{
delay_ms(500);
printf("Hello World!\n"); //串口打印结果
}
}
以上,可直接实现printf函数在串口打印数据。
串口通信:
贴上代码及注释:
#include<stdio.h>
#include<reg52.h>
void delay883us(void) //delay883us,误差 -0.838541666667us;
{
unsigned char a,b;
for(b=162;b>0;b--)
for(a=1;a>0;a--);
}
void delay1200baud(void) //delay1/1200s,误差大概为+0.4us;
//延时函数计算方法:[(a*2+3)*b+5]=11059200/12/1200;
{
unsigned char a,b;
for(b=153;b>0;b--)
for(a=1;a>0;a--);
}
void delay_t(unsigned int j)
{
while(j--);
}
sbit RX = P3^0;
sbit TX = P3^1;
unsigned char i;
void send(unsigned char send_data)
{
unsigned int i;
TX = 1;
TX = 0;
P2 = P2>>1;
if(P2 == 0)
P2 = 0x80;
delay883us();
for(i=0;i<8;i++)
{
if(send_data&0x01)
{
TX=1;
}
else
{
TX=0;
}
delay1200baud();
send_data>>=1;
}
TX = 1;
delay_t(500000);
}
void main()
{
P2= 0x01;
while(1)
{
send('a');
}
}
代码功能为循环向串口发送字符串‘a’,经试验,以上代码可成功实现。
代码逻辑:首先TX置低,模拟起始位,然后开始传输八位数据,根据数据位将TX置高或置低传输数据,传输完成后,将TX置高,模拟停止位,结束传输;
其中波特率定为1200,大概延时应为833us,开始用的883us延时,结果数据居然传输成功了,后面改成833,也还是可以正确传输,告诫大家一定要细心;