返回列表 发新帖我要提问本帖赏金: 50.00元(功能说明)

[通用8051核FLASH系列] 【HC89S003P套件试用】串口测试

[复制链接]
1289|2
 楼主| 小明的同学 发表于 2019-3-21 23:04 | 显示全部楼层 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-25 14:29 编辑

拿到开发板了,由于外地出差中,测IO等需要LED什么的,不好找到。于是想到测串口。
看了一下,大家都没有发测串口的呢。
于是找到了官方的开发包。
下载地址
http://www.holychip.cn/uploadfiles/release/democode/HC89S003F4%20Register%20Example%20V1.0.3.0.rar
里面有个例子
UART-UART1收发字节
于是想在这个例子基础上稍微改一下。
这个例子是从计算机接收5个字符后,作为一组一次性发送给计算机。
于是我觉得发什么,收什么不太可观。我给返回给计算机的添加一个字符“A”
  1. /**
  2. *   ************************************************************************************
  3. *                                                                上海芯圣电子股份有限公司
  4. *                                                                    www.holychip.cn
  5. *        ************************************************************************************
  6. *        @Examle Version                V1.0.3.0
  7. *        [url=home.php?mod=space&uid=1102]@demo[/url]         Version                V1.0.3.0
  8. *        [url=home.php?mod=space&uid=212281]@date[/url]                                2018.6.1
  9. *        ************************************************************************************
  10. *                                                                         模块性能介绍
  11. *   1、UART1有4种工作方式,在四种方式中,任何将SBUF作为目标寄存器的写操作都会启动发送
  12. *           方式0:同步半双工通讯
  13. *           方式 1:8位UART,可变波特率,异步全双工
  14. *           方式 2:9位UART,固定波特率,异步全双工
  15. *           方式 3:9位UART,可变波特率,异步全双工
  16. *        ************************************************************************************
  17. *                                                                         应用注意事项
  18. *        1、使用串口时,需要Fosc和Fcpu时钟一致,如时钟不一致,请勿操作发送冲突标志位(TXCOL),
  19. *           否则会造成串口功能异常
  20. *        ************************************************************************************
  21. *                                                                         客户服务
  22. *        感谢您使用我们的单片机,若发现错误或对函数的使用存在疑问。请添加上海芯圣电子官方QQ群
  23. *        ****************************技术支持群:201030494***********************************
  24. *   ************************************************************************************
  25. **/

  26. #define ALLOCATE_EXTERN
  27. #include "HC89S003F4.h"

  28. unsigned char guc_Uartflag = 0;                        //UART判断标志位
  29. unsigned char guc_Uartcnt = 0;                    //UART计数使用
  30. unsigned char guc_Uartbuf_a[5] = {0};        //用于存放接收收据
  31. unsigned char guc_i;                                        //发送数据计数        

  32. /***************************************************************************************
  33.   * @实现效果        UART1接收到上位机发送的5个8位数据后,把接接收的5个数据再次发送给上位机
  34.   * @操作步骤   接上TXD,RXD短路帽,然后通过上位机软件发送5个8位数据
  35.   * @注意事项        波特率9600,8位数据,无校验位               
  36. ***************************************************************************************/
  37. void main()
  38. {
  39. /************************************系统初始化****************************************/
  40.         WDTCCR = 0x00;                                                //关闭看门狗
  41.                                                 //本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
  42.         CLKSWR = 0x51;                                                //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
  43.         CLKDIV = 0x01;                                                //Fosc 1分频得到Fcpu,Fcpu=16MHz
  44. /**********************************UART配置初始化**************************************/
  45.         P2M0 = P2M0&0x0F|0x80;                                //P21设置为推挽输出
  46.         P0M1 = P0M1&0x0F|0x20;                                //P03设置为上拉输入
  47.         TXD_MAP = 0x21;                                                //TXD映射P21
  48.         RXD_MAP = 0x03;                                                //RXD映射P03               
  49.         T4CON = 0x06;                                                //T4工作模式:UART1波特率发生器
  50.         
  51.         //波特率计算
  52.         //波特率 = 1/16 * (T4时钟源频率 / 定时器4预分频比) / (65536 - 0xFF98)
  53.         //       = 1/16 * ((16000000 / 1) / 104)
  54.         //                 = 9615.38(误差0.16%)

  55.         //波特率9600
  56.         //反推初值 = (65536 - ((T4时钟源频率 / 定时器4预分频比) * (1 / 16)) / 波特率)
  57.         //                   = (65536 - (16000000 * (1 / 16) / 9600))
  58.         //                   = (65536 - 104.167)
  59.         //         = FF98
  60.         
  61.   TH4 = 0xFF;
  62.         TL4 = 0x98;                                                        //波特率9600
  63.         SCON2 = 0x02;                                                //8位UART,波特率可变
  64.         SCON = 0x10;                                                //允许串行接收
  65.         IE |= 0X10;                                                        //使能串口中断
  66.         EA = 1;                                                                //使能总中断
  67.    
  68.         while(1)
  69.         {
  70.                 if(guc_Uartflag)
  71.                 {
  72.                         IE &=~ 0x10;                                //失能UART1中断

  73.                           SBUF = 'A';//发送8位串口数据
  74.                                 while(!(SCON & 0x02));
  75.                                 SCON &=~ 0x02;                        //清除发送中断标志位


  76.                         for(guc_i= 0;guc_i<guc_Uartcnt;guc_i++)
  77.                         {
  78.                                 SBUF = guc_Uartbuf_a[guc_i];//发送8位串口数据
  79.                                 while(!(SCON & 0x02));
  80.                                 SCON &=~ 0x02;                        //清除发送中断标志位
  81.                         }
  82.                         IE |= 0x10;                                        //UART1中断使能
  83.                         guc_Uartflag = 0;
  84.                         guc_Uartcnt = 0;
  85.                         SCON |= 0x10;                                //UART1接收使能
  86.                 }        
  87.         }
  88. }

  89. /***************************************************************************************
  90.   * @说明          UART1中断服务函数
  91.   *        @参数        无
  92.   * @返回值 无
  93.   * @注                无
  94. ***************************************************************************************/
  95. void UART1_Rpt(void) interrupt UART1_VECTOR
  96. {
  97.         if(SCON & 0x01)                                                //判断接收中断标志位
  98.         {
  99.                 guc_Uartbuf_a[guc_Uartcnt++] = SBUF;//转存8位串口接收数据
  100.                 if(guc_Uartcnt >= 5)
  101.                 {
  102.                         SCON &=~ 0x10;                                //失能UART1接收
  103.                         guc_Uartflag = 1;
  104.                 }
  105.                 SCON &=~ 0x01;                                        //清除接收中断标志位
  106.         }                                                                        
  107. }


打赏榜单

芯圣电子官方QQ 打赏了 50.00 元 2019-04-08
理由:001p试用三等奖

 楼主| 小明的同学 发表于 2019-3-21 23:05 | 显示全部楼层
5095c93a7fe444b7.png
烧录进去后。
609905c93a82367bd7.png
接收回来的以A开头了。Answer,,,就是这个意思。后面准备重写这个例子,实现printf,或者发送字符串功能。
gaoyang9992006 发表于 2019-3-21 23:39 | 显示全部楼层
已实现发送字符串。已实现发送字符串。已实现发送字符串。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

159

主题

1640

帖子

2

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