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

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

[复制链接]
1387|5
 楼主| gaoyang9992006 发表于 2019-3-21 23:31 | 显示全部楼层 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-25 14:28 编辑

测试:利用配套送的USB虚拟串口适配器跟单片机的串口1进行通信互动。
电脑给单片机发送字符1或者2.发送1后,单片机返回一句话。发送2给单片机后返回另外一句话。
实现单片机的串口发送字符串函数。

  1. #define ALLOCATE_EXTERN
  2. #include "HC89S003F4.h"


  3. /***************************************************************************************
  4.   * @实现效果   收到字符1,返回Hello Word,收到字符2返回Hello 21IC。
  5.   * @操作步骤   接上TXD,RXD短路帽,然后通过上位机软件发送5个8位数据
  6.   * @注意事项        波特率9600,8位数据,无校验位               
  7. ***************************************************************************************/
  8. unsigned char xx;


  9. void put_string(char *str)
  10. {
  11.   while(*str!='\0')
  12.      {
  13.               SBUF = *str++;//发送8位串口数据
  14.                                 while(!(SCON & 0x02));
  15.                                 SCON &=~ 0x02;                        //清除发送中断标志位
  16.      }
  17. }

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

  36.         //波特率9600
  37.         //反推初值 = (65536 - ((T4时钟源频率 / 定时器4预分频比) * (1 / 16)) / 波特率)
  38.         //                   = (65536 - (16000000 * (1 / 16) / 9600))
  39.         //                   = (65536 - 104.167)
  40.         //         = FF98
  41.         
  42.   TH4 = 0xFF;
  43.         TL4 = 0x98;                                                        //波特率9600
  44.         SCON2 = 0x02;                                                //8位UART,波特率可变
  45.         SCON = 0x10;                                                //允许串行接收
  46.         IE |= 0X10;                                                        //使能串口中断
  47.         EA = 1;                                                                //使能总中断
  48. put_string("==================================================================\n");
  49. put_string("------------------------===bbs.21ic.com===------------------------\n");
  50. put_string("==================================================================\n");   
  51. put_string("收到字符1,返回Hello Word,收到字符2返回Hello 21IC,请输入一个字符:\n");        
  52.         while(1)
  53.         {

  54.                 {
  55.                         IE &=~ 0x10;                                //失能UART1中断
  56. if(xx=='1')
  57. put_string("Hello word\n");
  58. else if(xx=='2')
  59. put_string("Hello 21IC,good night\n");
  60. xx=0;


  61.                         IE |= 0x10;                                        //UART1中断使能
  62.                         SCON |= 0x10;                                //UART1接收使能
  63.                 }        
  64.         }
  65. }

  66. /***************************************************************************************
  67.   * @说明          UART1中断服务函数
  68.   *        @参数        无
  69.   * @返回值 无
  70.   * @注                无
  71. ***************************************************************************************/
  72. void UART1_Rpt(void) interrupt UART1_VECTOR
  73. {
  74.         if(SCON & 0x01)                                                //判断接收中断标志位
  75.         {
  76.                 xx=SBUF;//转存8位串口接收数据

  77.                         SCON &=~ 0x10;                                //失能UART1接收


  78.                 SCON &=~ 0x01;                                        //清除接收中断标志位
  79.         }                                                                        
  80. }


打赏榜单

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

 楼主| gaoyang9992006 发表于 2019-3-21 23:39 | 显示全部楼层
本帖最后由 gaoyang9992006 于 2019-3-21 23:48 编辑

332485c93b25a99286.png
以上是测试效果,非常给力。这个单片机上手非常容易,至于PWM和IO等,其他人测试过了,我就不重复发帖了。
 楼主| gaoyang9992006 发表于 2019-3-21 23:50 | 显示全部楼层
拿到开发板的时候,通电,开串口什么都没。其实应该搞个这种串口打印的out of BOx在里面。
另外官方的例子里也没有这种纯粹输出字符串的例子,应该搞一个。
zhuotuzi 发表于 2019-3-22 08:51 | 显示全部楼层
我突然有个大胆的想法,用这个方法,设计一套指令。可以设置IO口的功能,比如发送个指令,指定某个端口作为PWM,输出频率和占空比多少的波
zhuotuzi 发表于 2019-3-22 08:51 | 显示全部楼层
也可以通过指令修改该端口 为其他功能,比如ADC,并通过串口发送ADC测量的结果。
zhuotuzi 发表于 2019-3-22 12:23 | 显示全部楼层
也可以通过指令修改该端口 为其他功能,比如ADC,并通过串口发送ADC测量的结果。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2052

主题

16402

帖子

222

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