您的位置 首页 国产IC

51单片机PC数据传输 温度 间隔 监控体系规划

>_:功能概述:通过串口PC和单片机通信,可以询问单片机测得的温度,可以询问声呐测距的测量距离,同时把测量温度显示在数码管上。>_:PC部…

>_<:功用概述:

经过串口PC和单片机通讯,能够问询单片机测得的温度,能够问询声呐测距的丈量间隔,一起把丈量温度显现在数码管上。

>_<:PC部分

这儿com.cpp和com.h是串口通讯的函数封装,在主函数中:

  • 刚开始调用封装好的串口通讯函数,设置翻开串口COM4,波特率设置为9600,超时设置:

1 if(openport("com4"))2     printf("open comport success\n");3 if(setupdcb(9600))4     printf("setupDCB success\n");5 if(setuptimeout(0,0,0,0,0)) //假如一切写超时参数均为0,那么就不运用写超时6     printf("setuptimeout success\n");7 clearall();//全清
  • 接着循环接纳控制台指令来与串口通讯:这儿用了串口通讯函数WriteChar和ReceiveChar来与串口进行信息传送,留意这儿的读写应和单片机的共同,不然就会呈现过错。这儿举a==5的比如阐明:

    [指令5一共改动间隔阈值,当输入5时,PC将向串口发送字符’5’,然后等候输入改动后的温度,当输入改动温度时,将该温度传给串口[由于咱们这儿的规模是0-100]所以一个char类型就能一共,将这个值发送给串口,当单片机改动好间隔阈值后会回来改好的指令,所以调用ReceiveChar接纳回来信息。其他相似。]
