微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机PC数据传输 温度 距离 监控系统设计

51单片机PC数据传输 温度 距离 监控系统设计

时间:11-20 来源:互联网 点击:
>_<:功能概述:

通过串口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   

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top