串口通信实验
通过USB连接线连接PC机,在计算机硬件管理器中查看串口号,打开串口调试工具软件如下图,并将串口通讯波特率设定为2400。用 STC-ISP 串口助手可以接收开发板发送的字符串,并向开发板发送字符串。
1、数据发送。通过串口输出实时温度数据。(DS18B20数据线引脚DQ与单片机P2.7引脚连接。)
2、数据接收。输入1-8字符,可控制8个LED指示灯亮灭状态。(将跳线J13配置为MM模式)
#include <STC12C5A60S2.H>
#include "onewire.h"
#include <stdio.h>
#include "intrins.h"
#include "absacc.h"
char rx='1';
unsigned char intr;
void init()
{
P2=0xa0;P0=0x00;P2=0x00;
P2=0x80;P0=0xff;P2=0x00;
}
void Delay600ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 26;
j = 55;
k = 171;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UartInit(void) //2400bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; 定时器1时钟为Fosc,即1T
AUXR &= 0xFE; 串口1选择定时器1为波特率发生器
TMOD &= 0x0F; 设定定时器1为16位自动重装方式
TL1 = 0x80; //
TH1 = 0xFB; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES=1;//开串口中断
EA=1;//开总中断
}
void uart_sendstring(unsigned char *str)//发送字符
{
unsigned char *p;
p = str;
while(*p != '\0')
{
SBUF = *p;
while(TI == 0);
TI = 0;
p++;
}
}
void isr_uart(void) interrupt 4//中断服务接收字符
{
if(RI)
{
RI=0;//清除接收标志位
rx=SBUF;
ES = 0;
RI=1;
}
}
void get_mess(char c)
{
switch(c)
{
case '1':
XBYTE[0x8000]=0xFE;break;
case '2':
XBYTE[0x8000]=0xFD;break;
case '3':
XBYTE[0x8000]=0xFB;break;
case '4':
XBYTE[0x8000]=0xF7;break;
case '5':
XBYTE[0x8000]=0xEF;break;
case '6':
XBYTE[0x8000]=0xDF;break;
case '7':
XBYTE[0x8000]=0xBF;break;
case '8':
XBYTE[0x8000]=0x7F;break;
default:
uart_sendstring("error\r\n");break;
}
}
void main(void)
{
float temperature;
unsigned char str[40];
init();
UartInit();
while(1)
{
if(RI==1)
{
RI=0;
get_mess(rx);
ES=1;
}
sprintf(str,"%s%6.3f%c%c","temperature:",temperature,'\r','\n');
temperature = rd_temperature_f(); //读取温度
uart_sendstring(str);
Delay600ms();
}
}
串口不是很熟,写不出来,需要记得是串口也用一个定时器当波特率发生器,发送好写,接收可能会有些问题