找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2560|回复: 2
打印 上一主题 下一主题
收起左侧

求指教 stc12c5a60s2双串口单片机第二串口通讯问题

[复制链接]
跳转到指定楼层
楼主
ID:188200 发表于 2017-4-10 20:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人以前学的一直是at89c51型单片机   现在学校里做一个甲醛检测仪  原来的串口用于传感器传送数据  因为要做一个RS232和上位机通信  所以选用了 stc12c5a60s2双串口单片机 。。无奈啊 第二个串口死活弄不通  

问题大概是这样的 不用串口二初始化 不用串口二发送数据的时候好好的   单把串口二初始化程序添加进去并传送数据后  串口一串口二都不工作了  也显示不出检测数据了。。想问问有没有大神会改  帮忙弄一下串口二的初始化程序和发送程序

PS  串口二只用发送  不用接受   波特率都是9600  晶振都是11.0592
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:188200 发表于 2017-4-10 20:15 | 只看该作者
  1. #include <12c5a60s2.h>
  2. #include <intrins.h>
  3. #include<absacc.h>
  4. #include <string.h>

  5. #define uchar unsigned char       
  6. #define uint unsigned int
  7. #define busy 0x80


  8. uint jiaquan_mg,jiaquan_ppm;                 

  9. uchar  NRxBuff;   //通讯接收缓冲区记数
  10. uchar  inbuff[20];//通讯接收缓冲区数据
  11. uchar  outbuff[20];//通讯发射缓冲区数据

  12. sbit RS=P3^3;
  13. sbit RW=P3^4;
  14. sbit E=P3^5;






  15. //毫秒延时子程序
  16. void delay_nms(uint n)
  17. {uint i,j;
  18. for (i=0;i<n;i++){for(j=0;j<1900 ;j++);}}  

  19. //串口1   初始化
  20. void UartInit(void)                //9600bps@11.0592MHz
  21. {
  22.         PCON |= 0x80;                //使能波特率倍速位SMOD         
  23.         SCON = 0x50;                //8位数据,可变波特率
  24.         AUXR=AUXR&0x5a;
  25.         TMOD &= 0x0f;                //清除定时器1模式位
  26.         TMOD |= 0x20;                //设定定时器1为8位自动重装方式
  27.         TL1 = 0xFA;                //设定定时初值
  28.         TH1 = 0xFA;                //设定定时器重装值
  29.         ET1 = 0;                //禁止定时器1中断
  30.         TR1 = 1;                //启动定时器1

  31. }


  32. //串口2  初始化
  33. void Uart_two_init (void)       
  34. {

  35.      S2CON=0x50;
  36.      BRT=0xfd;  
  37.      AUXR1=AUXR1&0xef;
  38.      IE2=IE2|0x01;

  39. }


  40. // 串口2   发送一个字符
  41. void uart_two_send(uchar l)
  42. {
  43.         ES2=0;               
  44.         S2BUF=l;
  45.         while((S2CON&0x02)!=0x02);       
  46.         S2CON&=~0x02;
  47.         ES=1;               

  48. }

  49. //串口2   发送数据
  50. void uart_two_printf(uchar *p)
  51. {
  52.   
  53.    uchar b;
  54.         for(b=0;b<=7;b++)
  55.         {
  56.         uart_two_send(p[b]);
  57.         }



  58. }






  59. /////串口1中断子程序//////
  60. serial (void) interrupt 4
  61. {
  62. RI=0;
  63. inbuff[NRxBuff]=SBUF;
  64. NRxBuff++;
  65. if (NRxBuff>15)NRxBuff=0;
  66. }

  67. //串口1输出子程序
  68. void sprint(uchar a)
  69. {
  70. ES=0;
  71. SBUF=a;
  72. while(!TI)
  73. {};
  74. TI=0;
  75. ES=1;
  76. }

  77. //发送读取指令
  78. void fa_read_pro(void)
  79. {
  80. uchar a;
  81. outbuff[0]=0xa5;
  82. outbuff[1]=0x5a;
  83. outbuff[2]=0x02;
  84. outbuff[3]=0x80;
  85. outbuff[4]=0xaa;
  86. for (a=0;a<5;a++)sprint(outbuff[a]);
  87. }


  88. //  1602的显示程序这里省略了




  89. //       主程序             //

  90. void main(void)
  91. {
  92. uint mg1,mg2,mg3,ppm1,ppm2,ppm3;

  93. uchar *s1;
  94. uchar *s2;
  95. uchar *s3;
  96. uchar s4;
  97. init_1602();

  98. s1="HCHO:";
  99. s2="mg/m3";
  100. s3="ppm";
  101. s4='.';


  102. display_1602string(0,0,s1);                         //           第一行开头显示 HCHO:
  103. display_1602string(0,1,s1);                         //           第二行开头显示 HCHO:
  104. display_1602string(11,0,s2);                  //           第一行末尾显示 mg/m3
  105. display_1602string(13,1,s3);                 //           第二行末尾显示 ppm



  106. EA=0;
  107. delay_nms(50);                          //  
  108. NRxBuff=0;
  109. UartInit();         //串口1  初始化


  110. Uart_two_init();  // 串口2   初始化               


  111. EA=1;
  112. delay_nms(166);       //   
  113. while(1)
  114. {

  115. fa_read_pro();////发送读取指令
  116. delay_nms(100);//延时一段时间,大于50ms          







  117. if ((NRxBuff>=8)&&(inbuff[0]==0xA5)&&(inbuff[1]==0x5A)&&(inbuff[3]==0x80))      //如果收到8个字节的数据,进行判断,然后处理数据。
  118. {
  119. jiaquan_mg=inbuff[4]*256+inbuff[5];////////////计算甲醛mg值
  120. jiaquan_ppm=inbuff[6]*256+inbuff[7];//////////计算甲醛ppm值




  121. NRxBuff=0;
  122. }

  123. //     想在这个位置  把从串口一接收到的8个字节数据通过RS232从串口二传送出去 串口二只用于传送 不用接受


  124. mg1=jiaquan_mg/100;                           //计算各位
  125. mg2=jiaquan_mg%100/10;                           //计算十分位
  126. mg3=jiaquan_mg%100%10;                           //计算千分位

  127. ppm1=jiaquan_ppm/100;
  128. ppm2=jiaquan_ppm%100/10;
  129. ppm3=jiaquan_ppm%100%10;


  130. display_1602char(7,0,s4);                        //显示小数点
  131. display_1602char(7,1,s4);

  132. display_1602int(6,0,0x30+mg1);                  //显示动态数字要加 0x30    显示以mg为单位的检测数值
  133. display_1602int(8,0,0x30+mg2);
  134. display_1602int(9,0,0x30+mg3);

  135. display_1602int(6,1,0x30+ppm1);                  //显示动态数字要加 0x30          显示以ppm为单位的检测数值
  136. display_1602int(8,1,0x30+ppm2);
  137. display_1602int(9,1,0x30+ppm3);


  138. delay_nms(166);                 

  139. }



  140. }
复制代码
回复

使用道具 举报

板凳
ID:290231 发表于 2018-5-1 14:26 来自手机 | 只看该作者
老哥,调出来了吗,能讲讲吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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