找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1341|回復: 0
打印 上一主題 下一主題
收起左側(cè)

大家?guī)涂纯礊樯哆@個51單片機程序只有發(fā)送,沒有接收呢?

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:699018 發(fā)表于 2020-3-3 13:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. 時間:2020.02.19
  2. 芯片:STC12C5A60S2
  3. 晶振:11.0592MHz  波特率4800bps
  4. 引腳定義:串行口1:發(fā)送----TxD/P3.1; 接收---.000-RxD/P3
  5. 串行口2:          發(fā)送----TxD2/P1.3;接收----RxD2/P1.2
  6. 功能描述:STC12雙串口通信(中斷方式)
  7. ***********************************************************************/
  8. #include<STC12C5A60S2.h>
  9. //#include<reg51.h>
  10. #include <intrins.h>
  11. #include<stdlib.h>
  12. #include <stdio.h>
  13. #include <string.h>
  14. #define uchar unsigned char
  15. #define uint unsigned int
  16. #define FOSC 11059200L      //System frequency
  17. #define BAUD 4800           //UART baudrate         
  18. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

  19. unsigned char Tx_Buffer[8];
  20. unsigned char RX_Buffer[50];
  21. unsigned char read_enable,receive_finished,reveive_number,ms,number;
  22. unsigned long Voltage_data,Voltage,Voltage1;
  23. unsigned long Vh6,Vl6,Vh5,Vl5,Vh4,Vl4,Vh3,Vl3;

  24. union crcdata                     //CRC機構體
  25. {
  26. unsigned int word16;
  27. unsigned char byte[2];
  28. }crcnow;

  29. void power_out_mode();
  30. void Delay_ms(unsigned int n);

  31.         
  32. sbit led = P2^0;
  33. sbit WDT_WDI= P3^2;

  34. /****************串行口初始化函數(shù)****************/
  35. void InitUART(void)
  36. {                           
  37.         SCON = 0x50;            //8-bit variable UART  
  38.         TMOD=0x21;  //定時1工作方式于串口,定時器0工作方式1
  39.         TH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vaule定時器1初值
  40.         TR1=1;             //啟動定時器1
  41.         REN=1;            //允許接收中斷
  42.         ES=1;       //允許串行口中斷
  43.         TH0=(65535-50000)/256;        //以下設置為時鐘,裝初值
  44.         TL0=(65535-50000)%256;           
  45.   ET0=1;     //開定時器0中斷
  46.         TR0=1;           //啟動定時器0                                
  47.   EA =1;     //開總中斷
  48. }


  49. /****************串行口連續(xù)發(fā)送char型數(shù)組****************/
  50. void Uart1Sends(unsigned char DAT)
  51. {
  52. //ES = 0;
  53. TI=0;
  54. SBUF=DAT ;
  55. while(TI==0);
  56. TI=0;
  57. //ES = 1;
  58. }
  59. void Send_data(unsigned char lenth )
  60. {
  61. unsigned char i = 0 ;
  62. for(i=0; i<lenth; i++)
  63. {
  64. Uart1Sends(Tx_Buffer[i]) ;
  65. }
  66. }

  67. /************CRC***********/

  68. unsigned int calccrc(unsigned char crcbuf,unsigned int crc)
  69. {
  70. unsigned char i;
  71. unsigned char chk;
  72. crc=crc ^ crcbuf;
  73. for(i=0;i<8;i++)
  74. {
  75.   chk=( unsigned char)(crc&1);
  76.   crc=crc>>1;
  77.   crc=crc&0x7fff;
  78.   if (chk==1)
  79.   crc=crc^0xa001;
  80.   crc=crc&0xffff;
  81. }
  82. return crc;
  83. }
  84. unsigned int chkcrc(unsigned char *buf,unsigned char len)
  85. {
  86. unsigned char hi,lo;
  87. unsigned int i;
  88. unsigned int crc;
  89. crc=0xFFFF;
  90. for(i=0;i<len;i++)
  91. {
  92.   crc=calccrc(*buf,crc);
  93.   buf++;
  94. }
  95. hi=( unsigned char)(crc%256);
  96. lo=( unsigned char)(crc/256);
  97. crc=(((unsigned int)(hi))<<8)|lo;
  98. return crc;
  99. }
  100. /************發(fā)送命令***********/
  101. void read_data(void)
  102. {
  103.   read_enable=0;
  104.   Tx_Buffer[0]=0x01; //模塊的ID 號,默認0x01
  105.   Tx_Buffer[1]=0x03;
  106.   Tx_Buffer[2]=0x00;
  107.   Tx_Buffer[3]=0x48;
  108.   Tx_Buffer[4]=0x00;
  109.   Tx_Buffer[5]=0x08;
  110.   crcnow.word16=chkcrc(Tx_Buffer,6);
  111.   Tx_Buffer[6]=crcnow.byte[1]; //CRC校驗低字節(jié)在前
  112.   Tx_Buffer[7]=crcnow.byte[0];
  113.   Send_data(8); //發(fā)送數(shù)據(jù)
  114. }  
  115. /*******端口初始化********/
  116.   void IO_Init()
  117.         {   
  118. led=1;        
  119.         
  120.         }
  121. void main()
  122. {
  123.   InitUART();
  124.         IO_Init();
  125.         Delay_ms(10);
  126.   while(1)
  127.   {
  128.          WDT_WDI=~WDT_WDI;
  129.          Delay_ms(10);
  130.          if(read_enable==1) //到時間讀取模塊,間隔時間為1s
  131.         {         
  132.          read_data();
  133.          }        
  134.          if(receive_finished==1) //接受完成
  135.          {
  136.                  led=0;
  137.            receive_finished=0;         
  138.          }   
  139.   }
  140. }

  141. /*******定時中斷*********/
  142.   void Timer0(void) interrupt 1                        
  143.   {
  144.          TH0 = (65535-50000)/256;                //50ms
  145.          TL0 = (65535-50000)%256;
  146.    ms++;
  147.          if(ms>=60)                //1s
  148.          {
  149.           ms=0;
  150.           read_enable=1;
  151.    }
  152.   }
  153. /************串行口1中斷處理函數(shù)*************/
  154.   void UART_1Interrupt() interrupt 4
  155. {
  156.         //ES=0;
  157.   if(RI)
  158.         {
  159.          
  160.          RI=0;
  161.          RX_Buffer[number] = SBUF;
  162.          number++;
  163.          if(number>36)
  164.          {
  165.                 receive_finished=1;        
  166.     number=0;                 
  167.          }        
  168.         }
  169.         // ES=1;
  170. }

  171.         //MS延時函        */
  172. //****************************************************
  173. void Delay_ms(unsigned int n)
  174. {
  175.         unsigned int  i,j;
  176.         for(i=0;i<n;i++)
  177.                 for(j=0;j<110;j++);
  178. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

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

快速回復 返回頂部 返回列表