基于52单片机温湿度传感器课程设计报告(含代码) 下载本文

拨码开关)。当打开开关时,背光关掉,可以省电;合上开关,调节电阻可以使12864显示亮度变化。

2. 能够显示以后,发现显示界面一直在刷新,显示不稳定。原因是每秒随着秒刷新初始化界面一次,解决的方案是不重新调用显示,而是只给显示秒的位置刷新,其他时间随秒变化。温湿度值则是有了变化就刷新。

3. 由于编写程序时,没有考虑到串口通信中传回PC的数据的十六进制与显示字符之间的数据处理关系,导致在串口助手软件中只显示了传回的最后一个十六进制数所对应的ASCⅡ的字符,找到问题的解决关键所在后,经过数的分位与字符显示后,成功的显示了传回的温度、湿度的数据,让我们距离成功只差一小步了。接下来的任务就是显示在12864液晶上,根据之前单独在其上显示过液晶万年历的基础,知道只要将dht11检测的数据进行相应处理后并且与液晶万年历的显示集成一起送显示就行了。理论虽简单,但实际在下载到芯片中检测现象时,我们发现分别单独显示两者的数据没有问题,但集成在一块显示不久就会花屏的现象,问题出在刷新汉字时,指针光标的位置修改错误所导致的。之后经过重新写回指针后就达到了较为满意的效果。在报警程序的设置上,主要解决蜂鸣器报警间隔和LED灯闪烁的时间匹配问题,让两者现象统一。

4. 单片机与计算机通信。上位机界面设计,利用VB编程,用MSComm控件能够实现单片机传送数据到计算机并显示。

Private Sub MSComm1_OnComm() Dim rec As String ;定义接收字符串

Select Case MSComm1.CommEvent ;串口事件选择 Case comeEvReceive ;串口事件为接收

rec = MSComm1.Input ;从接收缓冲区中读取数据 Text1.Text = rec ;将接收到的字符串写入文本框 MSComm1.InBufferCount = 0 ;设置接收缓冲区中等待计算机接受的字符数为0

End Select End Sub

Private Sub form_load()

MSComm1.Settings = \ ;波特率,奇偶校验,发送位数,停止位

MSComm1.CommPort = 5 ;串口号

If MSComm1.PortOpen = True Then MSComm1.PortOpen = False

MSComm1.RThreshold = 8 ;接收缓冲区字符为8时,串口控件设置串口事件为接收,并产生OnComm事件

MSComm1.SThreshold = 2 ;发送缓冲区中字符小于2时,串口控件设置串口事件为发送,并产生OnComm事件

MSComm1.InputLen = 0 ;返回一次从接收缓冲区读取所

有字节

MSComm1.InputMode = comInputModeText ;接收模式为文本

If MSComm1.PortOpen = False Then MSComm1.PortOpen = True

MSComm1.InBufferCount = 0 Me.Caption = \温湿度显示\End Sub

Private Sub Form_Resize() ;窗体背景图片设置 Image1.Top = 0 Image1.Left = 0 Image1.Stretch = True

Image1.Height = Me.ScaleHeight Image1.Width = Me.ScaleWidth End Sub

Private Sub mnuQuit_Click() End End Sub

六、 设计总结

本次设计是小组三人共同努力的成果,大家齐心协力克服了上述种种困难,才把实物做出来。通过这次设计,我们学习到了如何

把传感器联系单片机知识做成一个简单的检测系统,如何完成简单的通信任务,如何编写高效率的C代码。当然我们的不足也有很多,比如硬件设计电路考虑不全面,造成后来不得不修改一些连线和元件使得电路板不够美观;还有程序不够模块化,有不少冗余,移植性和兼容性也不好,今后要更加注重这些方面的改进。

附录代码:

/*****基于单片机的温湿度检测系统******/ #include

#define uchar unsigned char #define uint unsigned int

/***端口定义***/ sbit LCD_RS=P3^5; //寄存器选择输入 sbit LCD_RW=P3^6; //液晶读/写控制 sbit LCD_EN=P3^4; //液晶使能控制 sbit LCD_PSB=P3^7; //串/并方式控制 sbit s5=P0^3; //关报警 sbit s4=P0^4; //设置温湿度报警值及开关报警 sbit s3=P0^5; //调时开/关 sbit s2=P0^6; //加操作 sbit s1=P0^7; //减操作 sbit led1=P2^0; //温度报警 sbit led2=P2^1; //湿度报警 sbit buzzer=P2^5; //蜂鸣器 sbit AM2301=P2^6; //P2.6口为通讯口连接DHT11 typedef unsigned char U8; typedef unsigned int U16;

char sec,min,hour,week,day=1,month=1,year; bit flag,flag2,flag3=0,flag4=0,flag5=0,flag6=0; uchar a;

uchar s1num,s4num;

uchar code dis1[]={\年12月02日%uchar code dis2[]={\时00分00秒%uchar code dis3[]={\温度: 25.0 日%uchar code dis4[]={\湿度: 40.0\

uchar code dis5[]={\温度上限:\温湿度设置界面 uchar code dis6[]={\温度下限:%uchar code dis7[]={\湿度上限:%uchar code dis8[]={\湿度下限:\