单片机串行通信实验写出程序

AT89C51单片机控制系统,晶振频率为12MHz,要求串行口发送数据位为8位,波特率为9600bit/s,工作在方式1,偏写它的初始化程序。

参考下面的初始化程序


/* 串口参数配置函数,这里配置为9600波特率,1位停止位,8位数据位,无校验  */
void uart_init(void)
{
   TMOD = 0x20;  //Timer1以定时模式工作在方式28位常数自动装入定时器/计数器
   SCON = 0x40;  //SM0=0,SM1=1=1,方式110位UART "0 D0~D7 1",波特率可变
   REN  = 1;     //允许串口接收数据位         
   TH1  = 0xFD;  //9600波特率:晶振的频率/(12*(256-初值))=波特率*32
   TL1  = 0xFD;  //方式2的TH1,TL1是相等的,TL1自动重装TH1初值
   PCON = 0x00;  //SMOD=0波特率不加倍
   IE   = 0x90;  //允许总中断,允许串口中断,禁止其他中断
   PS   = 0;     //设置串行口中断优先级
   TR1  = 1;     //当GATE=0,TR1置“1” 启动定时器1
}

下面发送可以用来发个数据给电脑测试

/* send_char函数, ch为待发送的字符 /
void send_char(uint8_t ch)
{
SBUF = ch; //SBUF是指串行口同地址的两个缓冲寄存器,一个是发送寄存器,一个是接收寄存器,
while (!TI); //等待一个字符(一帧)发送完毕
TI = 0; //TI软件清零,等待下一次发送后的置位
}
/
send_string函数, *str为待发送的字符串首元素地址 */
void send_string(uint8_t *str)
{
while (*str != '\0') //字符串里的数据发送不到结尾
{
send_char(*str); //调用字符发送函数
str++; // 指针指向下一个待发字符
}
}