📄 uart.c
字号:
#ifndef __UART_C__
#define __UART_C__
#endif
#include "head.h"
#include <reg52.h>
#include <string.h>
#include "uart.h"
extern uint8 eaCount;
//-----------------------------------
// 串行口通讯子程序
// 串行口初始化
// 晶振22.0592M, SMOD=1, 使用6T, 波特率115200
//波特率=晶振频率/(256-定时器计数)/(一条指令的机器周期)
//-----------------------------------
void ComInit(void)
{
TMOD = 0x21; //T1为方式2, t0模式1
TH0=0x00; //定时器0用于定时
TL0=0x00;
TH1 = 0xFe; //
TL1 = 0xFe;
PCON = PCON | 0x80; //SMOD=1
SCON = 0x50; //串行口工作在方式3
TR0 = 1;
TR1 = 1;
ET0=1;
EA = 1;
}
// 发送数据
void SendChar(unsigned char buff)
{
SBUF = buff;
while( !TI );
TI=0;
}
//发送数组
void uartPut(uint8 dat[], uint8 len)
{
uint8 i;
ENTER_CRITICAL();
for(i=0; i<len; i++)
{
SendChar(dat[i]);
}
EXIT_CRITICAL();
}
//--------------------------------
//发送字符串
//--------------------------------
void uartPutStr(uint8 *str)
{
uint8 len;
len = strlen(str);
uartPut(str, len);
}
//------------------------------------------
//把bsd码数据转换成ascii码的
//如:123转换为 49(1) 50(2) 51(3)
//dat[]是2个字节的数组,存放16进制返回数据
//原始数据放到dat[0]
//-------------------------------------------
void bcdToAscii(uint8 dat[])
{
uint8 idata temp;
temp = dat[0];
dat[0] = (temp>>4);
if(0<=dat[0] && dat[0]<10) //数字0-9
{
dat[0] += 48; //转换到数字对应的ascii码0(48)1(49)
}
else //数字10(a)-15(f)
{
dat[0] += 55; //转换到数字对应的ascii码10(a)(65)
}
dat[1] = (temp&0x0f);
if(0<=dat[1] && dat[1]<10) //数字0-9
{
dat[1] += 48; //转换到数字对应的ascii码0(48)1(49)
}
else //数字10(a)-15(f)
{
dat[1] += 55; //转换到数字对应的ascii码10(a)(65)
}
}
//-----------------------------------------------
//发送数字, 一个数字由两个ASCII码组成, 为16进制
//比如, 0xef发送为e和f两个字符
//----------------------------------------------
void uartPutNum(uint8 *num, len)
{
uint16 idata n;
uint8 idata temp[2];
if(NULL!=num)
{
for(n=0; n<len; n++)
{
*(temp) = *(num+n);
bcdToAscii(temp);
uartPut(temp, 2);
}
}
}
//---------------------------------------------------------
//函数功能:
//打印字符串, 和一个已知长度的数字数组
//参数说明:
//format 字符串, 在有%的地方打印数字
//num 数字数组指针
//len 数字数组长度
//---------------------------------------------------------
void uartPrint(const char *format, uint8 *num, uint8 len)
{
if(NULL!=format)
{
uint16 idata count, i;
i=strlen(format);
for(count=0; count<i; count++)
{
if('%'!=(*(format+count)))
{
uartPut(format+count, 1);
}
else
{
uartPutNum(num, len);
}
}
}
else
{
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -