[DemoCode下载] 【赛元95F】+我也测试串口

[复制链接]
1082|1
 楼主| gaoyang9992006 发表于 2020-4-7 20:46 | 显示全部楼层 |阅读模式
这里借用我之前的测试代码,用定时器0做延时0.5秒,用定时器1作为串口0时钟脉搏。
串口为P2.0和P2.1,分别为RX0与TX0
使用好串口就可以 通过串口与WIFI模块,或者Lora模块,或者4G模块进行通信,实现数据的远距离传输,因此串口的使用是非常重要的。
由于我们习惯用printf函数,作为串口的发送函数,因此要完善
  1. char putchar(char c)
  2. {
  3.         while(!TI);
  4.         TI=0;
  5.         return(SBUF = c);
  6. }
完整代码如下所示
  1. #include<SC95F861X.H>
  2. #include<stdio.h>

  3. void delay(void);
  4. void Timer0_Init(void);

  5. void Uart_Init(unsigned int Freq,unsigned long int baud);





  6. bit UartSendFlag = 0; //发送中断标志位
  7. bit UartReceiveFlag = 0; //接收中断标志位
  8. char putchar(char c)
  9. {
  10.         while(!TI);
  11.         TI=0;
  12.         return(SBUF = c);
  13. }

  14. void main(void)
  15. {
  16.   Timer0_Init();
  17.         Uart_Init(32,9600);
  18.         while(1)
  19.         {
  20.         //        SBUF = 0x55;
  21.         //        while(!UartSendFlag);
  22.         //        UartSendFlag=0;
  23.                
  24.                 /*因为调用的putchar()会先判断是否发送完成,所以这里先置位TI,确保能进入发送环节*/
  25.                 TI=1;
  26.                 printf("Hello World !\n");
  27.                 delay();
  28.         }

  29. }



  30. /*****************************************************
  31. *函数名称:void Uart_Init(uint Freq,unsigned long int baud)
  32. *函数功能:Uart中断初始化
  33. *入口参数:Freq-主频,baud-波特率
  34. *出口参数:void
  35. *****************************************************/
  36. void Uart_Init(unsigned int Freq,unsigned long int baud)    //选择Timer1作为波特率信号发生器
  37. {
  38.         P2CON &= 0xFC;   //TX/RX设置为输入带上拉
  39.         P2PH  |= 0x03;
  40.        
  41.         SCON  |= 0X50;   //设置通信方式为模式一,允许接收
  42.         TMCON |= 0X02;                //定时器TI频率源自fsys即32Mhz
  43.         TH1 = (Freq*1000000/baud)>>8;          //波特率为T1的溢出时间;
  44.         TL1 = Freq*1000000/baud;
  45.         TR1 = 0;
  46.         ET1 = 0;
  47.         EUART = 1;     //开启Uart中断
  48.         EA = 1;
  49. }

  50. void delay(void)
  51. {
  52. //设置为320,延时0.5S,设置到80即延时0.125S,8个IO口跑马灯则每个IO的闪烁频率刚好是1Hz
  53.         int i=320;
  54.         TR0=1;
  55.         while(i--)
  56.         {
  57.                 TL0 = (65536 - 50000)%256;    //时钟为Fsys,则溢出时间=50000*(1/Fsys);
  58.                 TH0 = (65536 - 50000)/256;
  59.                 while(TF0==0);
  60.                 TF0=0;
  61.         }
  62.         TR0=0;
  63. }

  64. void Timer0_Init(void)
  65. {
  66. /*
  67.         TCON,定时器控制寄存器,    |TF1|TR1|TF0|TR0|---|IE1|-|IE0|-|
  68.        
  69.         TMOD,定时器工作模式寄存器,|- |C/T1|M11|M01|---|C/T0|M10|M00|
  70.         模式0:13位定时器计数器模式
  71.         模式1:16位定时器计数器模式
  72.         模式2:8位自动重载模式
  73.         模式3:两个8位定时器计数器模式
  74. */
  75. //设置定时器0工作模式1       
  76.         TMOD        |=        0x01;
  77. //设置定时器0时钟源不分频,32MHz;默认是12分频       
  78.         TMCON        |=        0x01;
  79. }
