基于单片机的温湿度控制器设计课程设计报告


    




    智仪器仪表设计调试课程设计报告


    学 院 电气信息工程学院 专业班级 测控1001
    学生姓名 学 号
    设计点(单位)_________ __I506_ _____ ___ __
    设计题目_____ __基单片机温湿度控制器设计__ _ _
    完成日期: 2013年 7月 12日

    指导教师评语 ______________________ _______________ __
    _________________________________________________________________________________________________________________________________________________________________________________________________________ __________ _

    成绩(五级记分制)______ ___ _______
    指导教师(签字)________ ________

    设计务性指标 1
    11 设计务 1
    12 性指标 1
    二设计方案 1
    三系统硬件设计 2
    31单片机系统 2
    32 湿度采集电路设计 3
    33 温度采集电路设计 4
    34 AT24C02存储电路设计 5
    36 报警电路设计 6
    37液晶模块设计 7
    四系统软件设计 8
    41 程序设计 8
    42 湿度采集子程序设计 9
    43 温度采集子程序设计 10
    44 AT24C02存储子程序设计 11
    45 液晶显示子程序设计 12
    46 键设置模式子程序设计 13
    47 报警子程序设计 14
    五 性调试分析 15
    51 调试步骤 15
    52 性分析 16
    六 心体会 16
    参考文献 18
    附录1 系统硬件电路图 19
    附录2 程序清单 20

    设计务性指标
    11 设计务
    设计基单片机温湿度控制系统求完成功:
    1 基功
    1)温度采集显示LCD湿度采集显示LCD
    2)温湿度限报警值设定温湿度限报警
    3)目标温湿度值设定
    2 扩展功
    1)实现温湿度存储调
    2)功
    112 进度求
    1布置仪表设计务方案设计(1天)
    2硬件设计制作调试(2天)
    3软件设计调试(4天)
    4综合调试(15天)
    5成果展示答辩撰写报告(15天)
    12 性指标
    1传感器:AMT1001DS18B20
    2湿度测量范围:20—90RH湿度测量精度 ≤5RH
    3温度测量范围:0℃—60℃测温误差<±1 ºC
    4湿度输出电压:0—30V
    5供电电压:475V—525V
    二设计方案
    接务首先务分析然设计方案
    温湿度监控系统硬件包括单片机系统电路温度采集电路湿度采集电路蜂鸣器电路液晶显示电路AT24C02存储电路键选择电路串行通信电路部分思路:
    1.STC12C5A16S2单片机控制部分核心元件务:
    1)AD转换通湿度传感器改变湿度值获信号采身AD转换功模拟电压信号转换数字信号
    2)处理采集AD转换数字信号温度传感器采集数字信号根换算公式计算出采集前温度值湿度值
    3)控制键操作数显示存储查询
    2 温度采集工作通温度传感器DS18B20进行湿度采集工作通湿度传感器AMT1001进行温湿度采集数字量时传送数单片机进行处理相应模拟量进行相关计算温度值湿度值
    3 采集温度湿度值通AT24C02芯片进行存储查询历史数设定采集时间间隔设计9秒采集次存储20组数
    4 液晶显示电路采JM12864LCD液晶显示器单片机获信息显示液晶显示屏
    5 蜂鸣器设计中起报警提醒作温度者湿度超设定限者限时蜂鸣器响直温湿度恢复正常
    6 键采四具体功写程序调试程中定
    部分思路确定画整系统原理图确定元件引脚便写程序时调
    三系统硬件设计
    31单片机系统
    STC12C5A60S2系统包括复位电路时钟电路复位电路电复位键复位门狗等复位方式设计采键复位方式单片机X1X2引脚间加110592MHZ晶振通20pF左右电容接单片机提供工作时钟工作电压3555V部拥4定时器2串口8路高速10位AD转换置门狗电路外部掉电检测电路等原理图图311示:

    图311 单片机系统电路
    32 湿度采集电路设计
    湿度传感器分电阻式电容式两种空气中水蒸汽吸附感湿材料元件阻抗介质常数发生变化制成湿敏元件选择湿度传感器首先应考虑方面:
    第互换性目前湿度传感器普遍存着互换性差现象型号传感器互换严重影响效果维修调试增加困难
    第二湿度传感器温度系数温漂非线性需电路加温度补偿式采单片机软件补偿温度补偿湿度传感器保证全温范围精度湿度传感器温漂曲线线性化直接影响补偿效果非线性温漂补偿出较效果采硬件温度性补偿会获真实补偿效果湿度传感器工作温度范围重参数
    第三湿度传感器供电金属氧化物陶瓷高分子聚合物氯化锂等湿敏材料施加直流电压时会导致性变化甚失效类湿度传感器必须交流电供电
    第四精度长期稳定性湿度传感器精度应达±2~±5RH达水难作计量器具湿度传感器达±2~±3RH精度较困难
    第五湿度校正般情况缺乏完善检定设备时通常简单饱盐溶液检定法测量温度
    综合方面考虑终系统采AMT1001型电阻式湿敏元件湿度测量范围2090RH该传感器具低功耗体积带温度补偿单片机校准线性输出方便成低完全互换超长信号传输距离精确校准等特点
    基AMT1001湿度采集电路图321示:

    图321 温湿度传感器采集电路
    Hot端接P11口串联10K拉电阻然接数量通P11口进入单片机进行AD转换成模拟量通计算成正确湿度值然显示液晶屏面
    33 温度采集电路设计
    温度传感器指感受温度转换成输出信号传感器传感器材料电子元器件特性分分热电阻热电偶两类测量方式分接触式温度传感器非接触式温度传感器选美国Dallas 半导体公司数字化温度传感器DS1820温度检测
    DS18B20 支持线总线接口测量温度范围55°C~+125°C10~+85°C范围精度±05°C现场温度直接线总线数字方式传输提高系统抗干扰性适合恶劣环境现场温度测量特点:
    1负压特性芯片极性接反时芯片会发热烧毁
    2转换速度快12 位分辨率时750ms温度转换数字速度更快9位分辨率时9375ms温度转换数字
    3独特单线接口方式DS18B20微处理器连接时仅需条口线实现微处理器DS18B20 双通讯
    4适应电压范围更宽寄生电源方式数线供电电压范围:30~55V
    5编程分辨率9~12位应分辨温度分00625℃0125℃025℃05℃实现高精度测温
    基DS18B20温度采集电路图331示:

    图331 温度采集电路
    数量通P10口进入单片机进行AD转换成模拟量通计算成正确温度度值然显示液晶屏面
    34 AT24C02存储电路设计
    存储器AT24C02满足系统采集温度湿度进行存储查询分析求工作电压18V~55V采二线串行接口输入引脚施密特触发器滤波抑制噪声具双数传输协议支持硬件写保护读写次数较保存时间长保存100年久AT24C02时低工作电压2K位串行点擦读存储器部组织位256字节字节8位该芯片广泛应低电压低功耗工商领域
    AT24C02操作:
    1时钟数传输:SDA引脚通常外围器件拉高SDA引脚数应SCL低时变化
    2起始命令:SCL高SDA高低必须起始命令作次读写操作命令开始
    3停止命令:SCL高SDA低高
    4应答:收组8位数EEPROM会第9时钟周期时返回应答信号
    AT24C02SDA接P37口SDA引脚实现双串行数传输该引脚开漏输出开漏输出器件开集电极器件线连接SCL接入P36口SCL输入时钟信号升数送入EEPROM器件时钟降数读出次设计温度湿度采集成功表示通P34口LED灯闪烁表示已存入芯片电路图341示:

    图341 存储器AT24C02电路

    35 键选择电路设计
    系统中需键四采独立键方式中mode键P20口相接up键P21口相接dn键P22口相接en键P32口相接
    设计中键功:显示实时温湿度值界面中up键进入修改温湿度限界面dn键进入查询历史温湿度值界面查询温湿度时en键返回修改界面mode键返回功外upen键修改限功键电路图图351示:

    图351 键电路
    36 报警电路设计
    系统中采蜂鸣器报警作系统报警检测温度湿度超设定温度湿度限者低设定温度湿度限蜂鸣器发出报警声时联合液晶界面显示出报警提示蜂鸣器报警电路图发光二极图361362示:

    图361 蜂鸣器报警电路

    图362 发光二极电路
    37液晶模块设计
    液晶显示器显著特点性稳定进行简单图形显示适需复杂图形显示功场合
    系统采液晶LCD12864液晶显示器LCD12864种具4位8位行2线3线串行种接口方式部含国标级二级简体中文字库点阵图形液晶显示模块利该模块灵活接口方式简单方便操作指令构成全中文机交互图形界面显示8×4行16×16点阵汉字完成图形显示显示分辨率128×64 置819216*16点汉字12816*8点ASCII字符集
    系统中液晶RS(CS)端接P05口RW(SID)端接P06口E(CLK)端接P07口加背光通电源液晶单片机连接液晶显示电路图361示:

    图371 液晶显示电路
    四系统软件设计
    41 程序设计
    温湿度监控系统软件部分包括温度采集子程序湿度采集子程序AD转换子程序液晶显示子程序AT24C02存储子程序程序键模式选择程序首先进行系统初始化函数赋初值液晶初始化等然while循环中调子程序实现温湿度监控功温湿度监控系统函数流程图图411示:


    图411 函数流程图
    42 湿度采集子程序设计
    AMT1001采集模拟量信号必须单片机AD转换采集模拟信号转换成电压信号通湿度值电压信号值通公式电压信号转换成湿度值转换程中需注意AMT10010RH~100RH湿度值应电压值0~3V电压计算程中直接单片机板子5V电压带进公式计算
    次数换算中AD转换器十位换算电压时采高八位低两位换算采集电压值Vd*500010245放1000倍5000d(ADC_RES&0x03)*256+ADC_RESL时电压值公式:dd1003时d湿度值湿度采集子程序流程图421示:

    图421 湿度采集模块流程图
    43 温度采集子程序设计
    DS18B20采集数字量信号单片机直接进行AD转换换算成温度DS18B20采9~12位数字值读数方式750ms完成12位数字量中9位读数方式更快更方便分采集温度限值整合成16位温度值通查表法者公式法进行换算设计采二分法通显示数函数显示液晶温度采集子程序流程图431示:

    图431 温度采集模块流程图


    44 AT24C02存储子程序设计
    调子程序采集温度值湿度值通芯片读写操作温度值湿度值存储芯片调查询函数读出存储存储器数显示液晶面AT24C02存储址范围0x000H~0x7FFH系统次存储占AT24C025址重复檫址存储情况芯片存储409数存储查询流程图图441示:

    图441 存储查询模块流程图
    45 液晶显示子程序设计
    LCD液晶显示包括文字数字显示通选择键显示页面页面进行清屏址回左角
    显示实时温湿度界面时采设定标志位方式while循环屏幕进行刷屏判断标志位进入显示页面种方式减数跳变频率够稳显示液晶显示流程图图4512示:

    图451 液晶显示模块流程图
    46 键设置模式子程序设计
    界面利键显示界面者进行界面操作界面实时温湿度显示界面温湿度限设置界面历史数查询界面报警界面中报警界面闪烁形式出现出现警报时实时显示界面交显示时进行操作键设置模式流程图图461示:

    图461 键选择模块流程图

    47 报警子程序设计
    温度者湿度超设定限值蜂鸣器发出声音果温度超限会液晶面显示报警界面温度超限度时会液晶显示报警字样会显示超高度数报警流程图图471示:

    图471 报警模块流程图
    五 性调试分析
    51 调试步骤
    调试写程序进度开始进行温湿度采集调试首先考虑温度显示位数开始显示三位数精确数点面位改四位数电温度值正常显示根周围温度变化标准数字温度计测量值设计程序显示测量值相差2度左右超误差范围便开始温度误差进行调试调试完成电显示温度误差控制1度
    次湿度测量调试讲传感器红色线接电源黑色线接黄色线接P11口软件运行调试发现正常显示数字数值错误发现传感器0RH~100RH应输出电压0~3V程序中算法修改正常显示湿度值误差允许范围
    接着设计键模式首先构思键途接着程序里面编写调试先温湿度限设置问题键设置液晶面会提示需键显示界面if语句判断键否进入步操作开始进入修改页面 修改值出现点问题修改 正常键显示
    问题存储模块调试开始结果显示历史数乱码情况试发现存储检查硬件电路发现没问题发现键模式设置问题便键方重新步步修改存储显示存储历史数
    52 性分析
    系统够实现功数实时采集显示报警控制存储
    查询测量数:实时温度值湿度值
    系统温度测温范围:0℃~100℃测温分辨率:001℃电压范围:30~55V
    湿度测量范围 20—90RH测量精度 ≤5RH输出电压 0—30V电源475V—525V温度 0—60℃
    求报警蜂鸣器发光二极系统加液晶屏显示报警显示超温度具体数值区分开温度超限湿度超限
    温度值显示分辨率001℃更准确
    存储历史查询正常系统设置9秒存储次数方便采集设置想存储间隔例十分钟需改动计时中断里面cont数值存储82k数系统存储10组数
    六 心体会
    次课程设计务实挺重前接触AD转换程序设计采集温度值湿度值显示液晶面部分较容易手然调试实现程中出现问题甚破眼睛发现起问题缘常问题里修改电测试久找出原c语言表达方式较样时候语句问题导致液晶显示出现乱码者问题说字符显示函数显示规定字数汉字者字符偶尔字会出现乱显示开始输入法问题改种输入法然问题发现出问题字单独调显示函数显示会问题
    存储编写缓慢程前没接触程序问题清楚导致调试非常复杂次送数存储器应答然会出错导致存储器正常工作前键设置标志位键标志位模式编写正确会存储数
    设计先制作硬件电路图熟悉protel 99 SE法熟悉单片机部结构特前没存储器结构液晶屏显示问题AD转换次设计中完全熟练解存储器AT24C02方法程序编写起始命令停止命令应答命令固定形式需存储象采定时器计时存储数方法较简单
    时间充足Labview熟练次设计没实现位机位机通信时间会研究位机问题




























    参考文献
    [1]姚永STC12C5A60S2系列单片机器件手册[OL]宏晶STC单片机官方网站2011
    [2]乐享电子温湿度模块AM1001AMT1001产品手册[OL] 广州乐享电子限公司2007
    [3王景景单片机原理应 [M]北京:机械工业出版社201003
    [4]张元良王建军智仪表开发技术[M]北京:机械工业出版社200910
    [5]蔡明生电子设计[M]北京:高等教育出版社2004
    [6]李东生Protel 99SE电路设计教程[M]北京:电子工业出版社20071
    [7]康华光电子技术基础(模拟部分)[M]北京:高等教育出版社200609
    附录1 系统硬件电路图




    附录2 程序清单
    #include
    #define AddWr 0xa0 器件址选择写标志
    #define AddRd 0xa1 器件址选择读标志
    #define THCO 0x15 110592MHZ晶振
    #define TLCO 0xa0 60ms
    #define uchar unsigned char
    #define uint unsigned int
    #define N 10

    *****LCD接口定义*****
    sbit SID P0^6 串行数
    sbit SCLK P0^7 串行步时钟
    sbit cs P0^5
    sbit PSBP1^5
    sbit modeP2^0
    sbit upP2^1
    sbit dnP2^2
    sbit enP3^2
    sbit Sda P3^7 串行数
    sbit Scl P3^6 串行时钟
    sbit led1P3^6 存储指示灯
    sbit p34P3^4
    sbit warmP2^5
    sbit wlightP3^5

    void change()
    void disp()
    void disp1()
    void disp2()
    void hchange()
    void tchange()
    void hs1()
    void hx1()
    void ts1()
    void tx1()
    void time0()
    void store()
    void history()

    **********汉字址表**********
    uchar code addr_tab[]{
    0x800x810x820x830x840x850x860x87第行汉字位置
    0x900x910x920x930x940x950x960x97第二行汉字位置
    0x880x890x8a0x8b0x8c0x8d0x8e0x8f第三行汉字位置
    0x980x990x9a0x9b0x9c0x9d0x9e0x9f第四行汉字位置
    }

    unsigned long hout1[]{
    1315 1358 1401 1444 1487 1531 1575 1619 1663 1707 1751
    1756 1776 1810 1852 1903 1958 2017 2079 2410 2204 2266
    2327 2386 2444 2500 2554 2606 2657 2706 2753 2799 2844
    2888 2931 2974 3016 3057 3098 3138 3178 3217 3257 3295
    3334 3372 3409 3447 3483 3519 3555
    }
    uchar xdata add[21]{0x000x050x0a0x0f0x140x190x1e0x230x280x2d0x310x360x3b0x400x450x4a0x4f0x540x590x5e0x63}


    unsigned long cntcnt2xjt_flag1
    unsigned int flag0hx5hs32ts60tx30
    unsigned int jj0cun0cont0
    uchar xdata data_1[5]nn[4]n[4]mm[4]
    uchar xdata data_2[5]data_3[5]
    ***************延时子程序************
    void delayms(uint t)
    {
    uint i
    while(t)
    {
    for(i0i<125i++)
    }
    }

    void time0() interrupt 1 计时存储采集数
    {
    TH0THCO
    TL0TLCO
    if(t_flag0)
    {
    contcont+1
    if(cont>150)6s存储次
    {
    cont0
    store()
    }
    }
    }

    void hs1()
    {
    if(hs>40) hs40
    if(hs<20) hs20
    if(up0)
    {
    delayms(250)
    if(up0)
    hshs+1
    }
    if(dn0)
    {
    delayms(250)
    if(dn0)
    hshs1 }
    }
    void hx1()
    {
    if(hx>15) hx15
    if(hx<5) hx5
    if(up0)
    {
    delayms(250)
    if(up0)
    hxhx+1
    }
    if(dn0)
    {
    delayms(250)
    if(dn0)
    hxhx1 }
    }
    void ts1()
    {
    if(ts>80) ts80
    if(ts<40) ts40
    if(up0)
    {
    delayms(250)
    if(up0)
    tsts+1
    }
    if(dn0)
    {
    delayms(250)
    if(dn0)
    tsts1 }
    }
    void tx1()
    {
    if(tx>39) tx39
    if(tx<10) tx10
    if(up0)
    {
    delayms(250)
    if(up0)
    txtx+1
    }
    if(dn0)
    {
    delayms(250)
    if(dn0)
    txtx1 }
    }

    **************AD设置***************
    unsigned int AD(unsigned long j)
    {
    unsigned long i
    P1M10x00P1M00x00
    P1M1P1M1|(1< P1M0P1M0|(1< P1ASF0x00|(1< ADC_CONTR0xe0|j 开 AD 转换电源选择AD速度
    ADC_CONTR|0x08 启动 AD 转换
    while((ADC_CONTR&0x10)0) 等 AD 转换结束
    ADC_CONTR&0xE0 ADC_FLAG 清 0
    iADC_RES*256+ADC_RESL
    return(i)
    }

    **************均滤波***********
    long d_data(unsigned int j)
    {
    unsigned long new_dat0dat0
    unsigned int k
    for(k0k dat+AD(j) 开启AD转换选择通道
    new_datdatN
    return (new_dat)
    }
    long hout()
    {
    unsigned long datdat1dat2dat3
    uint maxminmid
    datd_data(0)*50001024
    max50min0
    while(1)
    {
    mid(max+min)2
    if(dathout1[mid])
    {
    return mid*100
    break
    }
    if((maxmin)1)
    {
    dat1hout1[max]hout1[min]
    dat2(hout1[max]dat)*100
    dat3dat2dat1
    mid(max*100dat3)
    return mid
    break
    }
    if(dat else
    minmid
    }
    }

    *****************串行发送字节******************

    void SendByte(uchar Dbyte)
    { uchar i
    cs1
    for(i0i<8i++)
    { SCLK 0
    if((Dbyte< SID1
    else
    SID0
    SCLK 1
    SCLK 0
    }
    cs0
    }
    ***************送指令******************
    void Lcd_WriteCmd(uchar Cbyte )
    { delayms(1)延时
    SendByte(0xf8) 11111RW(0)RS(0)0
    SendByte(0xf0&Cbyte) 高四位
    SendByte(0xf0&(Cbyte<<4)) 低四位(先执行<<)
    }
    ***************送数***********
    void Lcd_WriteData(uchar Dbyte )
    {
    delayms(1)
    SendByte(0xfa) 11111RW(0)RS(1)0
    SendByte(0xf0&Dbyte) 高四位
    SendByte(0xf0&(Dbyte<<4)) 低四位(先执行<<)
    }
    *************初始化LCD*************
    void Lcd_Init(void)
    {
    delayms(50)
    Lcd_WriteCmd(0x30) 选择基指令集
    delayms(1)
    Lcd_WriteCmd(0x06) 选择8bit数流
    delayms(1)
    Lcd_WriteCmd(0x0c) 开显示(游标反白)
    delayms(1)
    Lcd_WriteCmd(0x01) 清显示设定址指针00H
    delayms(50)
    }
    *****************显示汉字**************
    void hanzi_Disp(uchar xuchar yuchar code *s)
    {
    Lcd_WriteCmd(addr_tab[8*x+y]) 写址
    while(*s>0)
    {
    Lcd_WriteData(*s) 写数
    s++
    }
    }
    ************温度限修改****************
    int hchanges()
    { uchar k
    for(k0k<60k++)
    { Lcd_Init()
    hanzi_Disp(02键up增)
    hanzi_Disp(12键dn减)
    hanzi_Disp(22键mode返回)
    }
    while(1)
    {
    uchar cc[2]
    cc[0]0x30+hs10
    cc[1]0x30+hs10
    hanzi_Disp(31限:)
    Lcd_WriteData(cc[0])
    Lcd_WriteData(cc[1])
    hanzi_Disp(36℃)
    hs1()
    delayms(5)
    if(mode0)
    {
    delayms(1)
    if(mode0)
    { change()flag0 break }
    }
    }
    }
    ******温度限修改********
    int hchangex()
    {
    uchar k
    for(k0k<60k++)
    { Lcd_Init()
    hanzi_Disp(02up键增)
    hanzi_Disp(12dn键减)
    hanzi_Disp(22键mode返回)
    }
    while(1)
    {
    uchar bb[2]
    bb[0]0x30+hx10
    bb[1]0x30+hx10
    hanzi_Disp(31限:)
    Lcd_WriteData(bb[0])
    Lcd_WriteData(bb[1])
    hanzi_Disp(36℃)
    hx1()
    delayms(5)
    if(mode0)
    {
    delayms(1)
    if(mode0)
    { change()flag0 break }
    }
    }
    }
    **************湿度限修改**************
    int tchanges()
    { uchar k
    for(k0k<60k++)
    { Lcd_Init()
    hanzi_Disp(02键up增)
    hanzi_Disp(12键dn减)
    hanzi_Disp(22键mode返回)
    }
    while(1)
    {
    uchar bb[2]
    bb[0]0x30+ts10
    bb[1]0x30+ts10
    hanzi_Disp(31限:)
    Lcd_WriteData(bb[0])
    Lcd_WriteData(bb[1])
    hanzi_Disp(36RH)
    ts1()
    delayms(5)
    if(mode0)
    {
    delayms(1)
    if(mode0) while(1)tchange()
    }
    if(mode0)
    {
    delayms(1)
    if(mode0)
    { change()flag0 break }
    }
    }
    }
    *************湿度限修改*************
    int tchangex()
    { uchar k
    for(k0k<60k++)
    { Lcd_Init()
    hanzi_Disp(02键up增)
    hanzi_Disp(12键dn减)
    hanzi_Disp(22键mode返回)
    }
    while(1)
    {
    uchar bb[2]
    bb[0]0x30+tx10
    bb[1]0x30+tx10
    hanzi_Disp(31限:)
    Lcd_WriteData(bb[0])
    Lcd_WriteData(bb[1])
    hanzi_Disp(36RH)
    tx1()
    if(mode0)
    {
    delayms(1)
    if(mode0)
    { change()flag0 break }
    }
    }
    }
    *****************温度限选择**************
    void hchange()
    { uchar k
    for(k0k<60k++)
    { Lcd_Init()
    hanzi_Disp(00改变温度限:)
    hanzi_Disp(10键up改变限)
    hanzi_Disp(20键dn改变限)
    hanzi_Disp(30键en返回)
    }
    while(1)
    {
    if(up0)
    {
    delayms(1)
    if(up0)
    hchanges()
    }
    if(dn0)
    {
    delayms(1)
    if(dn0)
    hchangex()
    }
    if(en0||flag0)
    {
    delayms(1)
    if(en0||flag0)
    {change()break}
    }
    }
    }
    **************湿度限选择************
    void tchange()
    {uchar k
    for(k0k<60k++)
    { Lcd_Init()
    hanzi_Disp(00改变湿度限:)
    hanzi_Disp(10键up改变限)
    hanzi_Disp(20键dn改变限)
    hanzi_Disp(30键en返回)
    }
    while(1)
    {if(up0)
    {delayms(1)
    if(up0)
    tchanges()
    }
    if(dn0)
    {delayms(1)
    if(dn0)
    tchangex()
    }
    if(en0||flag0)
    {delayms(1)
    if(en0||flag0)
    {change()break}
    }
    }
    }
    **************选择温湿度修改**************
    void change()
    {
    uchar k
    for(k0k<60k++)
    { Lcd_Init()
    hanzi_Disp(00改变温湿度限)
    hanzi_Disp(10键up改变温度)
    hanzi_Disp(20键dn改变湿度)
    hanzi_Disp(30键en返回)
    }
    while(1)
    {if(up0)
    {delayms(1)
    if(up0)
    hchange()
    }
    if(dn0)
    {
    delayms(1)
    if(dn0)
    hchange()
    }
    if(en0||flag0)
    {
    delayms(1)
    if(en0||flag0)
    {flag0break}
    }
    }
    }

    void disp1() **************实时温湿度显示(包括报警)**************
    {
    unsigned char b[4]b1[4]b2[3]
    hs1()hx1()ts1()tx1()
    cnt2d_data(1)*500010243湿度
    cnthout()温度
    if(cnt>hs*100||cntts*10||cnt2 else {warm1wlight0}
    n[0]0x30+cnt100010
    n[1]0x30+cnt1000100
    n[2]0x30+cnt10010
    n[3]0x30+cnt10
    nn[0]0x30+cnt2100010
    nn[1]0x30+cnt21000100
    nn[2]0x30+cnt210010
    nn[3]0x30+cnt210
    b1[0]0x30+hs10
    b1[1]0x30+hs10
    b1[2]0x30+ts10
    b1[3]0x30+ts10
    b[0]0x30+hx10
    b[1]0x30+hx10
    b[2]0x30+tx10
    b[3]0x30+tx10
    Lcd_Init()
    delayms(10)
    hanzi_Disp(00前温度)
    Lcd_WriteData(n[0])
    Lcd_WriteData(n[1])
    hanzi_Disp(05)
    Lcd_WriteData(n[2])
    Lcd_WriteData(n[3])
    hanzi_Disp(07℃)
    delayms(1)
    hanzi_Disp(10前湿度)
    Lcd_WriteData(nn[1])
    Lcd_WriteData(nn[2])
    hanzi_Disp(15)
    Lcd_WriteData(nn[3])
    hanzi_Disp(16RH)
    delayms(1)
    hanzi_Disp(20温限)
    Lcd_WriteData(b[0])
    Lcd_WriteData(b[1])
    hanzi_Disp(23)
    Lcd_WriteData(b1[0])
    Lcd_WriteData(b1[1])
    hanzi_Disp(25℃)
    hanzi_Disp(30湿限)
    Lcd_WriteData(b[2])
    Lcd_WriteData(b[3])
    hanzi_Disp(33)
    Lcd_WriteData(b1[2])
    Lcd_WriteData(b1[3])
    hanzi_Disp(35RH)
    if(cnt<(hs*100+1000)&&(cnt>hs*100))
    { unsigned int w1
    w1cnths*100
    b2[0]0x30+w1100
    b2[1]0x30+w110010
    b2[2]0x30+w110
    Lcd_Init()
    hanzi_Disp(12橙色警报)
    hanzi_Disp(20温度超高 )
    Lcd_WriteData(b2[0])
    hanzi_Disp(25)
    Lcd_WriteData(b2[1])
    Lcd_WriteData(b2[2])
    hanzi_Disp(27度)
    }
    delayms(5000)
    if(up0||flag1)
    {
    delayms(1)
    if(up0||flag1)
    flag1
    }
    if(dn0||flag2)
    {
    delayms(1)
    if(dn0||flag2)
    flag2
    }

    }
    **************存储器起始命令函数**************
    void Start(void)
    {
    Sda1
    Scl1
    Sda0
    }
    void Stop(void) **************存储器停止命令函数**************
    {
    Sda0
    Scl1
    Sda1
    }
    void Ack(void)
    {
    Sda0
    Scl1
    Scl0
    }
    void NoAck(void)
    {
    Sda1
    Scl1
    Scl0
    }
    void Send(uchar Data)
    {
    uchar BitCounter8 位数控制
    uchar temp 中间变量控制
    do
    {
    tempData
    Scl0
    if((temp&0x80)0x80) 果高位1
    Sda1
    else
    Sda0
    Scl1
    Scl0
    tempData<<1 RLC
    Datatemp
    BitCounter
    }while(BitCounter)
    Scl0
    }
    uchar Read(void)
    {
    uchar temp0
    uchar temp10
    uchar BitCounter8
    Sda1
    do{
    Scl0
    Scl1
    if(Sda) 果Sda1
    temptemp|0x01 temp低位置1
    else
    temptemp&0xfe 否temp 低位清0
    if(BitCounter1)
    {
    temp1temp<<1
    temptemp1
    }
    BitCounter
    }while(BitCounter)
    return(temp)
    }
    void WrToROM(uchar Data[]uchar Addressuchar Num)
    {
    uchar i
    uchar *PData
    PDataData
    for(i0i{
    Start() 发送启动信号
    Send(0xa0) 发送SLA+W
    Ack()
    Send(Address+i) 发送址
    Ack()
    Send(*(PData+i))
    Ack()
    Stop()
    delayms(250)
    led10
    }
    }
    **************读出ROM数**************
    void RdFromROM(uchar Data[]uchar Addressuchar Num)
    {
    uchar i
    uchar *PData
    PDataData
    for(i0i {
    Start()
    Send(0xa0)
    Ack()
    Send(Address+i)
    Ack()
    Start()
    Send(0xa1)
    Ack()
    *(PData+i)Read()
    Scl0
    NoAck()
    Stop()
    }
    led11
    }
    void store() 存储函数
    { p34p34
    if(cun>20) cun0
    delayms(1)
    WrToROM(nadd[cun]4) 温度值写入rom
    delayms(1)
    WrToROM(nnadd[cun+1]4) 湿度值写入rom
    delayms(1)
    cuncun+2
    }
    ****************查询历史******************
    void history()
    { uint ccmmm
    store()
    jjcun
    mmm90
    while(1)
    {

    if(mmm<0) mmm90
    if(jj>20) jj0
    mm[0]0x30+mmm1000100
    mm[1]0x30+mmm10010
    mm[2]0x30+mmm10
    RdFromROM(data_1add[jj]4)
    RdFromROM(data_3add[jj+1]4)
    delayms(1)
    for(cc0cc<60cc++)
    {
    Lcd_Init()
    hanzi_Disp(00温度:)
    Lcd_WriteData(data_1[0])
    Lcd_WriteData(data_1[1])
    hanzi_Disp(04)
    Lcd_WriteData(data_1[2])
    Lcd_WriteData(data_1[3])
    hanzi_Disp(06℃)

    hanzi_Disp(10湿度:)
    Lcd_WriteData(data_3[0])
    Lcd_WriteData(data_3[1])
    Lcd_WriteData(data_3[2])
    hanzi_Disp(14)
    Lcd_WriteData(data_3[3])
    hanzi_Disp(16RH)
    hanzi_Disp(20前)
    Lcd_WriteData(mm[0])
    Lcd_WriteData(mm[1])
    Lcd_WriteData(mm[2])
    hanzi_Disp(23秒温湿度)
    hanzi_Disp(30键en返回)
    }
    if(mode0) { delayms(1)if(mode0) {jjjj+2mmmmmm9}}
    if(en0) { delayms(1)if(en0) {flag0 break}}
    }
    }
    }
    ****************函数**************
    void main(void)
    { TMOD0x01 定时器0初始化
    TH0THCO
    TL0TLCO
    TR01
    ET01
    EA1
    PSB0
    AUXR10x04
    Lcd_Init()
    hanzi_Disp(02欢迎进入)
    hanzi_Disp(10温湿度检测系统)
    delayms(10000)
    hanzi_Disp(00姓名:魏钊)
    hanzi_Disp(10 ^_^ )
    hanzi_Disp(20专业:测控1001 )
    hanzi_Disp(30学号:2010441466 )
    delayms(10000)
    while(1)
    {
    if(mode0||flag0)
    {
    delayms(1)
    if(mode0||flag0)
    {
    t_flag0
    flag0
    EA1}
    }
    if(up0||flag1)
    {
    delayms(1)
    if(up0||flag1)
    {
    t_flag1
    flag1
    EA0}
    }
    if(flag2||dn0)
    {
    delayms(1)
    if(flag2||dn0)
    {
    t_flag1
    flag2
    EA0}
    }
    if(en0||t_flag0)
    {
    delayms(1)
    if(en0||t_flag0)
    t_flag0
    EA1
    }
    switch(flag)
    {
    case 0 disp1() break
    case 1 change() break
    case 2 history() break
    defaultbreak

    }
    }
    }
    重庆科技学院
    文档香网(httpswwwxiangdangnet)户传

    《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
    该内容是文档的文本内容,更好的格式请下载文档

    下载文档到电脑,查找使用更方便

    文档的实际排版效果,会与网站的显示效果略有不同!!

    需要 3 香币 [ 分享文档获得香币 ]

    下载文档

    相关文档

    单片机课程设计作息时间控制器的设计报告

    XX大学单片机课程设计报告作息时间控制器设计姓 名: 学 号: 专业班级: 自动化班 指...

    3年前   
    561    0

    单片机课程设计报告基于单片机的温控系统

    职业学院机械与电子工程学院基于单片机温控系统课程设计报告班 级 电信班 学生姓名 学 号 指导教...

    3年前   
    993    0

    基于51单片机的定时闹钟设计单片机课程设计

    单片机 课 程 设 计 报 告 院系: 信息工程学院 ...

    2年前   
    492    0

    基于单片机的室内温湿度

    本文采用STC89C52单片机、DHT11传感器、1602LCD显示屏和继电器控制等模块,完成温湿度测试和控制任务,其关键部分为(1)温湿度传感器DHT11实时测试温度、湿度。(2)判断采集的数...

    3年前   
    686    0

    基于单片机温湿度测量系统的研究与设计

    温湿度的测量应用范围是很广的,对温湿度测量系统的研究也具有深远意义,本课题针对国内外对温湿度测量系统的研究与发展状况,分析了目前温湿度测量系统存在的主要问题,设计了一种基于单片机的温湿度测量系统...

    2年前   
    393    0

    基于单片机温室大棚温湿度采集系统设计

    温度和湿度是在农业生产中常见的和基本的参数之一,它们会大幅度影响作物产量和品质,现代科学和技术在提高农业生产力方面发挥着重要作用,以确定温度和湿度,实时显示、储存和监测。国内生产,产品质量与节能...

    4年前   
    567    0

    基于单片机的鱼缸控制器设计毕业设计论文

    基于单片机的鱼缸控制器设计 摘 要 本文是基于单片机的鱼缸控制器的设计,目前市场上有各种各样的观赏类的鱼缸,进入了不同的应用场合,如家庭、宾馆和商场等等,但现有的鱼缸一般需要人为的...

    5年前   
    2464    0

    基于单片机的彩灯控制器设计毕业设计

     题目: 基于单片机的节日彩灯控制器的设计 作 者 姓 名: 学 号: ...

    3年前   
    562    0

    单片机课程设计报告

    1 方案设计与论证1.1 硬件总体设计设计并制作一个基于单片机的数字电压表的电路其结构框图如图 1-1 所示: 图1-1 硬件结构框图(1)单片机最小系统电路部分 (2)数码管显示部分(3) ...

    5年前   
    1667    0

    基于FPGA的多路彩灯控制器的设计课程设计

     FPGA课程设计报告 学院: 信息工程学院班 级: 信息级班姓 名: 学 号: 完成时间: 2015年X月X日 评阅意见: 题目...

    3年前   
    526    0

    基于单片机的土壤温湿度检测计设计毕业设计

    基于单片机的土壤温湿度检测计设计毕业设计 目 录 1 绪论 1 1.1选题背景及意义 1 1.2设计任务与要求 1 2 总体方案设计 2 3单元模块设计 5 3.1各单元...

    5年前   
    1817    0

    基于单片机的拔河游戏机设计课程设计

    ××大学××学院××课程设计基于单片机的拔河游戏机设计学生姓名学 号所 在 系专业名称班 级指导教师成 绩 ...

    3年前   
    585    0

    基于单片机的交通灯显示系统的设计与研究课程设计

     XX学院课程设计课 程 单片机课程设计 题 目 交通灯系统 院 系 机电系 ...

    3年前   
    901    0

    基于单片机的数字温度计设计课程设计

    基于单片机的数字温度计设计引言随着现代信息技术的飞速发展和传统工业改造的逐步实现.能够独立工作的温度检测和显示系统应用于诸多领域。传统的温度检测以热敏电阻为温度敏感元件。热敏电阻的成本低,但需...

    3年前   
    933    0

    基于51单片机数字温度计设计课程设计

    课 题: 基于51单片机数字温度计设计专 业: 电子信息工程班 级: 班学 号: 姓 名: ...

    3年前   
    974    0

    基于单片机的直流稳压电源设计课程设计

    课程设计论文 设计题目:单片机控制直流稳压电源设计学校:院系:专业:年级:2013级姓名学号: 指导教师 ...

    4年前   
    901    0

    基于单片机的“叮咚”门铃设计课程设计

    基于单片机的“叮咚”门铃设计摘要:本文设计了一种基于单片机的“叮咚”门铃,主要有键盘,音频功率放大器LM386,AT89S51单片机,扬声器等构成,通过单片机定时/计数器t0来产生700Hz和...

    3年前   
    753    0

    基于单片机的遥控窗帘课程设计

    《单片机应用与仿真训练》设计报告基于单片机的遥控窗帘设计姓 名: 学 号: ...

    1年前   
    292    0

    基于单片机的自动节水灌溉系统课程设计

     数理与信息工程学院应用系统设计 题 目: 基于单片机的自动节水灌溉系统 专 业: 计算机科学与技术(专升本) 班 级: ...

    3年前   
    609    0

    基于单片机的数字温度计课程设计

    摘要 本文提出了关于MCS-51系列单片机的数字温度计的制作电路方法和编程思想。设计一直灌输着电子电路制作软硬结合,以硬件为主的理念。采用模块化的设计思想。硬件模块分为温度的感应模块、时钟...

    3年前   
    782    0

    文档贡献者

    文***品

    贡献于2023-01-30

    下载需要 3 香币 [香币充值 ]
    亲,您也可以通过 分享原创文档 来获得香币奖励!
    下载文档

    该用户的其他文档