找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5448|回复: 6
收起左侧

STC15串口1\串口2\串口3和串口4源程序

  [复制链接]
ID:524071 发表于 2020-1-21 15:50 | 显示全部楼层 |阅读模式
STC15标准程序,有需要的可以参考。

单片机源程序如下:
  1. //本程序的功能是串口1\串口2\串口3和串口4独立接受数据,并将接收到的数据再发送出去


  2. #include<STC15W4K32S4.H>
  3. #include "stdio.h"
  4. #include "intrins.h"
  5. #include "stdlib.h"
  6. #include "absacc.h"

  7. #define uchar unsigned char
  8. #define uint unsigned int
  9. #define ulong unsigned long



  10. uchar idata SendBuf1[6], SendBuf2[6], SendBuf3[6], SendBuf4[6];


  11. sbit OUT1 = P1^7;
  12. sbit OUT2 = P3^2;
  13. sbit OUT3 = P2^7;
  14. sbit OUT4 = P0^7;
  15. sbit OUT5 = P3^3;

  16. void serial_port1_initial();
  17. void send_UART1();
  18. void UART1_Interrupt_Receive(void);
  19. void serial_port2_initial();
  20. void send_UART2();
  21. void serial_port3_initial();
  22. void send_UART3();
  23. void serial_port4_initial();
  24. void send_UART4();
  25. void UART2_Interrupt_Receive(void);
  26. void delayus(uint i);
  27. void delayms(uint i);

  28. void main(void)
  29. {
  30.                 OUT1=0;
  31.                 OUT2=0;
  32.                 OUT3=0;
  33.                 OUT4=0;
  34.                 OUT5=0;
  35.         serial_port1_initial();
  36.         serial_port2_initial();
  37.         serial_port3_initial();
  38.         serial_port4_initial();
  39.         P0M0 =0x00;
  40.         P0M1 =0x00;
  41.         P1M0 =0x00;
  42.         P1M1 =0x00;
  43.         P2M0 =0x00;
  44.         P2M1 =0x00;
  45.         P3M0 =0x00;
  46.         P3M1 =0x00;
  47.         P4M0 =0x00;
  48.         P4M1 =0x00;
  49.         P5M0 =0x00;
  50.         P5M1 =0x00;
  51.         delayms(1000);
  52.         while(1)
  53.         {
  54. /*
  55.                 send_UART1();
  56.                 send_UART2();
  57.                 send_UART3();
  58.                 send_UART4();
  59.                 OUT1=0;
  60.                 OUT2=0;
  61.                 OUT3=0;
  62.                 OUT4=0;
  63.                 delayms(10);
  64.                 OUT1=1;
  65.                 OUT2=1;
  66.                 OUT3=1;
  67.                 OUT4=1;
  68.                 OUT1=~OUT1;
  69.                 OUT2=~OUT2;
  70.                 OUT3=~OUT3;
  71.                 OUT4=~OUT4;
  72. */
  73.                 delayus(1000);
  74.                 OUT1=~OUT1;
  75.                 OUT2=~OUT2;
  76.                 OUT3=~OUT3;
  77.                 OUT4=~OUT4;
  78.                 OUT5=~OUT5;

  79.         }
  80. }

  81. void serial_port1_initial()                   //用定时器1作为波特率发生器
  82. {

  83.         TMOD &= 0x0F;                //0x0f:设定定时器1为16位自动重装方式                0x2f: 设定定时器1为8位自动重装方式
  84.         SCON = 0x50;                //8位数据,可变波特率
  85.         AUXR = 0x40;                //定时器1时钟为Fosc,即1T  S1ST2=0,串口1选择定时器1为波特率发生器
  86.         AUXR1= 0x40;                //0x00=串口1在P3.0,P3.1,0x40=串口1在P3.6,P3.7,
  87.         TH1 = 0xFE;                //设定定时初值
  88.         TL1 = 0xE0;                //设定定时初值                         9600/11.0592Mhz
  89.         ET1 = 0;                //禁止定时器1中断
  90.         TR1 = 1;                //启动定时器1

  91.         ES = 1;
  92.         EA = 1;

  93. }
  94. void send_UART1()
  95. {
  96.         unsigned int i=0;
  97.         TI = 0;
  98.         for (i=0;i<6;i++)
  99.         {
  100.                 SBUF = SendBuf1[i];
  101.                 while (TI==0);
  102.                 TI=0;
  103.         }
  104.        
  105. }


  106. void UART1_Interrupt_Receive(void) interrupt 4
  107. {
  108.         unsigned char k =0;
  109.         if(RI == 1)
  110.         {
  111.                 RI = 0;
  112.                 SendBuf1[0] = SendBuf1[1];
  113.                 SendBuf1[1] = SendBuf1[2];
  114.                 SendBuf1[2] = SendBuf1[3];
  115.                 SendBuf1[3] = SendBuf1[4];
  116.                 SendBuf1[4] = SendBuf1[5];
  117.                 SendBuf1[5] = SBUF;
  118.                
  119.         }  
  120. }


  121. void serial_port2_initial()
  122. {

  123.         S2CON = 0x50;//01010000 8位可变波特率,无奇偶校验,允许接收

  124.         T2H = 0xFE;                //设定定时初值
  125.         T2L = 0xE0;                //设定定时初值

  126.         AUXR |= 0x14;        ////定时器2时钟为Fosc,即1T ,启动定时器2,

  127.         IE2 = 0x01;         //ES2 = 1;
  128.         P_SW2=0x00;         //串口2、3、4的位置
  129.         EA = 1;

  130. }
  131. void serial_port3_initial()
  132. {

  133.         S3CON = 0x50;//01010000 8位可变波特率,无奇偶校验,允许接收 ,选择定时器4作为波特率发生器         0x10=选择定时器2作为波特率发生器

  134.         T3H = 0xFE;                //设定定时初值
  135.         T3L = 0xE0;                //设定定时初值

  136.         T4T3M |= 0x0A;        ////定时器3时钟为Fosc,即1T ,启动定时器3,

  137.         IE2 |= 0x08;         //ES3 = 1;
  138.         P_SW2=0x00;         //串口2、3、4的位置
  139.         EA = 1;

  140. }
  141. void serial_port4_initial()
  142. {

  143.         S4CON = 0x50;//01010000 8位可变波特率,无奇偶校验,允许接收 ,选择定时器4作为波特率发生器        0x10=选择定时器2作为波特率发生器

  144.         T4H = 0xFE;                //设定定时初值
  145.         T4L = 0xE0;                //设定定时初值


  146.         T4T3M |= 0xA0;        ////定时器3时钟为Fosc,即1T ,启动定时器3,

  147.         IE2 |= 0x10;         //ES4 = 1;
  148.         P_SW2=0x00;         //串口2、3、4的位置
  149.         EA = 1;

  150. }




  151. void send_UART2()
  152. {
  153.         uchar temp = 0, i=0;

  154.         S2CON = S2CON & 0xfd;  //S2TI = 0;
  155.         for (i=0;i<6;i++)
  156.         {
  157.                 S2BUF = SendBuf2[i];
  158.                 do
  159.                 {
  160.                         temp = S2CON;
  161.                         temp = temp & 0x02;                //temp=S2TI
  162.                 }while(temp == 0);
  163.                 S2CON = S2CON & 0xfd;            //S2TI = 0;
  164.         }

  165. }


  166. void send_UART3()
  167. {
  168.         uchar temp = 0, i=0;

  169.         S3CON = S3CON & 0xfd;  //S2TI = 0;
  170.         for (i=0;i<6;i++)
  171.         {
  172.                 S3BUF = SendBuf3[i];
  173.                 do
  174.                 {
  175.                         temp = S3CON;
  176.                         temp = temp & 0x02;                //temp=S2TI
  177.                 }while(temp == 0);
  178.                 S3CON = S3CON & 0xfd;            //S2TI = 0;
  179.         }

  180. }


  181. void send_UART4()
  182. {
  183.         uchar temp = 0, i=0;

  184.         S4CON = S4CON & 0xfd;  //S2TI = 0;
  185.         for (i=0;i<6;i++)
  186.         {
  187.                 S4BUF = SendBuf4[i];
  188.                 do
  189.                 {
  190.                         temp = S4CON;
  191.                         temp = temp & 0x02;                //temp=S2TI
  192.                 }while(temp == 0);
  193.                 S4CON = S4CON & 0xfd;            //S2TI = 0;
  194.         }

  195. }




  196. void UART2_Interrupt_Receive(void) interrupt 8
  197. {
  198.         unsigned char k = 0;

  199.         k = S2CON;
  200.         k = k & 0x01;
  201.         if(k == 1)
  202.         {
  203.                 S2CON = S2CON & 0xfe;
  204.                 SendBuf2[0] = SendBuf2[1];
  205.                 SendBuf2[1] = SendBuf2[2];
  206.                 SendBuf2[2] = SendBuf2[3];
  207.                 SendBuf2[3] = SendBuf2[4];
  208.                 SendBuf2[4] = SendBuf2[5];
  209.                 SendBuf2[5] = S2BUF;
  210.        

  211.         }

  212. }


  213. void UART3_Interrupt_Receive(void) interrupt 17
  214. {
  215.         unsigned char k = 0;

  216.         k = S3CON;
  217.         k = k & 0x01;
  218.         if(k == 1)
  219.         {
  220.                 S3CON = S3CON & 0xfe;
  221.                 SendBuf3[0] = SendBuf3[1];
  222.                 SendBuf3[1] = SendBuf3[2];
  223.                 SendBuf3[2] = SendBuf3[3];
  224.                 SendBuf3[3] = SendBuf3[4];
  225.                 SendBuf3[4] = SendBuf3[5];
  226.                 SendBuf3[5] = S3BUF;
  227.        

  228.         }

  229. }

  230. void UART4_Interrupt_Receive(void) interrupt 18
  231. {
  232.         unsigned char k = 0;

  233.         k = S4CON;
  234.         k = k & 0x01;
  235.         if(k == 1)
  236.         {
  237.                 S4CON = S4CON & 0xfe;
  238.                 SendBuf4[0] = SendBuf4[1];
  239.                 SendBuf4[1] = SendBuf4[2];
  240.                 SendBuf4[2] = SendBuf4[3];
  241.                 SendBuf4[3] = SendBuf4[4];
  242.                 SendBuf4[4] = SendBuf4[5];
  243.                 SendBuf4[5] = S4BUF;
  244.        

  245.         }

  246. }

  247. void delayus(uint i)
  248. {
  249.         unsigned int j=0;
  250.         unsigned int g = 0;
  251.         for(j=0;j<i;j++)
  252.         {
  253.                         _nop_();
  254.                         _nop_();
  255.                         _nop_();
  256.                         _nop_();
  257.                         _nop_();
  258.         }
  259. }

  260. void delayms(uint i)
  261. {
  262.         unsigned int j=0;
  263.         unsigned int g = 0;
  264.         for(j=0;j<i;j++)
  265.         {
  266.                 for(g=0;g<829;g++)
  267.                 {
  268.                         _nop_();
  269.                         _nop_();
  270.                         _nop_();

  271.                 }
  272.         }
  273. }
复制代码

所有资料51hei提供下载:
STC15标准程序.rar (30.84 KB, 下载次数: 148)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:200118 发表于 2020-2-2 18:12 | 显示全部楼层
谢谢分享。。。
回复

使用道具 举报

ID:62509 发表于 2020-5-17 15:08 | 显示全部楼层
太厉害了,
回复

使用道具 举报

ID:642295 发表于 2020-12-20 10:33 | 显示全部楼层

我运行了没反应,请问这代码准确吗?
回复

使用道具 举报

ID:863708 发表于 2020-12-20 11:50 | 显示全部楼层
我是刚学到串口。。。
回复

使用道具 举报

ID:76041 发表于 2021-9-22 23:55 | 显示全部楼层
整的不错哦
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表