/****************************************************************
* 文件名 :uart0.c
* 描述 :串口0通信实验C语言程序。当接收到一个数据后,再将接收到
* 的数据送出,该程序的UART波特率是9600字节/s
* 创建人 : 云杰
* QQ : 494713348
* 电话 : 15123350190
* Email : founder_elec@foxmail.com
* 网址 : http://shop66398134.taobao.com
* 时间 : 2010年4月10日
* 版本号 : V0.1.0
* 修改记录:
*
****************************************************************/
#include <c8051f340.h>
#include "uart0.h"
bit receive_bit; //接收标志位
u8 receive_data; //接收到的数据
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main(void)
{
PCA0MD &= ~0x40; //禁止看门狗
SysclkInit(); //初始化是系统时钟到12M
PortInit(); //初始挂交叉开关和I/O口
Uart0Init(); //初始化UART0
EA=1; //开总中断
ES0=1; //开串口0中断
receive_bit = 0;
while(1)
{
while(receive_bit==1) //是否接收到一个数据
{
ES0=0; //关串口0中断
receive_bit=0; //清接收标志位
Delay(60000); //延时
Delay(60000);
Delay(60000);
SBUF0 = receive_data; //将接收到数据送出
while(TI0==0) NOP; //发送标志位是否产生
TI0=0; //清发送标志位
Delay(10000); //延时
Delay(60000);
Delay(60000);
ES0=1; //开中断标志
}
NOP;
}
}
/********************************************************************
* 名称 : SysclkInit()
* 功能 : C8051F340的端口和交叉开关配置
* 输入 : 无
* 输出 : 无
***********************************************************************/
void SysclkInit(void)
{
REG0CN = 0x00; // 稳压器使能
OSCICN |= 0x83; // 不分频,使用内部12M晶振,系统时钟频率为12MHz
OSCICL = 0x00; // 内部晶振工作在最高频率
OSCLCN = 0x00; // 禁止内部L-F振荡器
OSCXCN = 0x00; // 关闭外部振荡器
}
/********************************************************************
* 名称 : PortInit()
* 功能 : C8051F340的端口和交叉开关配置
* 输入 : 无
* 输出 : 无
***********************************************************************/
void PortInit(void)
{
P0MDOUT = 0x10; //设置P0.4(对应TX0)输出为推挽方式
XBR0 = 0x01; //UART TX0, RX0 连到端口引脚 P0.4 和 P0.5。
XBR1 = 0x40; //交叉开关使能并弱上拉
}
/********************************************************************
* 名称 : Uart0Init()
* 功能 : C8051F340的UART0的初始化,参考《C8051F34x中文版.pdf》的P196,
* 表 18.1 对应标准波特率的定时器设置(使用内部振荡器)
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Uart0Init(void)
{
SCON0 = 0x50; // SCON0:模式1,8位UART,使能RX
TMOD = 0x20; // TMOD: 定时器工作再模式2, 8位重载
TH1 = 256-(SYSCLK/BAUDRATE/8); // 设置定时1用作波特率的重载值
TR1 = 1; // 开定时器1
CKCON |= 0x01; // 定时器1用(系统时钟/4)作为它的时基
TI0 = 0; // 清发送标志位
}
/********************************************************************
* 名称 : Uart0Init()
* 功能 : 串口中断0服务子程序
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Uart0Isr (void) interrupt 4
{
if(!TI0) //是发送中断还是接收中断
{
RI0 = 0; //清接收标志位
receive_data =SBUF0;//保存接收到的数据
receive_bit=1; //置接收标志
}
TI0 = 0; //清发送标志位
}
/********************************************************************
* 名称 : Delay()
* 功能 : 延时
* 输入 : i (3个NOP指令时间)
* 输出 : 无
***********************************************************************/
void Delay(u16 i)
{
while (i--)
{
NOP;
NOP;
NOP;
}
}