标题: 单片机串口二波特率250000接收,转串口-9600到电脑串口助手 [打印本页]

作者: 人人学会单片机    时间: 2022-5-7 11:28
标题: 单片机串口二波特率250000接收,转串口-9600到电脑串口助手
串口二波特率250000接收,转串口一9600到电脑串口助,使用STC8H1K08单片机,IRC时钟30MHz。由于存储空间有限,串口缓存是20字节。15.6ms 以内的数据判断为一包,超过15.6毫秒的数据,判断为下一包数据,下次再打印到串口助手。


单片机源程序如下:
  1. #include "all.h"

  2. u8 xdata Uart_2R_1T_Buffer[Down_MAX];//串口缓存数组,串口2接收,串口1发送

  3. void Timer0_Init()
  4. {
  5.         AUXR &= 0x7F;                                                //定时器时钟12T模式
  6.         TMOD &= 0xF0;                                                //设置定时器模式
  7.         TMOD |= 0x02;                                                //设置定时器模式
  8.         TL0 = 0x83;                                                        //设置定时初始值
  9.         TH0 = 0x83;                                                        //设置定时重载值
  10.         TF0 = 0;                                                        //清除TF0标志
  11.         TR0 = 1;                                                        //定时器0开始计时
  12.         ET0=1;
  13.         EA=1;                                                                //中断总开关必须闭合导通
  14. }

  15. //*********************************《人人学会单片机》视频教程,祁绪电子2021-10
  16. //时间管理函数,用于数据包区分头尾,可以用定时器中断代替本函数。
  17. //*********************************《人人学会单片机》视频教程,祁绪电子2021-10
  18. void Timer0_Rountine(void) interrupt 1
  19. {
  20.         static u8 idata count1;
  21.         count1++;
  22.         if(count1>20)                                                //调整count值,使Uart_Timer每大约每1ms增加1。
  23.         {        
  24.                 count1=0;               
  25.                 Uart_Timer++;                                        //需要确保大约每1ms增加1
  26.                 if(Uart_Timer==15)                                //用于识别帧间隔,50ms定时
  27.                 {
  28.                         Uart1_Flag=1;                                //标志位允许发送下一次发送
  29.                         Uart1_Up_Data_Drive();                //调用串口发送函数(但不是每次都发送数据)
  30.                 }
  31.                 if(Uart_Timer==50)                                //用于识别帧间隔,50ms定时
  32.                 {
  33.                         Down_Count=0;                                //一帧数据包字节的位置归0,表示首字节
  34.                 }
  35.                 if(Uart_Timer>50)                                //用于识别帧间隔,50ms定时
  36.                 {
  37.                         Uart_Timer=51;                                //超时等待,防止大于255归0
  38.                 }
  39.         }
  40.         Uart1_Up_Data_Drive();                                //调用串口发送函数(但不是每次都发送数据)
  41. }

  42. void main()
  43. {
  44.         P1M0=0;P1M1=0;
  45.         Timer0_Init();
  46.         Uart1_Init();
  47.         Uart2_Init();
  48.         while(1)
  49.         {
  50.                
  51.         }
  52. }
复制代码
  1. #include "all.h"                                                                                         //从工程目录下》c_and_h文件夹查找all文件
  2. bit Uart1_Flag=1;

  3. void Uart1_Init()
  4. {
  5.         SCON = 0x50;                //8位数据,可变波特率
  6.         AUXR &= 0xBF;                //定时器时钟12T模式
  7.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  8.         TMOD &= 0x0F;                //设置定时器模式
  9.         TL1 = 0xBF;                //设置定时初始值
  10.         TH1 = 0xFF;                //设置定时初始值
  11.         ET1 = 0;                //禁止定时器%d中断
  12.         TR1 = 1;                //定时器1开始计时
  13.         
  14.         ES=1;                                                                                                        //允许 串口1 向CPU申请中断
  15.                                                                                                                         //总中断控制开关闭合EA=1;
  16. }//*/


  17. void Uart1_Up_Data_Drive()
  18. {
  19.         static u8 xdata count=0;
  20.         if(Uart1_Flag)                                                //标志允许,发送一个字节
  21.         {
  22.                 Uart1_Flag=0;                                        //标志位翻转,只允许发送一个字节,避免拥挤
  23.                 if(count<=Down_Count)
  24.                 {
  25.                         SBUF=Uart_2R_1T_Buffer[count];//每次只发送一个字节
  26.                         count++;                                        //字节编号增加。
  27.                 }
  28.                 else
  29.                 {
  30.                         Uart1_Flag=0;                                //大于最多发送数量,不发送了
  31.                         count=0;                                        //串口TI不会置1,所以不再发送
  32.                 }
  33.         }
  34. }


  35. void Uart1_Routine() interrupt 4
  36. {
  37.         if(RI)                                                                                                        //如果是接收中断
  38.         {
  39.                 RI=0;                                                                                                //清0标志
  40.         }
  41.         if(TI)                                                                                                        //否则应该是发送后的中断
  42.         {
  43.                 TI=0;                                                                                                //清发送中断标志
  44.                 Uart1_Flag=1;                                                                                //标志位允许发送下一次发送
  45.                 Uart1_Up_Data_Drive();                                                                //马上发送下一位数据
  46.         }
  47. }//*/
复制代码
Keil5代码下载:
STC8H单片机串口2转串口1.zip (44.81 KB, 下载次数: 15)

作者: xjx51    时间: 2022-7-29 21:55
您好,请问可以做一个STC单片机sram扩展的教程吗?STC单片机内部的sram太少了





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1