1 while(1){2     scanf("%d",&a);//1一共要温度,2一共要间隔,3一共间隔警报封闭,4温度警报封闭,5改动间隔阈值,6改动温度阈值3     if(a==5){ 4         m_szWriteBuffer[0]=5;5         WriteChar(m_szWriteBuffer,1);6         printf("Please enter the num:(0-100cm) \n");7         scanf("%d",&a);8         m_szWriteBuffer[0]=(BYTE)(a);9         WriteChar(m_szWriteBuffer,1);10         ReceiveChar(m_szReceiveBuffer,20);11         printf("%s\n",m_szReceiveBuffer);12     }else if(a==6){13         m_szWriteBuffer[0]=6;14         WriteChar(m_szWriteBuffer,1);15         printf("Please enter the num:(0-100℃) \n");16         scanf("%d",&a);17         m_szWriteBuffer[0]=(BYTE)(a);18         WriteChar(m_szWriteBuffer,1);19         ReceiveChar(m_szReceiveBuffer,20);20         printf("%s\n",m_szReceiveBuffer);21     }else{22         m_szWriteBuffer[0]=(BYTE)(a+0);23         WriteChar(m_szWriteBuffer,1);24 25         ReceiveChar(m_szReceiveBuffer,20);26         printf("%s\n",m_szReceiveBuffer);27     }28 }

>_<:单片机部分

设备:

  • 18B20温度传感器
  • 8位数码管显现
  • 串口通讯
  • HC-SR04超声波测距
  • STC89C52[11.0952MHz]
  • 蜂鸣器

连线:

  这儿选用11.0592MHz的晶振,将8位7段数码管公共线接P0的8个端口,P2.3接位码,P2.2接段码;串口通讯选用MAX232衔接如图所示。

main函数介绍:

#初始化部分介绍:

1 unsigned int TempH,TempL,temp;2 Init_Timer0();3 UART_Init(); // 串口初始化4 Init_Timer1();5 6 ReadTemperature();//这儿放置3个温度读取,避免呈现初始化温度不稳定状况7 ReadTemperature();8 ReadTemperature();
  • 第2行:初始守时器:MOD=0x01T0守时16位形式
  • 第3行:串口初始化:详细信息见注释
1 void UART_Init(void)2 {3     SCON = 0x50;         // 设定串行口工作方式,8位数据位,答应接纳4     T2CON = 0x34;         //设置守时器2,作为波特率产生器5     RCAP2L = 0XDC;      //9600波特率的低8位6     RCAP2H = 0XFF;        //9600波特率的高8位    7     ES = 1;                 //答应串口中止8     EA = 1;                 //答应总中止9 }
  • 第6-8行:在体系初始前先读取3次温度,避免体系初始时温度的值不正常而触发报警

#主循环介绍:

1 while (1)    2 {3     if(isInclude  isAbove){4         //LED_Show(2);5         //if(freq==200);6         SPK=!SPK;7     }8     if(uart_flag==1)   //接纳到9     {10         ES=0;       //关串口中止11         if(come==1){//接纳并改动间隔阈值12             maxJuLi=(unsigned int)a;13             come=0;14             UART_Send_Byte(O);15             UART_Send_Byte(K);16             UART_Send_Byte(#);17             UART_Send_Byte(\n);18         }else if(come==2){//接纳并改动温度阈值19             maxWenDu=(unsigned int)a;20             come=0;21             UART_Send_Byte(O);22             UART_Send_Byte(K);23             UART_Send_Byte(#);24             UART_Send_Byte(\n);25         }else//其他操作26         switch(a){//要温度27         case 1:28             for(i=0;i<17;i++)29             {30                 UART_Send_Byte(SendData[i]);//将数据发给串口31             }32             UART_Send_Byte(\n);33             break;34         case 2://要间隔35             for(i=0;i<16;i++)36             {37                 UART_Send_Byte(SendData1[i]);//将数据发给串口38             }39             UART_Send_Byte(\n);40             break;41         case 3:42             if(isInclude){43                 isInclude=0;44                 UART_Send_Byte(c);45                 UART_Send_Byte(l);46                 UART_Send_Byte(o);47                 UART_Send_Byte(s);48                 UART_Send_Byte(e);49                 UART_Send_Byte(#);50                 UART_Send_Byte(\n);51             }else{52                 UART_Send_Byte(n);53                 UART_Send_Byte(o);54                 UART_Send_Byte( );55                 UART_Send_Byte(p);56                 UART_Send_Byte(e);57                 UART_Send_Byte(r);58                 UART_Send_Byte(s);59                 UART_Send_Byte(o);60                 UART_Send_Byte(n);61                 UART_Send_Byte(#);62                 UART_Send_Byte(\n);63             }64             break;65         case 4:66             if(isAbove){67                 isAbove=0;68                 UART_Send_Byte(c);69                 UART_Send_Byte(l);70                 UART_Send_Byte(o);71                 UART_Send_Byte(s);72                 UART_Send_Byte(e);73                 UART_Send_Byte(#);74                 UART_Send_Byte(\n);75             }else{76                 UART_Send_Byte(n);77                 UART_Send_Byte(o);78                 UART_Send_Byte( );79                 UART_Send_Byte(f);80                 UART_Send_Byte(i);81                 UART_Send_Byte(r);82                 UART_Send_Byte(e);83                 UART_Send_Byte(#);84                 UART_Send_Byte(\n);85             }86             break;87         case 5:88             come=1;89             break;90         case 6:91             come=2;92             break;93         default://过错操作94             for(i=0;i<16;i++)95             {96                 UART_Send_Byte(SendData2[i]);//将数据发给串口97             }98             UART_Send_Byte(\n);99             break;100         }101         ES=1;    //答应串口中止102         uart_flag=0;  //中止标志方位0103     }104     else if(ReadTempFlag==1)//经过守时器,每隔1200ms扫描一次温度105     {106         ReadTempFlag=0;107         temp=ReadTemperature();108         if(temp&0x8)//第一位为1就一共为负要取反加1第一位弄个负号109         {110             TempData[0]=0x40;//负号标志temp=~temp;  // 取反加1112             temp +=1;113         }114         else115             TempData[0]=0;//其他状况就该显现负号的不显现116         117         TempH=temp>>4;//去除低四位118         TempL=temp&0x0F;//获取温度低四位119         TempL=TempL*6/10;//小数近似处理!120 121         if(TempH>0 && TempH>maxWenDu)isAbove=1;//边界判别122 123         if(TempH/100==0)//百位数据124             TempData[1]=0;125         else126             TempData[1]=DuanMa[TempH/100]; //百位温度127         if((TempH%100)/10==0)//十位温度128             TempData[2]=0;129         else130             TempData[2]=DuanMa[(TempH%100)/10];131         TempData[3]=DuanMa[(TempH%100)%10]0x80; //个位温度,带小数点132         TempData[4]=DuanMa[TempL];133         TempData[6]=0x39;         //显现C符号134 135         136         SendData[11]=(unsigned char)(TempH/100+0);137         SendData[12]=(unsigned char)(TempH%100/10+0);138         SendData[13]=(unsigned char)(TempH%100%10+0);139         SendData[14]=.;140         SendData[15]=(unsigned char)(TempL+0);141     }else if(ReadTempFlag==2){142         ReadTempFlag=0;143         StartModule();        //测距144         while(!RX);            //当RX为零时等候145         TR1=1;                //舱位计数146         while(RX);            //当RX为1计数并等候147         TR1=0;                //封闭计数148         Conut();            //核算149     }150 }
  • 第3-7行:当温度在阈值外或许间隔在阈值内时就响铃
  • 第8-103行:当串口通讯产生串口中止时,会把uart_flag标志方位1,然后主程序就会处理PC端传送过来的数据,这儿选用串口中止来检测是否收到PC发来的数据的:
1 void UART(void) interrupt 42 {3     if(RI)                   //检测接纳完结标志方位14     {5         RI=0;            //清零接纳完结标志位6         a=SBUF;            //读取接纳到的数据7         uart_flag = 1;    //中止标志方位18     }9 }
  • 第11-25行:这儿是要修正温度或许间隔的阈值时用到的特别处理,由于当收到修正阈值的指令之后还要等候要改成的值,为了差异这个值和指令值,所以用come符号是否是要修正阈值,假如不是修正阈值,就正常判别指令,不然就做相应的阈值修正。
  • 第27-33行:将温度发送给PC,最终要发送一个换行,作为完毕标志位[这是和PC端的接纳程序有关,2个通讯的协议要共同],其他相似,不做详解。
  • 第41-86行:封闭报警指令,假如正在报警,就封闭报警,回来给电脑现已封闭的信息;假如没有报警,就电脑相应信息。
  • 第87-92行:要修正阈值,就把come置成相应的值,等候承受要修正值,与第11-25行相对应
  • 第104-141行:假如没有电脑指令传过来就进行温度并重和间隔测验:
1 void Timer0_isr(void) interrupt 1 2 {3     static unsigned int num;4     TH0=(65536-2)/256;//从头赋值 2ms5     TL0=(65536-2)%256;6     7     Display(0,8);  // 调用数码管扫描8     num++;9     if(num==100){10         ReadTempFlag=1;//读温度标志方位211     }else if(num==150)      12     {13         num=0;14         ReadTempFlag=2;//读间隔标志方位1 15     }16 }
  • 第143-147行:丈量时间差[用守时器TH1,TL1]
  • 第148行:核算超声波测距的间隔[依据上面核算的声波来回的时差]
1 void Conut(void)2 {3     time=TH1*256+TL1;4     TH1=0;5     TL1=0;6     S=(time*1.87)/100;     //算出来是CM7     if(flag==1)            //超出丈量8     {9         flag=0;10         //printf("--\n"); 11     }12     if(S

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/ic/263762.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部