1、4、 设计步骤及原理步骤1:原理图分析与设计单片机最小系统原理图如图4-1-1所示:图4-1-151单片机最小系统包括了主要由电源、复位、振荡电路以及扩展部分等部分组成。对于电源供电模块可以通过USB电源线连接电脑供给,另外也可以用外部稳定的5V电源供电模块供给。对于复位电路,本设计中采用按键复位方法。按键复位就是在复位电容上并联一个开关,当开关按下时电容被放电、RST也被拉到高电平,而且由于电容的充电,会保持一段时间的高电平来使单片机复位。对于时钟震荡电路,所以外部只要连接一个晶振和两个电容即可,电容容量一般在15pF至50pF之间。而本次设计采用了12MHz的晶体振荡器作为震荡源。 温湿度
2、传感器温湿度数据采集模块如图4-1-2所示,DHT11是一款有已校准数字信号输出的温湿度传感器。 精度湿度+-5%RH, 温度+-2,量程湿度20-90%R温度050。DHT11数 图4-1-2字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在
3、检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。产品为4针单排引脚封装,连接方便。本设计中采用DHT11传感器将采集的温度传送给单片机,然后内部进行BCD码转换,最后通过LCD1602液晶显示器显示出来。 LCD1602液晶显示器模块如图4-1-3所示,602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样。本次设计中将多出来的15脚接上VCC,然后GND(16脚)接到单片机的P24口,然
4、后通过按键K5 图4-1-3来控制P24口输出电平的状态从而控制LCD1602液晶显示器的背光的开关。仿真中由于无法仿真背光效果,只能通过LED状态图4-1-4 确定,如图4-1-4所示。通过网上查阅LCD1602液晶显示器的芯片手册可以知道,将D0-D7八个数据口连接P0,然后通过RS、RW以及使能端E控制LCD的读写操作。步骤2:流程设计通过对课本的学习以及课外学习的知识,然后根据自己的构想来设计实现怎么样的效果,通过对软件设计思路的分析,得到该设计的系统主程序流程图如图4-2-1所示:图4-2-1系统开始后,先对定时器以及显示器进行初始化,然后写入框架显示时间和温度。当定时器中断时,内部
5、对秒进行自加,加到60s后自动归零且分自加,其它时间标志位也是一样。当然,每1s满时显示会刷新一次从新显示新的数据,温度函数也是按照指定时间进行测量刷新。步骤3:软件编程1. 建立LCD.H文件#ifndef _LCD_H_#define _LCD_H_#include#define uchar unsigned char#define uint unsigned int#define LCD1602_DATAPINS P0sbit LCD1602_E=P27;sbit LCD1602_RW=P25;sbit LCD1602_RS=P26;void Lcd1602_Delay1ms(uint
6、c);void LcdWriteCom(uchar com);void LcdWriteData(uchar dat) ;void LcdInit(); #endif2. 建立LCD.C函数#includeLCD.h/包含自建立库文件void Lcd1602_Delay1ms(uint c) /延时函数 uchar a,b; for (; c0; c-) for (b=199;bb-) for(a=1;aa-); void LcdWriteCom(uchar com) LCD1602_E = 0; LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_DATAPINS
7、 = com; Lcd1602_Delay1ms(1); LCD1602_E = 1; Lcd1602_Delay1ms(5); LCD1602_DATAPINS = com 4;void LcdWriteData(uchar dat) LCD1602_RS = 1; LCD1602_DATAPINS = dat; LCD1602_DATAPINS = dat void LcdInit() /初始化 LcdWriteCom(0x32); LcdWriteCom(0x28); LcdWriteCom(0x0c); LcdWriteCom(0x06); LcdWriteCom(0x01); Lcd
8、WriteCom(0x80);3. 建立DHT11.H库文件#ifndef _DHT11_H_#define _DHT11_H_#include sbit DHT_DATA = P10;bit DHT_Start();bit DHT_ByteRead(unsigned char *dat);4. 建立DHT11.C文件DHT11.hvoid delay_ms(unsigned char x) unsigned char a; while(x-) for(a=0;a114;a+);void delay_30us(void) for(a=12;void delay_40us(void) unsig
9、ned char a,b; for(b=3; for(a=4;bit DHT_Start() unsigned char m=0; DHT_DATA=1; DHT_DATA=0; delay_ms(20); delay_40us(); if(DHT_DATA=1) return 0; else while(DHT_DATA=0)&(m200)m+; return 1; bit DHT_ByteRead(unsigned char *dat) unsigned char temp=0; unsigned char x,y; unsigned char m=0; unsigned char n=0
10、; unsigned char mask=0x01; unsigned char sum=0; for(y=0;y=1) while(DHT_DATA=0&m200)m+; delay_30us(); if(DHT_DATA) temp|=mask; else temp&=(mask); while(DHT_DATA=1&n200)n+; *(dat+y)=temp; temp=0; for(x=0;x4;x+) sum+=*(dat+x); if(sum&=0xff)=*(dat+4) return 1;5. 建立主函数main.c文件sbit beep=P10;/sbit BG=P24;s
11、bit K1=P11;sbit K2=P12;sbit K3=P13;sbit K4=P14;sbit K5=P15;/sbit beep=P20;uchar code table0=H:;uchar code table1=T:uchar code table2=%uchar code table3=Cuchar code table_1=2016-06-03uchar code table_2=16:00:00 5uchar DHT5;uchar tmp,i,j,k;uchar count,shi,fen,miao,month,day,week,year;uchar K1num,K2num
12、,K3num;bit flag_1s=1;void Delay10ms(unsigned int x);void Keyscan();void Keyscan2();void Wtimer(uchar ad,uchar dat);void main() LcdInit(); BG = 1; beep; TMOD = 0X01; TH0 = (65536 - 50000)/256; /*11.0592MHz 46080*/ TL0 = (65536 - 50000)%256; EA = 1; ET0 = 1; TR0 = 1; LcdWriteCom(0X86); for (j = 0;j 10
13、;j+) LcdWriteData(table_1j); LcdWriteCom(0Xc6); LcdWriteData(table_2j); while(1) Keyscan(); Keyscan2(); if(flag_1s) flag_1s=0; DHT_Start(); tmp=DHT_ByteRead(&DHT); /* LcdWriteCom(0x80); for(i=0;i2;i+) LcdWriteData(table0i); LcdWriteData(DHT0/10+0); LcdWriteData(DHT0%10+ LcdWriteData(table20); LcdWri
14、teCom(0xC0); LcdWriteData(table1i); LcdWriteData(DHT2/10+ LcdWriteData(DHT2%10+ LcdWriteData(table30); /LcdWriteCom(0x07); /void Delay10ms(unsigned int x) unsigned int t; while(x-) for(t=0;t7) week=1; if (31 = day) day = 1; month+; if (12 = month) month = 1; year+; Wtimer(6-0x40+2,year); Wtimer(6-0x
15、40+5,month); Wtimer(6-0x40+8,day); Wtimer(6,shi); Wtimer(9,fen); Wtimer(12,miao);void Keyscan() K1 = 1; K2 = 1; K3 = 1; if (0 = K1) Delay10ms(5); K1num+; while (!K1); if (1 = K1num) TR0 = 0; LcdWriteCom(0XC0+13); LcdWriteCom(0X0F); if (2 = K1num) LcdWriteCom(0XC0+10); if (3 = K1num) LcdWriteCom(0XC0
16、+7); if (4 = K1num) LcdWriteCom(0x89); if (5 = K1num) LcdWriteCom(0x8C); if (6 = K1num) LcdWriteCom(0x8F); if (7 = K1num) TR0 = 1; K1num = 0; LcdWriteCom(0x0c); if (0 != K1num) if (0 = K2) Delay10ms(5); while (!K2); if(1 = K1num) miao+; if(60 = miao) miao = 0; LcdWriteCom(0xc0+12); Wtimer(12,miao);
17、LcdWriteCom(0xc0+13); if(2 = K1num) fen+; if(60 = fen) fen = 0; LcdWriteCom(0xc0+9); Wtimer(9,fen); LcdWriteCom(0xc0+10); if(3 = K1num) shi+; if(24 = shi) shi = 0; LcdWriteCom(0xc0+6); Wtimer(6,shi); LcdWriteCom(0xc0+7); if(4 = K1num) year+; if(30 = year) year = 16; LcdWriteCom(0x88); Wtimer(0x08-0x
18、40,year); LcdWriteCom(0x89); if(5 = K1num) month+; if(13 = month) month = 1; LcdWriteCom(0x8B); Wtimer(0x0B-0x40,month); LcdWriteCom(0x8C); if(6 = K1num) day+; if(day31) day = 1; LcdWriteCom(0x8E); Wtimer(0x0E-0x40,day); LcdWriteCom(0x8F); if (0 = K3)K3); miao-; if(255 = miao) miao = 59; LcdWriteCom(0xc0+10+2); LcdWriteCom(0xc0+11+2); if(2 = K1num) fen-; if(255 = fen) fen = 59; if(3 = K1num) shi-; if(255 = shi) shi = 23; year-; if(255 = year) month-; if(255 = month) month = 12; day-; if(day1) day = 31;void Wtimer(uchar ad,uchar
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1