前面讲解了芯圣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通讯用接口。