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

发布者:导航灯最新更新时间:2016-05-16 来源: eefocus关键字:51单片机  数据传输  监控系统 手机看文章 扫描二维码
随时随地手机看文章
>_<:功能概述:

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

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

51单片机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连接如图所示。

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

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;  //中断标志位置0
103     }
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;  // 取反加1
112             temp +=1;
113         }
114         else
115             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         else
126             TempData[1]=DuanMa[TempH/100]; //百位温度
127         if((TempH%100)/10==0)//十位温度
128             TempData[2]=0;
129         else
130             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 4
2 {
3     if(RI)                   //检测接收完成标志位置1
4     {
5         RI=0;            //清零接收完成标志位
6         a=SBUF;            //读取接收到的数据
7         uart_flag = 1;    //中断标志位置1
8     }
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;//重新赋值 2ms
 5     TL0=(65536-2)%256;
 6     
 7     Display(0,8);  // 调用数码管扫描
 8     num++;
 9     if(num==100){
10         ReadTempFlag=1;//读温度标志位置2
11     }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;     //算出来是CM
 7     if(flag==1)            //超出测量
 8     {
 9         flag=0;
10         //printf("--\n"); 
11     }
12     if(S

  

关键字:51单片机  数据传输  监控系统 引用地址:51单片机PC数据传输 温度 距离 监控系统设计

上一篇:keil提供的启动代码解析(STARTUP.A51)
下一篇:51单片机程序开发入门知识

推荐阅读最新更新时间:2024-03-16 14:54

51单片机系列——I2C通信方式——24C02(E2PROM)的应用
仿真电路如下: 代码如下: i2c.h #ifndef _I2C_H //写头文件的固定格式 #define _I2C_H //写头文件的固定格式 #include reg52.h sbit SCL=P1^2; //E2PROM24C02的引脚定义 sbit SDA=P1^3; //E2PROM24C02的引脚定义 sbit WP=P1^4; //读写保护 unsigned char I2CSendByte(unsigned char dat); unsigned char I2CReadByte(); void I2CStop(); void I2CStart(); void At24c02Write
[单片机]
<font color='red'>51单片机</font>系列——I2C通信方式——24C02(E2PROM)的应用
4-基于51单片机的多量程数字电压表
具体实现功能 仿真可以实现四个量程的切换(2V、20V、200V、500V),并模拟实现直流电压的测量与显示。 单片机介绍 51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X51 可降至0Hz 静态逻辑操作,支持2种软件可选择节
[单片机]
4-基于<font color='red'>51单片机</font>的多量程数字电压表
基于51单片机设计的喷墨打印机控制技术
单片机应用系统中最常用的输出打印设备是微型打印机,例如TP系列、UP系列打印机等,对它们的控制技术也较为成熟。但是近年来随着通用打印机的广泛使用,微型打印机的缺点也日益明显:一是通用性及互换性不强;二是打印输出文档的幅面过小,不便于装订及存档。而通用打印机都配有国际标准并行接口 (CENTRONICS)和串行接口(RS232/422),纸张大小可任意选择。这些特点是微型打印机所无法抗衡的。因此在越来越多的单片机应用系统中逐渐趋向于使用通用打印机作为打印输出设备。本文介绍了以MCS-51系列单片机为核心,通过CENTRONICS国际标准8位并行接口控制驱动HP- DJ 600/800系列喷墨打印机的硬件接口电路没计方法及控制程序设计
[单片机]
基于<font color='red'>51单片机</font>设计的喷墨打印机控制技术
51单片机4种流水灯
程序说明: LED连接在P2引脚上。 程序现象: 1、先从右到左逐个亮灭;再从左到右逐个亮灭; 2、由两侧向中间,再中间向两侧亮灭; 3、先右再左逐个亮起,不熄灭;再从左到右逐个熄灭; 4、先左再右逐个亮起,不熄灭;再从右到左逐个熄灭; #include reg52.h #define led P2 //对整个P2端口进行操作 /* 延时函数 */ void delay(unsigned int del) //10ms * del { unsigned int i,j; for(i=0; i del; i++) for(j=0; j 1827; j++) ; } void Led_Pipeline
[单片机]
51单片机【三】静态与动态驱动数码管
数码管结构及分类 数码管是发光器件之一,内部由七个条形发光二极管(a,b,c,d,e,f,g)和一个小圆点发光二极管(dp)构成,51单片机开发板上为八段数码管,如下图所示,根据各段的组合不同,显示的字符也就不同。 按八个数码管的公共端接线不同,数码管又可分类为共阴极数码管和共阳极数码管两种。共阴极数码管的公共端接地,而共阳极数码管的公共端接电源,接线如下图所示(左为共阴极,右为共阳极)。当连接的单片机接口为高电平时共阴极数码管亮;反之,连接的接口为低电平时则共阳极数码管亮。 void DigDisplay(void) { unsigned char i = 0; // 首先确定位码,选中最左侧数码管,注意查3
[单片机]
<font color='red'>51单片机</font>【三】静态与动态驱动数码管
论UPS电源智能监控系统的设计
引言   UPS供电系统是电力、通信、银行等行业的必备电源,从产生到现在已有几十年的发展历程,在技术不断发展和改进的过程中,其保护功能也在不断地发生变化。UPS根据主机内逆变器的工作状态可分为:后备式、在线式及在线互动式。他们的作用是对市电进行滤波、稳压调整,以便向负载提供更为稳定的电压,同时,通过充电器把电能转变为化学能储存在蓄电池内,一旦电力中断、电网电压或电网频率超出UPS的输入范围,可在极短的时间内开启自身的储备电源,向负载供电。   本文所设计的UPS智能监控系统具备以下环节和功能:能在各种复杂的电网环境下运行;在运行中不会对市电产生附加的干扰;输出电性能指标应该是全面的、高质量的,能满足负载的各项要求;UPS本身
[单片机]
论UPS电源智能<font color='red'>监控系统</font>的设计
基于51单片机函数信号发生器
摘要 本文以STC89C51单片机为核心设计了一个低频函数信号发生器。信号发生器采用数字波形合成技术,通过硬件电路和软件程序相结合,可输出自定义波形,如正弦波、方波、三角波、三角波、梯形波及其他任意波形,波形的频率和幅度在一定范围内可任意改变。波形和频率的改变通过软件控制,幅度的改变通过硬件实现。介绍了波形的生成原理、硬件电路和软件部分的设计原理。本系统可以产生最高频率798.6HZ的波形。该信号发生器具有体积小、价格低、性能稳定、功能齐全的优点。 1设计选题及任务 设计题目:基于单片机的信号发生器的设计与实现 任务与要求: 设计一个由单片机控制的信号发生器。运用单片机系统控制产生多种波形,这些波形包括方波、三角波、锯齿波、正
[单片机]
基于<font color='red'>51单片机</font>函数信号发生器
51单片机初级之KeilC51新建工程[1]
1.新建一个DEMO文件夹 2.KeilC51中点击新建文件 3.命名工程,并保存到DEMO文件夹中 4.选择芯片设备(我们选择AT89C52芯片) 5.添加启动文件(STARTUP.A51) 6.整个工程建好了,但是这个时候工程没有东西,需要添加文件 7.新建main.c文件 7.1点击左上方新建文件图标(或者使用快捷键CTRL+N) 7.2出现一个不知名的Text1文件 7.3保存该Text1为main.c文件(点击左上角工具栏保存图标或快捷键CTRL+S) 7.4将该main.c文件保存在DEMO文件夹中 8.添加该main.c文件 8.1在project栏目中 右键sourc
[单片机]
<font color='red'>51单片机</font>初级之KeilC51新建工程[1]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • Linux内核移植
    实验步骤:(1)准备工作(2)修改顶层Makefile(3)修改falsh 分区(4)配置编译内核下面以Linux2 6 30 4内核移植到gec2440为例:一、准备 ...
  • S5PV210 PWM定时器
    第一节 S5PV210的PWM定时器S5PV210共有5个32bit的PWM定时器,其中定时器0、1、2、3有PWM功能,定时器4没有输出引脚。PWM定时器使用PCLK_PS ...
  • S5PV210 NAND Flash
    NAND Flash关于NAND FlashS5PV210的NAND Flash控制器有如下特点:1) 支持512byte,2k,4k,8k的页大小2) 通过各种软件模式来进行NAND Fl ...
  • S5PV210串口
    串口设置之输入输出字符S5PV210 UART相关说明 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它用来 ...
  • S5PV210按键控制LED
    原理图如图所示:查询用户手册得到:程序例子:(完整代码见“代码下载链接”)1、轮询的方式查询按键事件 *main c* 核心代码如下:while(1 ...
  • S5PV210控制蜂鸣器
  • S5PV210的启动过程
  • S5PV210点亮LED
  • S5PV210启动过程详解
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved