前面讲解了芯圣HC18M003单片机的UART机能,这里给出一个测试程序。程序中增加了定时器0中断处理,用来实现延时功能;串口设置为n,8,1,9600波特率通讯方式。
#include"holychip_define.h"
void delay_ms(unsigned int ms);
void send_char(unsigned char chr);
void send_str(unsigned char *str);
// 延时
unsigned int gms=0;
void delay_ms(unsigned int ms) {
gms=ms;
while(gms > 0) {
// 等待gms = 0
}
}
unsigned char guc_Uartbuf = 0; //UART判断标志位
unsigned char guc_Uartflag = 0;//用于存放接收收据
unsigned char guc_UartSendIF = 0; //UART发送中断标志位
//unsigned char guc_UartSendChar = 0; //UART发送数据
/***************************************************************************************
* @实现效果UART1接收到上位机发送的1个8位数据后,把接接收的1个数据再次发送给上位机
* @注意波特率9600,8位数据,无校验位
***************************************************************************************/
void main() {
unsigned char ptr = 0;
unsigned char start[]="Start test ... \r\n";
/************************************系统初始化****************************************/
OSCCON = 0x04; //Fosc=32M Fcpu=4M(Fosc4分频 2T)
/************************************IO初始化******************************************/
ANSELB = 0xC0; //PB7 PB6设为数字模式
TRISB = 0x40; //PB7设为输入模式 PB6设为输出模式
/**********************************T0配置初始化****************************************/
OPTION = 0X07;// 分频寄存器配置256分频
T0CS = 0; // T0 模式选择寄存器:定时器模式,计数时钟Fcpu,休眠和绿色模式下停止
T0OSCEN = 0; // 禁止定时器模块0使用计数时钟
T0SE = 0; // 定时器模式,计数时钟Fcpu
//Tim0计算时间 = 1/(时钟源/Timer分频系数)*(256-T0初值)
//定时1ms(实际1.024)
T0 = 0xF0;// T0定时时间1ms
/**********************************UART配置初始化**************************************/
INTMAP = 0x20;
UARTMAP = 0x50; //映射 PB7口作为RX PB6口作为TX
//波特率计算
BRTH = 0xFF;
BRTL = 0xE6; //Baudrate_9600
SCON2 = 0x24; //UART功能选择 8位
SCON |= 0x10; //使能UART接收
PEIE = 1; //使能外设中断
T0IE = 1; //允许定时器0中断
UARTIE = 1; //使能串口中断
GIE = 1; //使能总中断
delay_ms(200);
while(1) {
send_str("Start test ... \r\n");
if(guc_Uartflag) {
UARTIE = 0; //能串口中断
SBUF = guc_Uartbuf;//发送8位串口数据
while(!TXIF);
TXIF = 0;//清除发送中断标志位
guc_Uartflag = 0;
UARTIE = 1;//使能串口中断
SCON |= 0x10;//UART接收使能
}
}
}
/***************************************************************************************
* @说明 UART中断服务函数
*@参数无
* @返回值 无
* @注无
***************************************************************************************/
void interrupt Isr(void) {
// 串口接收中断
if(RXIF) {
guc_Uartbuf = SBUF;//转存8位串口接收数据
guc_Uartflag = 1;
SCON &= ~0x10; //失能UART1接收
RXIF = 0;//清除接收中断标志位
}
// // 串口发送中断
// if(TXIF) {
// guc_UartSendIF=1;
// TXIF = 0;
// }
// 定时器0中断
if(T0IF) {
T0 = 0xF0; //T0定时时间1ms
if (gms>0) {
gms=gms-1;
}
T0IF = 0;//清除T0中断标志位
}
}
// 串口发送一个字符
void send_char(unsigned char chr) {
UARTIE = 0;//能串口中断
SBUF = chr;//发送8位串口数据
while(!TXIF);
TXIF = 0;//清除发送中断标志位
UARTIE = 1;
}
// 串口发送一个字符
void send_str(unsigned char *str) {
unsigned char chr = '\0';
while (chr=*str) {
send_char(chr);
str++;
}
}程序中使用了PB7和PB6作为串口通讯用的RX和TX。把PC0和PC2预留出来作为以后IIC通讯用接口。
我要赚赏金
