[资源共享] HC89S105AC8 的串口配置

[复制链接]
781|2
 楼主| 星辰大海不退缩 发表于 2023-8-22 10:40 | 显示全部楼层 |阅读模式
  1. * ************************************************************************************
  2. **/
  3. #define ALLOCATE_EXTERN
  4. #include "HC89S105AC8.h"

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

  33.         //波特率1200
  34.         //反推初值
  35.         //初值 = (65536 - (Fper / 波特率) * (1 / 16))
  36.         //           = (65536 - (16000000 / 1200) * (1 / 16))
  37.         //           = (65536 - 833.33)
  38.         //     = FCBE
  39.        

  40.     SBRTH = 0xFCBE/256;      
  41.         SBRTL = 0xFCBE%256;
  42.         SCON2 = 0x12;                                //8位UART 独立波特率,波特率可变
  43.         SCON  = 0x10;                                 //开串口接收

  44.         IE = 0x10;                                         //使能串口中断
  45.         EA = 1;                                                //使能总中断
  46.         while(1)
  47.         {
  48.                 if(guc_Uartflag)
  49.                 {
  50.                         IE &=~ 0x10;                                  //失能UART1中断
  51.                         for(guc_i= 0;guc_i<guc_Uartcnt;guc_i++)
  52.                         {
  53.                                 SBUF = guc_Uartbuf_a[guc_i];                          //发送数据
  54.                                 while(!(SCON&0x02));
  55.                                 SCON &=~ 0x02;                        //发送中断请求中断标志位清0
  56.                         }
  57.                         guc_Uartflag = 0;                        //标志位置0       
  58.                         guc_Uartcnt = 0;
  59.                         SCON |= 0x10;                                 //使能串口中断
  60.                         IE |= 0x10;                                      //UART1中断使能
  61.                 }
  62.         }
  63. }

  64. /***************************************************************************************
  65.   * @说明          UART1中断服务函数
  66.   *        @参数          无
  67.   * @返回值 无
  68.   * @注                  无
  69. ***************************************************************************************/
  70. void UART1_Rpt() interrupt UART1_VECTOR
  71. {
  72.         if(SCON&0x01)
  73.         {
  74.                 guc_Uartbuf_a[guc_Uartcnt++] = SBUF;//转存8位串口接收数据
  75.                 if(guc_Uartcnt >= 5)
  76.                 {
  77.                         SCON &=~ 0x10;                                         //失能串口接收
  78.                         guc_Uartflag = 1;
  79.                 }
  80.                 SCON &=~ 0x01;                                     //收到数据后,清除接收标志
  81.         }
  82. }



liliang9554 发表于 2023-8-22 22:17 | 显示全部楼层
这个有什么用?
单片小菜 发表于 2023-8-23 09:46 | 显示全部楼层
代码写的很漂亮,不错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

309

主题

2870

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部