打印
[资源共享]

HC89S105AC8 的串口配置

[复制链接]
349|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
* ************************************************************************************
**/
#define ALLOCATE_EXTERN
#include "HC89S105AC8.h"

unsigned char guc_Uartflag = 0;                //UART判断标志位       
unsigned char guc_Uartcnt = 0;                    //UART计数使用
unsigned char guc_Uartbuf_a[5] = {0};        //用于存放接和收收据
unsigned char guc_i;                                    //发送数据计数       
/***************************************************************************************
  * @实现效果        UART1接收到上位机发送的数据后,把接收的数据再次发送给上位机
  * @注意                波特率1200,8位数据,无校验位               
***************************************************************************************/
void main(void)
{
/********************************系统初始化*******************************************/               
        WDTCCR = 0x00;                           //关闭看门狗
                                                           //本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
        CLKCON = 0x02;                           //选择内部高频RC为系统时钟,Fosc=32MHz
        CLKDIV = 0x02;                           //Fosc 2分频得到Fper,Fper=16MHz       
/**********************************IO配置初始化**************************************/       
    P0M0 = P0M0&0xF0|0x02;                //P00设置为上拉输入
    P0M0 = P0M0&0x0F|0x80;                //P01设置为推挽输出
       
/**********************************UART配置初始化**************************************/       
    TXD_MAP = 0x01;                                                //TXD映射P01
                RXD_MAP = 0x00;                                                //RXD映射P00
       
        //8位数据发送,波特率1200
        //波特率计算
        //波特率 = 1/16 * 时钟源频率 / (65536 - 0xFCBE)
        //       = 1/16 * 16000000 / 834)
        //        = 1199.04(误差0.05%)

        //波特率1200
        //反推初值
        //初值 = (65536 - (Fper / 波特率) * (1 / 16))
        //           = (65536 - (16000000 / 1200) * (1 / 16))
        //           = (65536 - 833.33)
        //     = FCBE
       

    SBRTH = 0xFCBE/256;      
        SBRTL = 0xFCBE%256;
        SCON2 = 0x12;                                //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];                          //发送数据
                                while(!(SCON&0x02));
                                SCON &=~ 0x02;                        //发送中断请求中断标志位清0
                        }
                        guc_Uartflag = 0;                        //标志位置0       
                        guc_Uartcnt = 0;
                        SCON |= 0x10;                                 //使能串口中断
                        IE |= 0x10;                                      //UART1中断使能
                }
        }
}

/***************************************************************************************
  * @说明          UART1中断服务函数
  *        @参数          无
  * @返回值 无
  * @注                  无
***************************************************************************************/
void UART1_Rpt() interrupt UART1_VECTOR
{
        if(SCON&0x01)
        {
                guc_Uartbuf_a[guc_Uartcnt++] = SBUF;//转存8位串口接收数据
                if(guc_Uartcnt >= 5)
                {
                        SCON &=~ 0x10;                                         //失能串口接收
                        guc_Uartflag = 1;
                }
                SCON &=~ 0x01;                                     //收到数据后,清除接收标志
        }
}



使用特权

评论回复
沙发
liliang9554| | 2023-8-22 22:17 | 只看该作者
这个有什么用?

使用特权

评论回复
板凳
单片小菜| | 2023-8-23 09:46 | 只看该作者
代码写的很漂亮,不错。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

200

主题

1391

帖子

2

粉丝