这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 芯圣HC18M003单片机的UART的测试程序

共2条 1/1 1 跳转至

芯圣HC18M003单片机的UART的测试程序

专家
2023-10-24 15:02:06     打赏

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




关键词: 菜鸟学单片机     芯圣     HC18M003     串口测试程序    

院士
2023-11-12 21:40:34     打赏
2楼

谢谢分享。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]