找回密码
 立即注册

QQ登录

只需一步,快速开始

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

大家帮看看为啥这个51单片机程序只有发送,没有接收呢?

[复制链接]
跳转到指定楼层
楼主
ID:699018 发表于 2020-3-3 13:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. 时间:2020.02.19
  2. 芯片:STC12C5A60S2
  3. 晶振:11.0592MHz  波特率4800bps
  4. 引脚定义:串行口1:发送----TxD/P3.1; 接收---.000-RxD/P3
  5. 串行口2:          发送----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. /****************串行口初始化函数****************/
  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. /****************串行口连续发送char型数组****************/
  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. /************发送命令***********/
  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校验低字节在前
  112.   Tx_Buffer[7]=crcnow.byte[0];
  113.   Send_data(8); //发送数据
  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中断处理函数*************/
  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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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