569695e8c7623c1f7a.png
 楼主| gaoyang9992006 发表于 2020-4-7 21:27 | 显示全部楼层
然后仿照putchar实现getchar功能。这个也是非常有用的,可以用于给单片机下达指令使用。
  1. #include<SC95F861X.H>
  2. #include<stdio.h>

  3. void delay(void);
  4. void Timer0_Init(void);

  5. void Uart_Init(unsigned int Freq,unsigned long int baud);





  6. bit UartSendFlag = 0; //发送中断标志位
  7. bit UartReceiveFlag = 0; //接收中断标志位

  8. char putchar(char c)
  9. {
  10.         while(!TI);
  11.         TI=0;
  12.         return(SBUF = c);
  13. }

  14. char getchar(void)
  15. {
  16.         while(!RI);
  17.         RI=0;
  18.         return(SBUF);
  19. }

  20. void main(void)
  21. {
  22. int aa=0;
  23.   Timer0_Init();
  24.         Uart_Init(32,9600);
  25.         while(1)
  26.         {
  27.         //        SBUF = 0x55;
  28.         //        while(!UartSendFlag);
  29.         //        UartSendFlag=0;
  30.                
  31.                 /*因为调用的putchar()会先判断是否发送完成,所以这里先置位TI,确保能进入发送环节*/
  32.                 TI=1;

  33.                 printf("Hello World !\n");
  34.                 aa=getchar();
  35.                 printf("AA=%d \n",aa);               
  36.                 delay();
  37.         }

  38. }



  39. /*****************************************************
  40. *函数名称:void Uart_Init(uint Freq,unsigned long int baud)
  41. *函数功能:Uart中断初始化
  42. *入口参数:Freq-主频,baud-波特率
  43. *出口参数:void
  44. *****************************************************/
  45. void Uart_Init(unsigned int Freq,unsigned long int baud)    //选择Timer1作为波特率信号发生器
  46. {
  47.         P2CON &= 0xFC;   //TX/RX设置为输入带上拉
  48.         P2PH  |= 0x03;
  49.        
  50.         SCON  |= 0X50;   //设置通信方式为模式一,允许接收
  51.         TMCON |= 0X02;                //定时器TI频率源自fsys即32Mhz
  52.         TH1 = (Freq*1000000/baud)>>8;          //波特率为T1的溢出时间;
  53.         TL1 = Freq*1000000/baud;
  54.         TR1 = 0;
  55.         ET1 = 0;
  56.         EUART = 1;     //开启Uart中断
  57.         EA = 1;
  58. }

  59. void delay(void)
  60. {
  61. //设置为320,延时0.5S,设置到80即延时0.125S,8个IO口跑马灯则每个IO的闪烁频率刚好是1Hz
  62.         int i=320;
  63.         TR0=1;
  64.         while(i--)
  65.         {
  66.                 TL0 = (65536 - 50000)%256;    //时钟为Fsys,则溢出时间=50000*(1/Fsys);
  67.                 TH0 = (65536 - 50000)/256;
  68.                 while(TF0==0);
  69.                 TF0=0;
  70.         }
  71.         TR0=0;
  72. }

  73. void Timer0_Init(void)
  74. {
  75. /*
  76.         TCON,定时器控制寄存器,    |TF1|TR1|TF0|TR0|---|IE1|-|IE0|-|
  77.        
  78.         TMOD,定时器工作模式寄存器,|- |C/T1|M11|M01|---|C/T0|M10|M00|
  79.         模式0:13位定时器计数器模式
  80.         模式1:16位定时器计数器模式
  81.         模式2:8位自动重载模式
  82.         模式3:两个8位定时器计数器模式
  83. */
  84. //设置定时器0工作模式1       
  85.         TMOD        |=        0x01;
  86. //设置定时器0时钟源不分频,32MHz;默认是12分频       
  87.         TMCON        |=        0x01;
  88. }
584035e8c7fd1385bc.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

2052

主题

16403

帖子

222

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