上一篇文章主要罗列了一些编写串口通信必要的知识点。在具体的编程中,还有很多要注意的地方。
下面的程序的主要功能为:通过串口调试助手向51单片机发送一个字母,单片机接收后,在数码管上显示这个字母,并将这个字母反向显示到串口调试助手的界面里。
51单片机的头文件中已经定义了串口缓冲区等一系列特殊功能寄存器,打开头文件就可以找到下面这样的定义:
sfr SCON = 0x98;
sfr SBUF = 0x99;
等等。
首先新建立一个头文件,将程序中要用到的变量和函数声明写进去:
#include <reg52.h>
#include <ctype.h>
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
//从计算机发送给单片机的字母
uchar letter;
//table数组中存储数码管显示0~F对应的编码
//这里只用A~F即可
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void Inital();
void Display(uchar mydata);
void Putchar(uchar mydata);
void ShortDelay();
包含头文件<ctype.h>的主要目的为利用库函数toupper(),可以讲读入的字母均转换成大写,便于调用Display函数在数码管上显示。
主函数很简单,首先初始化,然后便进入永远为真的循环中,等待中断的发生,并处理。
void main()
{
Inital(); //初始化
while(1)
{
}
}
初始化函数用于开启中断,设置计时器,串口通信的工作方式,变量初始化的工作:
void Inital()
{
//变量清零
letter=0;
wela=0;
dula=0;
//波特率设置为9600
SCON=0x50;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
//开串口中断
EA=1;
ES=1;
}
中断服务函数在中断发生时由CPU调用,在其内部又调用了 Display,Putchar函数用于在数码管显示字母,和在电脑上回显输入的字母。
//中断服务函数
void ser() interrupt 4
{
//如果读完数据
if(RI==1)
{
RI=0; //软件清零
letter=SBUF; //从单片机Receive缓冲区内读入数据
Putchar(letter); //在电脑上回显letter
Display(letter); //在数码管上显示对应的字母
}
}
Display函数用到的只是在前面有关数码管的文章中已有涉及,直接贴出代码:
void Display(uchar mydata)
{
uchar BigLetter;
BigLetter=toupper(mydata); //先将读入字母均转换为大写,以便统一处理
//位选数码管
wela=1;
P0=0xfb;
wela=0;
P0=0xff;
//段选
//BigLetter-'A'+10索引为该字母在table中的下标
dula=1;
P0=table[BigLetter-'A'+10];
dula=0;
ShortDelay();
}
void ShortDelay()
{
uchar a=100;
while(a--);
}
向计算机发送信息的Putchar函数
void Putchar(uchar mydata)
{
SBUF=mydata; //单片机的Transfer缓冲区内写入数据
while(!TI) ; //发送是否结束
TI=0; //发送结束后软件清零
}
如此这样,利用串口调试助手就可以向单片机发送字母,在数码管显示此字母,并能够在软件界面上显示刚刚发送出去的字母内容了。