/********************************************************************
* 文件名 : UART.c
* 创建人 : zhongbaohua,2012年6月10日
天津工业大学电气工程与自动化学院
* 版本号 : 1.0
51单片机通常由TIMER1来产生波特率,TIMER1的频率是晶振的1/12,也就是1M。
它的频率太低导致它不能实现9600波特率。这也给我们提供了一条新的解决途径:如果我们能提高时钟频率,那么也可能实现9600的波特率。
52及以上的单片机提供了TIMER2,可作为波特率发器。且它作为波特率发生器时,它的频率是晶振的1/2,也就是6M。
***********************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/********************************************************************
* 名称 : Uart0_Init()
* 功能 : 串口初始化,晶振12M,波特率9600,使能了串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Uart0_Init()
{
//9600波特率对应 FFD9H
RCAP2L = 0xD9;
RCAP2H = 0xFF;
//RCLK、TCLK置1
//TR2置1
T2CON = 0x34;
//串口工作模式1,接收使能
SCON = 0x50;
//允许串口中断
ES = 1;
return;
}
/********************************************************************
* 名称 : Com_Init()
* 功能 : 串口初始化,晶振11.0592M,波特率9600,使能了串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xfd; //设置波特率 9600 //fD
TL1 = 0xd3; //FD
TR1 = 1; //启动定时器1
ES = 1; //开串口中断
EA = 1; //开总中断
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
uchar i = 0;
uchar code Buffer[] = "TJPU 电气工程"; //所要发送的数据
uchar *p;
// Com_Init();
Uart0_Init();
P1 = 0xff;
p = Buffer;
while(1)
{
SBUF = *p;
while(!TI) //如果发送完毕,硬件会置位TI
{
_nop_();
}
p++;
if(*p == '\0')
break; //在每个字符串的最后,会有一个'\0'
TI = 0; //TI清零
}
while(1);
}/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
/*void Com_Int(void) interrupt 4
{
uchar LED_Buffer;
EA = 0;
if(RI == 1) //当硬件接收到一个数据时,RI会置位
{
LED_Buffer = SBUF - 48; //这里减去48是因为从电脑中发送过来的数据是ASCII码。
RI = 0;
P0= LED_Buffer;
}
EA = 1;
}
*/
/**************************************
12M中断服务程序
**************************************/
void Uart0_Ist() interrupt 4
{
if(RI)
{
RI = 0;
//Do whatever you want;
}
if(TI)
{
TI = 0;
//Do whatever you want;
}
}