常用程序模块备份(二):STC12C5A60S2,串口Uart
扫描二维码
随时随地手机看文章
uart作为程序调试很有帮助,所以一个好的uart模块个人认为非常重要的
这里的用stc12单片机,因为不用12分频,所以可以进行115200波特率快速传输(注意晶振必须11.0592MHz,12MHz的会乱码,本人亲测),而如果改用其他的51单片机,只需要把UartInit()函数改成自己的初始化设置就行,比如89c52,当然要记得改52头文件。
此uart本人比较欣赏的是可以直接调用UartPrintf()函数,跟c中prinf()用法几乎相同,支持%d%0.2f等省去了字符转换。而对于接收到的字符命令进行处理只需要在UartReceiveHandler函数中修改即可,例子中是对“End”字符命令进行处理,测试程序main.c是博文手写,未经测试,只是提示主框架用法
main.c-------------------------------------------------------------------------------------------------------
#include"uart.h"
void main(void)
{
UartInit();
while(1)
{
UartReceiveHandler();
}
}
uart.h--------------------------------------------------------------------------------------------------------
#ifndef __UART_H__
#define __UART_H__
void UartInit(void);
void UartPrintf(const char *fmt,...);
void UartReceiveHandler(void);
#endif
uart.c--------------------------------------------------------------------------------------------------------
#include"STC12C5A60S2.h"
#include
#include //stdio.h,stdarg.h用于vsprintf函数原型
#include
#define UART0_BUF_LEN 32
int UART1_Recv_count; //接收计数
bit UART1_Overflow_Flag;//缓冲区满标志
bit MarkFlag = 1;
idata unsigned char UART1_Recv_BUF[UART0_BUF_LEN];
//串口接收缓冲区
void UartInit(void) //115200bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
BRT = 0xFD; //设定独立波特率发生器重装值
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10; //启动独立波特率发生器
ES = 1; //充许串口1中断
EA=1; //开总中断
}
void sendbyte(unsigned char c)
{
if(c=='\n') //如果遇到\n就换行
{
//发送CR(carriage return)
SBUF=0x0D;
while(!TI); //等待发送完成
TI=0;
//发送 LF(NL line feed,new line)
SBUF=0x0A;
while(!TI); //等待发送完成
TI=0;
}
else
{
SBUF=c;
while(!TI); //等待发送完成
TI=0;
}
}
void sendstring(unsigned char *string)
//此处*string相当于数组
{
while(*string!='\0')//判断是否到字符串末尾
{
sendbyte(*string);
string++;
}
}
void UartPrintf(const char *fmt,...)
{
va_list ap;
char xdata string[1024]; //访问内部拓展RAM,非访问外部RAM,不能超过内部拓展RAM大小(此处为1024)
va_start(ap,fmt);
vsprintf(string,fmt,ap); //此处也可以使用sprintf函数,用法差不多,稍加修改即可,此处略去
sendstring(string);
va_end(ap);
}
void UART1_Int(void) interrupt 4
{
if (RI == 1)
{
RI = 0;
if(UART1_Overflow_Flag==0)
{
if(UART1_Recv_count
{
UART1_Recv_BUF[UART1_Recv_count++] = SBUF;
if(SBUF=='\r' || SBUF=='\n')
{
UART1_Overflow_Flag=1;
}
}
else
{
UART1_Overflow_Flag=1; // 关闭串口中断,停止接收
}
}
}
}
//void Delay_10ms()
//{
// unsigned int i,j;
// for(i=0; i<5; i++)
// for(j=0; j<2000; j++);
//}
void UartReceiveHandler(void)
{
// unsigned char i;
// unsigned int Led;
unsigned long Count;
if (UART1_Overflow_Flag==1) //串口中断数据接收完毕,开始处理
{
if(0 == strncmp("End",UART1_Recv_BUF,strlen("End")))
{
UartPrintf("Start\n");
Count = ReadCount();
UartPrintf("End:%ld\n",Count);
}
// UartPrintf("\r\n");
UART1_Recv_count = 0; //缓存清零
UART1_Overflow_Flag=0;//允许串口继续接收数据
}
}