// 所以只能使用11.0592M的晶振
main.c
#include <reg52.h>}
uart.c
#include <reg52.H>
#include <stdio.h>
#include <string.h>
#include "uart.h"
/****************************************************************************
* 函 数:void uartinit(void)
* 功 能:串口中断初始化
* 参 数:无
* 返回值:无
* 更 新:无
* 备 注:无
****************************************************************************/
void uartinit(void) //定时器工作方式2
{
PCON|= 0x80;
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20;
//TH1 = 0xFD;
//baud*2 /* reload value 19200、数据位8、停止位1。效验位无 (11.0592)
TH1 = 0xFA;
//baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (110.592M)
TL1 = 0xFA;
TR1 = 1;
RI = 0;
TI = 0;
ES = 1; //开串口中断
EA = 1; // 开总中断
}
/****************************************************************************
* 函 数:void USART_Send_Byte(unsigned char Data)
* 功 能:串口发送一个字符串
* 参 数:Data--发送的字节
* 返回值:无
* 更 新:无
* 备 注:无
****************************************************************************/
void USART_Send_Byte(unsigned char Data)
{
SBUF=Data;
while (!TI);
TI=0;
}
/****************************************************************************
* 函 数:void USART_Send_Enter(void)
* 功 能:串口发送字符串
* 串口发送0d 0a ,即回车换行
* 注:此函数就是发送0d 0a这两个字节,在“超级终端”上会有回车换行的效果
* 参 数:Data--发送的字节
* 返回值:无
* 更 新:无
* 备 注:无
****************************************************************************/
void USART_Send_Enter(void)
{
USART_Send_Byte(0x0d);
USART_Send_Byte(0x0a);
}
/****************************************************************************
* 函 数:void USART_Send_Str(char *Data)
* 功 能:串口发送字符串
* 参 数:Data--发送的字符串指针
* s:指向字符串的指针
* 注:如果在字符串中有‘\n‘,则会发送一个回车换行
* 返回值:无
* 更 新:无
* 备 注:无
****************************************************************************/
void USART_Send_Str(char *Data)
{
unsigned char i;
unsigned char len = strlen(Data)-1;
for (i=0; i<len; i++)
{
USART_Send_Byte(Data[i]);
}
if(Data[i]==‘\n‘)
{
USART_Send_Enter();
}
else
{
USART_Send_Byte(Data[i]);
}
}
/****************************************************************************
* 函 数:void numtostr(unsigned int dat,char *str)
* 功 能:将一个32位的变量dat转为字符串,比如把1234转为"1234"
* 参 数:dat:带转的long型的变量
* str:指向字符数组的指针,转换后的字节串放在其中
* 返回值:无
* 更 新:无
* 备 注:无
****************************************************************************/
void numtostr(unsigned int dat,char *str)
{
char temp[20];
unsigned int i=0,j=0;
i=0;
while(dat)
{
temp[i]=dat%10+0x30;
i++;
dat/=10;
}
j=i;
for(i=0;i<j;i++)
{
str[i]=temp[j-i-1];
}
if(!i) {str[i++]=‘0‘;}
str[i]=0;
}
/****************************************************************************
* 函 数:void USART_Put_Num(unsigned int dat)
* 功 能:串口发送数值
* 函数中会将数值转为相应的字符串,发送出去。比如 4567 转为 "4567"
* 参 数:无
* 返回值:无
* 更 新:无
* 备 注:无
****************************************************************************/
void USART_Put_Num(unsigned int dat)
{
char temp[20];
numtostr(dat,temp);
USART_Send_Str(temp);
}
/****************************************************************************
* 函 数: void delay(unsigned int i)
* 功 能: 延时子程序
* 参 数:无
* 返回值:无
* 更 新:无
* 备 注:无
****************************************************************************/
void uart_delay(unsigned int i)
{
unsigned char j;
for(i; i > 0; i--)
for(j = 500; j > 0; j--) ;
}
uart.h
#ifndef __UART_H__
#define __UART_H__
void uartinit(void);
void USART_Send_Byte(unsigned char Data);
void USART_Send_Enter(void);
void USART_Send_Str(char *Data);
void numtostr(unsigned int dat,char *str);
void USART_Put_Num(unsigned int dat);
void uart_delay(unsigned int i);
#endif
P3.1接口RXD
只需一个就串口接收可以发送问蹦转成语音
原文地址:http://blog.csdn.net/u011046042/article/details/38019289