基于at89s52单片机的温湿度检测仪-毕业设计(编辑修改稿)内容摘要:
机时或断电的情况下温度上下限设定的值会被保存用户不必再重新修改,若当前温湿度超过了用户设定的上下限值报警装置会自动报警。 掉电存储芯片我采用了AT24C01,报警装置选用三极管驱动蜂鸣器报警,具体电路如下图所示: AT24C02支持IC,总线数据传送协议IC,总线协议规定任何将数据传送到总线的器件作为发送器。 任何从总线接收数据的器件为接收器。 数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。 主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式,通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上。 表2 管脚描述 管脚名称 功能 A0 A1 A2 器件地址选择 SDA 串行数据/地址 SCL 串行时钟 WP 写保护 Vcc +~ 工作电压 Vss 地 SCL 串行时钟 AT24C02串行时钟输入管脚用于产生器件所有数据发送或接收的时钟,这是一个输入管脚。 SDA 串行数据/地址 AT24C02 双向串行数据/地址管脚用于器件所有数据的发送或接收,SDA 是一个开漏输出管脚,可与其它开漏输出或集电极开路输出进行线或(wireOR)。 A0、AA2 器件地址输入端 这些输入脚用于多个器件级联时设置器件地址,当这些脚悬空时默认值为0。 当使用AT24C02 时最大可级联8个器件。 如果只有一个AT24C02被总线寻址,这三个地址输入脚(A0、AA2 )可悬空或连接到Vss,如果只有一个AT24C02被总线寻址这三个地址输入脚(A0、AA2 )必须连接到Vss。 WP 写保护 如果WP管脚连接到Vcc,所有的内容都被写保护只能读。 当WP管脚连接到Vss 或悬空允许器件进行正常的读/写操作第2章 温湿度检测仪的软件设计167。 主程序模块设计主程序是控制和管理的核心,主要完成在系统上电后进行定时和中断图31 主程序流程图处理操作的初始化。 它的内容包括主程序的起始地址,中断服务程序的起始地址,有关内存单元及相关部件的初始化和一些子程序调用等等。 主程序设计框图如上图31。 主程序初始化的具体内容包括:时间中断的初始化、外部中断源的初始化、单片机I/O口初始化、RAM初始化、LCD初始化、对各个子程序的调用,然后对温度和湿度进行检测并将结果显示在LCD上。 初始化对单片机的工作非常重要,因为单片机经过复位以后一些状态字,寄存器的初值可能是随机分配的值也可能是全置0或置1,程序在运行过程中,程序状态字起着重要的作用,为了不影响程序的正常运行初始化是十分必要的。 167。 温湿度检测模块程序设计167。 温度检测模块程序设计1. 程序设计方案开始始初始化DS18B20,LCD读DS18B20序列号DS18B20是否存在 发送跳过RAM指令温度转换LCD显示NO2. 部分源程序如下: void init_lcd(){ write_zl(0x38)。 //开显示 write_zl(0x01)。 //清屏 write_zl(0x06)。 //整屏不移动 write_zl(0x0C)。 //不开光标 }void init_18b20(){ DQ=1。 delay(8)。 //延时 DQ=0。 delay(80)。 DQ=1。 delay(20)。 }void write_dat(uchar dat){ uchar i,k。 k=dat。 for(i=0。 i8。 i++) { DQ=0。 DQ=kamp。 0x01。 //从低位开始 delay(5)。 DQ=1。 k=1。 }delay(4)。 }int read_sj(){ uchar j,date。 for(j=0。 j8。 j++) { DQ=1。 delay(1)。 DQ=0。 date=date1。 DQ=1。 if(DQ==1) // date|=0x80。 delay(4)。 } return(date)。 } void temperaturechange(){ uint tempH,tempL。 init_18b20()。 write_dat(0xcc)。 //只对一个操作就跳过读序列号操作 write_dat(0x44)。 //启动温度转换 delay(60000)。 delay(33750)。 // init_18b20()。 write_dat(0xcc)。 write_dat(0xbe)。 //读温度寄存器 tempL=read_sj()。 //读取温度低位LSB tempH=read_sj()。 //读取温度高位MSB if(tempHamp。 0x80) //高5位是1为负数 { a=1。 tem=tempH。 tem=8。 //共16位 tem=tem|tempL。 //合并高低位数 tem=~tem+1。 tem=tem*()。 }else { a=0。 tem=((tempH*256)+tempL)*。 //转换实际温度 }}void write_temperature(uint temp) //被调用的函数必须在前{ uint bai,shi,ge。 bai=temp/100。 shi=temp%100/10。 ge=temp%10。 if(a==1) { if(shi0) {write_zl(0x80+0x40+3)。 write_sj(39。 39。 )。 write_zl(0x80+0x40+4)。 write_sj(0x30+shi)。 } else { write_zl(0x80+0x40+3)。 write_sj(0x00)。 write_zl(0x80+0x40+4)。 write_sj(39。 39。 )。 } }else { if(bai0) //若bai显示shi肯定显示 { write_zl(0x80+0x40+3)。 write_sj(0x30+bai)。 write_zl(0x80+0x40+4)。 write_sj(0x30+shi)。 } else { if(shi0) //否则判断shi是否显示{write_zl(0x80+0x40+4)。 write_sj(0x30+shi)。 }else{write_zl(0x80+0x40+4)。 write_sj(0x00)。 } write_zl(0x80+0x40+3)。 write_sj(0x00)。 }}write_zl(0x80+0x40+5)。 //个位公用总的显示write_sj(0x30+ge)。 } void sounderplay() { uint i。 for(i=0。 i1000。 i++) {sounder=~sounder。 delay(100)。 } }167。 湿度检测模块程序设计1. 程序设计方案 2. 部分源程序如下: void main() { P25=0。 P26=0。 P27=0。 EA=1。 TMOD=0x20。 ET1=1。 TR1=1。 TH1=0xff。 TL1=0xff。 shuma=0。 init_lcd()。 yejing=1。 displayyj()。 yejing=0。 while(1) { yejing=1。 shidu_set()。 yejing=0。 shuma=1。 display()。 shuma=0。 if(flag==0) { yejing=1。 sdxs()。 yejing=0。 } } }void exter() interrupt 3{P34=~P34。 } void display(){ P35=1。 _nop_()。 P35=0。 //开始AD转换 while(!P37)。 //等待Ad转换// P36=1。 //转换结束OE置高电平 数据出现在 D7D0引脚上 a=P0。 b=51。 c=a/b。 P20=1。 P21=0。 P1=tab[c]。 P17=0。 delay(1)。 P20=0。 f=a%b。 d=f/5。 P1=tab[d]。 P20=0。 P21=1。 delay(1)。 P21=0。 }167。 键盘扫描和LED显示模块程序设计167。 键盘扫描键盘是人机交换的桥梁,一个好的键盘能够让用户方便的使用仪表。 本设计的键盘就在此基础上设计的,同时也为了节约单片机的硬件资源,具体程序如下:void key_set() //按键设置{ if(button1==0) { delay2(5)。 if(button1==0) { while(button1==0)。 kk++。 flag=1。 fly=1。 switch(kk) { case 1:write_zl(0x80+10)。 write_zl(0x0f)。 //shan shuo break。 case 2:write_zl(0x80+11)。 break。 case 3:write_zl(0x80+0x40+10)。 break。 case 4:write_zl(0x80+0x40+11)。 break。 case 5:kk=0。 flag=0。 fly=0。 write_zl(0x0c)。 if(nn==1) fl=1。 if(nn==2) fl=0。 break。 } } } if(button2==0){ delay2(5)。 if(button2==0) { while(button2==0)。 switch(kk) { case 1:write_zl(0x80+10)。 if(fl==1){Ush++。 if(Ush9)Ush=3。 write_sj(0x30+Ush)。 write(12,Ush)。 } if(fl==0){Ushi++。 if(Ushi9)Ushi=1。 write_sj(0x30+Ushi)。 write(8,Ushi)。 } break。 case 2:write_zl(0x80+11)。 if(fl==1){Ug++。 if(Ug9)Ug=0。 write_sj(0x30+Ug)。 write(13,Ug)。 } if(fl==0){ Uge++。 if(Uge9)Uge=0。 write_sj(0x30+Uge)。 write(9,Uge)。 } break。 case 3:write_zl(0x80+0x40+10)。 if(fl==1){Dsh++。 if(Dsh2)Dsh=0。 write_sj(0x30+Dsh)。 write(14,Dsh)。 } if(fl==0){ Dshi++。 if(Dshi2)Dshi=0。 write_sj(0x30+Dshi)。 write(10,Dshi)。 } break。 case 4:write_zl(0x80+0x40+11)。 if(fl==1){Dg++。 if(Dg9)Dg=0。 write_sj(0x30+Dg)。 write(15,Dg)。 } if(fl==0){Dge++。 if(Dge9)Dge=0。 write_sj(0x30+Dge)。 write(11,Dge)。 } break。 } } } if(button3==0){ delay2(5)。 if(button3==0) { while(button3==0)。 switch(kk) { case 1: write_zl(0x80+10)。 if(fl==0){Ushi。 if(Ushi3)Ushi=9。 write_sj(0x30+Ushi)。 write(8,Ushi)。 } if(fl==1){Ush。 if(Ush3)Ush=9。 write_sj(0x30+Ush)。 write(12,Ush)。 } break。 case 2: write_zl(0x80+11)。 if(fl==0){Uge。 if(Uge0)Uge=9。 write_sj(0x30+Uge)。 write(9,Uge)。 } if(fl==1){Ug。 if(Ug0)Ug=9。 write_sj(0x30+Ug)。 write(13,Ug)。 } break。基于at89s52单片机的温湿度检测仪-毕业设计(编辑修改稿)
相关推荐
入口使用。 作 7 为 输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。 此外, 和 分别作定时器 /计数器 2的外部计数输入和定时器 /计数器 2的触发输入, P1口功能具体如表1 所示。 在 flash 编程和校验时, P1 口接收低 8 位地址字节。 表 1 P1口的第二种功能说明表 引脚号 第二功能 T2(定时器 /计数器 T2 的外部计数输入 ),时钟输出 T2EX(定时器
B20 的供电电源可以从数据线 单片机 按键 温度采集 水位采集 LED 显示 继电器 继电器 加热控制 上水控制 电源 攀枝花学院本科毕业设计(论文) 3 硬件设计 8 本身获得,无线外部电源,每个 DS18B20 在出厂时 ,都有唯一的一个 ROM 序列号,可以将多个 DS18B20 同时连接在一根单总线上,从而实现多点分布温度测量。 DS18B20 以其简单方便的接口,广泛应用于温度测量
FLASH 程序存储器,并且采用 CMOS 工艺,功耗低,工作速度较快。 由于需要具有较快的刷新频率,以获得较高的刷新频率,使显示稳定,所以单片机晶振选用 12MHz,既 12 具有较快的时钟频率,又方便进行计算机的通信。 显 示 驱动 电路 经过对 LED 器件的发光原理进行分析后,我们可以得到这样的结论:只 要在 LED器件上加上足够的正向电压,那么流过它的电流就会使它发光,这就是 LED
国 Keil Software 公司出品的 51 系列兼容单片机 C 语言软件开发系统,与汇编相比, C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。 用过汇编语言后再使用 C来开发,体会更加深刻。 Keil C51 软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows 界面。 另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到 Keil C51
MOSI(在系统编程用)。 MISO(在系统编程用)。 SCK(在系统编程用)。 P2 口: P2 口是一个具有内部上拉电阻的 8 位双向 I/O 口, P2 输出缓冲器能驱动 4 个 TTL 逻辑电平。 对 P2 端口写 “1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。 作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。 在访问外部程序存储器或用 16
256 字节内部 RAM 32条可编程 I/O 线 安阳师范学院 第 5 页 3个 16 位定时器 /计数器 8个中断源 UART 串行通道 低功耗空闲方式和掉电方式 通过中断终止掉电方式 看门狗定时器 双数据指针 灵活的在线编程(字节和页模式) [7] AT89S52 引脚功能与封装 图 4 是 AT89S52 引脚 图。 图 4 AT89S52 引脚图 按照功能 , AT89S52