STC8A8K单片机串口发送接收程序

[复制链接]
查看12 | 回复0 | 2021-7-20 16:33:16 | 显示全部楼层 |阅读模式
2.jpg
  1. #include <STC8.H>
  2. #define u8 unsigned char
  3. #define u16 unsigned int

  4. void UART_Init(u16 BaudRate) //串口初使化函数  11.0592Mhz 8A8K单片机
  5. {
  6.         u8 TH1_Dat;
  7.         switch(BaudRate)
  8.     {
  9.                 case 2400:  TH1_Dat=0x70; break;
  10.                 case 4800:  TH1_Dat=0xB8; break;
  11.                 case 9600:  TH1_Dat=0xDC; break;
  12.                 case 19200: TH1_Dat=0xEE; break;
  13.                 case 57600: TH1_Dat=0xFA; break;
  14.                 case 115200: TH1_Dat=0xFD; break;
  15.     }
  16.         TMOD &= 0x0F;         //清除定时器1模式位
  17.     TMOD |= 0x20;        //定时器工作模式,0x20-工作方式2:8位自动重装载模式
  18.     SCON = 0x50;          //串行口工作方式控制寄存器,当前为1
  19.                                         //Bit[7:6],00为工作方式0,01方式1,10方式2,11方式3
  20.     PCON |=0x00;         //Bit7-波特率倍增位:0-不培增  1-培增
  21.         AUXR |= 0x40;   //定时器1时钟为Fosc,即1T
  22.         AUXR &= 0xfE;   //串口1选择定时器1为波特率发生器
  23.     TH1 = TH1_Dat;         //8位自动重装载定时器模式下,TH1被用作自动重装载值寄存器
  24.     TL1 = TH1_Dat;  //TL1为计数寄存器
  25.     TR1 = 1;                //定时器1开始计数
  26.         ET1 = 0;        //禁止定时器1中断
  27.     ES = 1;               //串口中断允许位
  28.     EA = 1;               //打开总中断
  29. }

  30. void main()
  31. {
  32.         UART_Init(115200);
  33.         while(1);               
  34. }


  35. void Usart() interrupt 4
  36. {
  37.         u8 receiveData;

  38.         receiveData=SBUF;        //出去接收到的数据
  39.         RI = 0;                                //清除接收中断标志位
  40.         SBUF=receiveData;        //将接收到的数据放入到发送寄存器
  41.         while(!TI);                        //等待发送数据完成
  42.         TI=0;                                //清除发送完成标志位
  43. }
  44. #include <STC8.H>

  45. #define u8 unsigned char
  46. #define u16 unsigned int

  47. void UART_Init(u16 BaudRate) //串口初使化函数  11.0592Mhz 8A8K单片机
  48. {
  49.         u8 TH1_Dat;
  50.         switch(BaudRate)
  51.     {
  52.                 case 2400:  TH1_Dat=0x70; break;
  53.                 case 4800:  TH1_Dat=0xB8; break;
  54.                 case 9600:  TH1_Dat=0xDC; break;
  55.                 case 19200: TH1_Dat=0xEE; break;
  56.                 case 57600: TH1_Dat=0xFA; break;
  57.                 case 115200: TH1_Dat=0xFD; break;
  58.     }
  59.         TMOD &= 0x0F;         //清除定时器1模式位
  60.     TMOD |= 0x20;        //定时器工作模式,0x20-工作方式2:8位自动重装载模式
  61.     SCON = 0x50;          //串行口工作方式控制寄存器,当前为1
  62.                                         //Bit[7:6],00为工作方式0,01方式1,10方式2,11方式3
  63.     PCON |=0x00;         //Bit7-波特率倍增位:0-不培增  1-培增
  64.         AUXR |= 0x40;   //定时器1时钟为Fosc,即1T
  65.         AUXR &= 0xfE;   //串口1选择定时器1为波特率发生器
  66.     TH1 = TH1_Dat;         //8位自动重装载定时器模式下,TH1被用作自动重装载值寄存器
  67.     TL1 = TH1_Dat;  //TL1为计数寄存器
  68.     TR1 = 1;                //定时器1开始计数
  69.         ET1 = 0;        //禁止定时器1中断
  70.     ES = 1;               //串口中断允许位
  71.     EA = 1;               //打开总中断
  72. }

  73. void main()
  74. {
  75.         UART_Init(115200);
  76.         while(1);               
  77. }


  78. void Usart() interrupt 4
  79. {
  80.         u8 receiveData;

  81.         receiveData=SBUF;        //出去接收到的数据
  82.         RI = 0;                                //清除接收中断标志位
  83.         SBUF=receiveData;        //将接收到的数据放入到发送寄存器
  84.         while(!TI);                        //等待发送数据完成
  85.         TI=0;                                //清除发送完成标志位
  86. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则