找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2907|回復(fù): 2
收起左側(cè)

求指教 stc12c5a60s2雙串口單片機(jī)第二串口通訊問題

[復(fù)制鏈接]
ID:188200 發(fā)表于 2017-4-10 20:14 | 顯示全部樓層 |閱讀模式
本人以前學(xué)的一直是at89c51型單片機(jī)   現(xiàn)在學(xué)校里做一個(gè)甲醛檢測(cè)儀  原來的串口用于傳感器傳送數(shù)據(jù)  因?yàn)橐鲆粋(gè)RS232和上位機(jī)通信  所以選用了 stc12c5a60s2雙串口單片機(jī) 。。無奈啊 第二個(gè)串口死活弄不通  

問題大概是這樣的 不用串口二初始化 不用串口二發(fā)送數(shù)據(jù)的時(shí)候好好的   單把串口二初始化程序添加進(jìn)去并傳送數(shù)據(jù)后  串口一串口二都不工作了  也顯示不出檢測(cè)數(shù)據(jù)了。。想問問有沒有大神會(huì)改  幫忙弄一下串口二的初始化程序和發(fā)送程序

PS  串口二只用發(fā)送  不用接受   波特率都是9600  晶振都是11.0592
回復(fù)

使用道具 舉報(bào)

ID:188200 發(fā)表于 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;   //通訊接收緩沖區(qū)記數(shù)
  10. uchar  inbuff[20];//通訊接收緩沖區(qū)數(shù)據(jù)
  11. uchar  outbuff[20];//通訊發(fā)射緩沖區(qū)數(shù)據(jù)

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






  15. //毫秒延時(shí)子程序
  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位數(shù)據(jù),可變波特率
  24.         AUXR=AUXR&0x5a;
  25.         TMOD &= 0x0f;                //清除定時(shí)器1模式位
  26.         TMOD |= 0x20;                //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式
  27.         TL1 = 0xFA;                //設(shè)定定時(shí)初值
  28.         TH1 = 0xFA;                //設(shè)定定時(shí)器重裝值
  29.         ET1 = 0;                //禁止定時(shí)器1中斷
  30.         TR1 = 1;                //啟動(dòng)定時(shí)器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   發(fā)送一個(gè)字符
  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   發(fā)送數(shù)據(jù)
  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. //發(fā)送讀取指令
  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();////發(fā)送讀取指令
  116. delay_nms(100);//延時(shí)一段時(shí)間,大于50ms          







  117. if ((NRxBuff>=8)&&(inbuff[0]==0xA5)&&(inbuff[1]==0x5A)&&(inbuff[3]==0x80))      //如果收到8個(gè)字節(jié)的數(shù)據(jù),進(jìn)行判斷,然后處理數(shù)據(jù)。
  118. {
  119. jiaquan_mg=inbuff[4]*256+inbuff[5];////////////計(jì)算甲醛mg值
  120. jiaquan_ppm=inbuff[6]*256+inbuff[7];//////////計(jì)算甲醛ppm值




  121. NRxBuff=0;
  122. }

  123. //     想在這個(gè)位置  把從串口一接收到的8個(gè)字節(jié)數(shù)據(jù)通過RS232從串口二傳送出去 串口二只用于傳送 不用接受


  124. mg1=jiaquan_mg/100;                           //計(jì)算各位
  125. mg2=jiaquan_mg%100/10;                           //計(jì)算十分位
  126. mg3=jiaquan_mg%100%10;                           //計(jì)算千分位

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


  130. display_1602char(7,0,s4);                        //顯示小數(shù)點(diǎn)
  131. display_1602char(7,1,s4);

  132. display_1602int(6,0,0x30+mg1);                  //顯示動(dòng)態(tài)數(shù)字要加 0x30    顯示以mg為單位的檢測(cè)數(shù)值
  133. display_1602int(8,0,0x30+mg2);
  134. display_1602int(9,0,0x30+mg3);

  135. display_1602int(6,1,0x30+ppm1);                  //顯示動(dòng)態(tài)數(shù)字要加 0x30          顯示以ppm為單位的檢測(cè)數(shù)值
  136. display_1602int(8,1,0x30+ppm2);
  137. display_1602int(9,1,0x30+ppm3);


  138. delay_nms(166);                 

  139. }



  140. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:290231 發(fā)表于 2018-5-1 14:26 來自觸屏版 | 顯示全部樓層
老哥,調(diào)出來了嗎,能講講嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表