这几天研究单片机通信,发现一些非常有趣的事情。在与单片机通信时,尽管程序没有任何问题,但是通信始终出现大量错误码,发送与接收的数据对应不上。后来不断实验,查找相关资料,发现一些重要的技术细节要引起重视,经过相应的调整,单片机通信终于顺利完成。先后测试了STC12C4052AD单片机与 STC12C5A602S单片机,都成功通信,基本没有发现错误码,接收与发送一切正常。现将要点记下备忘:
1.单片机的晶振。无论是内部晶振还是外部晶振,都能正常通信,关键在于晶振的频率。大神们都说用外部晶振比较稳定,这个因为测试中没发现区别太大,所以不作评论。
2. 单片机波特率的计算。这个是关键中的重点。建议使用大神们写的51串口通信计算器这个软件进行计算,比较精确。波特率的大小设置,直接影响了错误码的多少。这个问题没得到足够重视,往往是通信失败的直接原因。
3.串口初始化的设置还比较靠谱,网上资料都可以用。诸如:
TMOD =0x20;//T1工作为方式2
SCON =0x50;//方式1:10位异步同通讯,串口允许接收
PCON =0x80;//波特率倍增,SMOD='1'
TH1=TL1=0xe6; // 波特率2400
TR1=1;// 启动定时器1
ES=1;
EA=1;//总中断允许
以上设置可以通用,直接复制,粘贴即可使用。TH,TL值用51串口计算器计算取得,尽可能用最小误差的数值。
4.发送数据标准程序
void send_char(unsigned char txd)
// 传送一个字符
{
SBUF = txd;
while(!TI);
TI=0;
}
5.接收数据的标准程序
void re_char(unsigned char txd)
//接收一个字符
{
while(1)
{
if(RI) // 是否有数据到来
{
tmp = SBUF; // 暂存接收到的数据
P0=tmp; //点亮P0一组灯。
RI = 0; //RI清零
}
}
}
6.补充要点;刷机软件版本选择。STC12C4052AD单片机用STC-ISP V488版本可以快速刷机;STC12C5A602S只能用STC-ISP 480版本刷机。原因也许只能向宏晶科技官方咨询了。