首页 > 其他 > 详细

【HC89S003F4开发板】 3串口调试

时间:2019-08-17 11:14:02      阅读:156      评论:0      收藏:0      [点我收藏+]

HC89S003F4开发板串口调试

使用资料自带的demo

主程序

/************************************系统初始化****************************************/
    WDTCCR = 0x00; //关闭看门狗
                   //本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
    CLKSWR = 0x51;  //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
    CLKDIV = 0x01;  //Fosc 1分频得到Fcpu,Fcpu=16MHz 
/**********************************UART配置初始化**************************************/
    P2M0 = P2M0&0x0F|0x80;  //P21设置为推挽输出
    P0M1 = P0M1&0x0F|0x20;  //P03设置为上拉输入
    TXD_MAP = 0x21; //TXD映射P21
    RXD_MAP = 0x03; //RXD映射P03      
    T4CON = 0x06;   //T4工作模式:UART1波特率发生器
    //波特率计算
    //波特率 = 1/16 * (T4时钟源频率 / 定时器4预分频比) / (65536 - 0xFF98)
    //       = 1/16 * ((16000000 / 1) / 104)
    //       = 9615.38(误差0.16%)

    //波特率9600
    //反推初值 = (65536 - ((T4时钟源频率 / 定时器4预分频比) * (1 / 16)) / 波特率)
    //         = (65536 - (16000000 * (1 / 16) / 9600))
    //         = (65536 - 104.167)
    //         = FF98
    
    TH4 = 0xFF;
    TL4 = 0x98;                                      //波特率9600
    SCON2 = 0x02;                                    //8位UART,波特率可变
    SCON = 0x10;                                   //允许串行接收
    IE |= 0X10;                                      //使能串口中断
    EA = 1;                                          //使能总中断
    
    while(1)
    {
        if(guc_Uartflag)
        {
            IE &=~ 0x10;                            //失能UART1中断
            for(guc_i= 0;guc_i<guc_Uartcnt;guc_i++)
            {
                SBUF = guc_Uartbuf_a[guc_i];  //发送8位串口数据
                while(!(SCON & 0x02));
                SCON &=~ 0x02;                    //清除发送中断标志位
            }
            IE |= 0x10;                             //UART1中断使能
            guc_Uartflag = 0;
            guc_Uartcnt = 0;
            SCON |= 0x10;                           //UART1接收使能
        }   
    }

中断接收程序

void UART1_Rpt(void) interrupt UART1_VECTOR
{
    if(SCON & 0x01) //判断接收中断标志位
    {
        guc_Uartbuf_a[guc_Uartcnt++] = SBUF;//转存8位串口接收数据
        if(guc_Uartcnt >= 5)
        {
            SCON &=~ 0x10;  //失能UART1接收
            guc_Uartflag = 1;
        }
          SCON &=~ 0x01; //清除接收中断标志位
    }                                   
}

实际效果

技术分享图片
技术分享图片

连续打印

封装成函数

void PrintString(char* buf)
{
    int sub = 0;
    while(buf[sub] != 0)
    {               
        SBUF = buf[sub];  //·¢?í8??′??úêy?Y
        while(!(SCON & 0x02));
        SCON &=~ 0x02;                    //??3y·¢?í?D??±ê????
        sub++;
    }
}

主程序while里改成

    char sendbuf[] = "串口发送\n";
    PrintString(sendbuf);

实际输出

技术分享图片

【HC89S003F4开发板】 3串口调试

原文:https://www.cnblogs.com/yywBlogW/p/11367456.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!