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
51单片机数据传输监控系 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)