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


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


















    目录


    摘 I
    1系统方案设计组成 I
    2系统设计 1
    21温度传感器工作原理单片机连接 1
    22 DS1302原理脚 2
    23单片机报警电路 3
    24显示电路 3
    241基操作时序 4
    3系统软件设计 4




    课题介绍基AT89C51单片机DS18B20数字温度传感器温度测量系统该系统利AT89C51单片机分采集温度点温度实现温度显示报警等功DS1302时钟芯片液晶显示前时间日期直观实AT89C51单片机控制芯片采数字温度传感器DS18B20实现温度检测测量精度达05℃该系统采1602显示模块形象直观显示测出温度值基AT89C51单片机单总线温度测控系统具硬件组成简单读数方便精度高测温范围广等特点实际工程中广泛应
    关键词:温度传感器单片机温度控制DS1302 LCD


    1系统方案设计组成
    该方案AT89C51单片机作控制核心智温度传感器DS18B20温度测量元件点温度进行检测设置温度限超温度值报警DS1302时钟芯片液晶显示前时间日期显示电路采1602液晶模块显示三极电阻蜂鸣器组成报警电路钮处理模块等具温度控制实时时钟报警等功

    89C52CPU

    控制模块
    键处理模块
    温度采集模块

    报警电路


    LCD显示模块
    DS1302时钟
    采集模块




    图21温度控制系统方案框


























    2系统设计
    21温度传感器工作原理单片机连接
    温度传感器单总线(1Wire)单片机P2.7连接P2.7单片机高位址线P2端口带部拉电阻8位双I/O输出缓级驱动(吸收输出电流)4TTL逻辑门电路该端口写1通部拉电阻端口拉高电时作输入口部存拉电阻某引脚外部信号拉低时会输出电流
    1示:DS18B20单片机接口电路非常简单DS18B20三引脚接接电源数字输入输出引脚接单片机IO口电源数字输入输出脚间需接47K电阻

    图1温度传感器单片机连接图
    DS18B20工作原理
    DS18B20工作程
    a.初始化:
    DS18B20数交换初始化序列开始机发出复位脉DS18B20发出应答脉构成DS18B20发出响应机应答脉时机表明已处总线准备工作
    b ROM命令:
    ROM命令通器件64bitROM码机指定某特定器件(果器件挂总线)进行通信DS18B20ROM表36示ROM命令8 bit长
    c 功命令:
    机通功命令DS18B20进行读写Scratchpad存储器者启动温度转换 DS18B20信号方式
    DS18B20采严格单总线通信协议保证数完整性该协议定义种信号类型:复位脉应答脉写0写1读0读1应答脉信号机发出步信号总线传输数命令字节低位前
    a初始化序列:复位脉应答脉
    b读写时序
    写时序期间机DS18B20写入指令读时序期间机读入DS18B20指令时序总线传输位数读写时序图34示
    写时序
    存两种写时序:写1写0机写1时序DS18B20写入逻辑1写0时序DS18B20写入逻辑0写时序少需60µs两次写时序间少需1µs恢复时间两种写时序均机拉低总线开始
    读时序
    DS18B20机发出读时序时机传送数机发出读数命令必须马产生读时序便DS18B20够传送数读时序少60µs两次独立读时序间少需1µs恢复时间
    22 DS1302原理脚
    1DS1302引脚排列图

    2 DS1302控制字节
      DS1302 控制字图示

    控制字节高效位(位7)必须逻辑1果0数写入DS1302中位6果0表示存取日历时钟数1表示存取RAM数位5位1指示操作单元址低效位(位0)0表示进行写操作1表示进行读操作控制字节总低位开始输出 
     3数输入输出(IO)
      控制指令字输入SCLK时钟升时数写入DS1302数输入低位位0开始样紧8位控制指令字SCLK脉降读出DS1302数读出数时低位0位高位7
      

    23单片机报警电路
    系统中报警电路三极蜂鸣器发光二极限流电阻组成单片机P23端口连接温度超预设高温度低温度时蜂鸣器发出响声

    报警电路

    24显示电路
    采技术成熟价格便宜1602液晶显示器做输出显示次设计1602液晶显示器5V电压驱动带背光显示两行行16字符显示汉字置128字符ASCII字符集字库行接口串行接口
    241基操作时序
    读状态 输入:RSL RWHEH 输出:D0~D7状态字
    读数 输入:RSH RWHEH 输出:
    写指令 输入:RSL RWLD0~D7指令码E高脉 输出:D0~D7数
    写数 输入:RSH RWL D0~D7数E高脉 输出:

    25 键处理模块
    键处理调整前准确时间日期调整需监控温度限达温度限蜂鸣器报警图示键分布图

    硬件安装两继电器温度报警时触发继电器控制外围电路

    3系统软件设计
    次软件采模块化编程程序中函数定义等代码进行分类实际两文件Ch文件名通常相h文件声明定义C文件函数实现采模块化编程处:
    1 整工程脉络清晰代码规划合理
    2 程序模块化利代码积累重复快速建立工程
    3 程序模块编译未LIB库文件利源代码保密
    31程序流程图

    _MAIN_H_

    #ifndef _MAIN_H_
    #define _MAIN_H_

    #include reg52h
    #include INTRINSH
    #include STRINGH
    #include Delayh
    #include Lcdh
    #include DS1302h
    #include DS18B20h
    #include Keyh
    #include DispMeauh

    #define uchar unsigned char
    #define uint unsigned int
    extern char DispFlag
    extern uint LTemper
    extern uint HTemper
    extern uchar Temper[10]
    extern uchar Time[10]
    extern uchar Date[10]

    #endif



    _MAIN_C_

    #include Mainh

    char DispFlag 允许显示标志 0允许 1允许
    uchar Temper[10] 保存温度数
    uchar Time[10] 保存时分秒数
    uchar Date[10] 保存年月日数

    uint LTemper2000
    uint HTemper5000
    uchar TimeStatus0

    sbit bellP2^3
    sbit led1P2^4
    sbit led2P2^5
    sbit led3P2^6

    void WarnDisp(uint tpTmp)
    {
    if(tpTmp {
    led11
    led20
    led30
    bell0
    }
    else if(tpTmp>HTemper)
    {
    led10
    led20
    led31
    bell0
    }
    else
    {
    led10
    led21
    led30
    bell1
    }
    }
    void main()
    {
    uint Tmp0
    Init1302() 初始化 DS1302
    Int_lcd() 初始化 lcd

    ET01 时间中断0 允许中断
    EA1 中断 允许
    TMOD0x01 时间0 记数
    TH0(6553615536)256
    TL0(6553615536)256
    TR01 允许记数0记数

    DispFlag0 允许显示
    led10
    led20
    led30
    bell1
    Tmpreadtmp() 取温度
    delay(40000)
    Tmpreadtmp() 取温度
    delay(40000)
    TimeStatus 0
    while(1)
    {
    if(DispFlag0)
    {
    if(TimeStatus0) 时间调整状态
    {
    DealTime(Time Date) 获取需显示时间数
    }


    DealKey() 键处理

    Tmpreadtmp() 取温度
    WarnDisp(Tmp) 警报指示

    DealTemper(Tmp Temper) 温度值转化成显示数
    DispFlag1 允许显示
    }
    }
    }
    void t(void) interrupt 1 using 0
    {
    TH0(6553615530)256
    TL0(6553615530)256
    if(DispFlag1)
    {
    ScrDisp(0x80Date) 显示 日期(位置数)
    ScrDisp(0xc0Time) 显示 时间
    ScrDisp(0x89Temper) 显示 温度
    DispFlag0
    }
    }

    32 子程序流程图
    DS1302

    _DS1302_H_

    #ifndef _DS1302_H_
    #define _DS1302_H_

    #include Mainh
    void v_WTInputByte(unsigned char ucDa)
    unsigned char uc_RTOutputByte(void)
    void v_W1302(unsigned char ucAddr unsigned char ucDa)
    unsigned char uc_R1302(unsigned char ucAddr)
    void Init1302(void)
    void DealTime(unsigned char *tpTime unsigned char *tpDate)
    void SaveDate(unsigned char *tpDate)
    void SaveTime(unsigned char *tpTime)

    #endif

    _DS1302_C_

    #include Mainh

    sbit T_RST P2^0 *实时时钟复位线引脚 *
    sbit T_IO P2^1 *实时时钟数线引脚 *
    sbit T_CLK P2^2 *实时时钟时钟线引脚 *

    sbit ACC0ACC^0
    sbit ACC7ACC^7


    ********************************************************************
    *
    * 名称 v_RTInputByte
    * 说明
    * 功 DS1302写入1Byte数
    * 调
    * 输入 ucDa 写入数
    * 返回值
    ***********************************************
    void v_WTInputByte(uchar ucDa)
    {
    uchar i
    ACC ucDa
    for(i8 i>0 i)
    {
    T_IO ACC0 *相汇编中 RRC
    T_CLK 1
    T_CLK 0
    ACC ACC>> 1
    }
    }
    ***********************************************
    *
    * 名称 uchar uc_RTOutputByte
    * 说明
    * 功 DS1302读取1Byte数
    * 调
    * 输入
    * 返回值 ACC
    ***********************************************
    uchar uc_RTOutputByte(void)
    {
    uchar i
    for(i8 i>0 i)
    {
    ACC ACC>>1 *相汇编中 RRC
    ACC7 T_IO
    T_CLK 1
    T_CLK 0
    }
    return(ACC)
    }
    ***********************************************
    *
    * 名称 v_W1302
    * 说明 先写址写命令数
    * 功 DS1302写入数
    * 调 v_RTInputByte()
    * 输入 ucAddr DS1302址 ucDa 写数
    * 返回值
    ***********************************************
    void v_W1302(uchar ucAddr uchar ucDa)
    {
    T_RST 0
    T_CLK 0
    T_RST 1
    v_WTInputByte(ucAddr) * 址命令 *
    v_WTInputByte(ucDa) * 写1Byte数*
    T_CLK 1
    T_RST 0
    }
    *********************************************** 名称 uc_R1302
    * 说明 先写址读命令数
    * 功 读取DS1302某址数
    * 调 v_RTInputByte() uc_RTOutputByte()
    * 输入 ucAddr DS1302址
    * 返回值 ucDa 读取数
    *********************************************
    uchar uc_R1302(uchar ucAddr)
    {
    uchar ucDa
    T_RST 0
    T_CLK 0
    T_RST 1
    v_WTInputByte(ucAddr) * 址命令 *
    ucDa uc_RTOutputByte() * 读1Byte数 *
    T_CLK 1
    T_RST 0
    return(ucDa)
    }

    ***********************************************
    * 名称 Init1302
    * 说明
    * 功 初始化DS1302
    * 调
    * 输入
    * 返回值
    ***********************************************
    void Init1302(void)
    {
    v_W1302(0x8e0x00) 控制写入WP0
    v_W1302(0x900xa5)
    }
    +48转换ACSII 码
    void DealTime(uchar *tpTime uchar *tpDate)
    {
    uchar d 时间处理

    tpTime[8] 0x00 数组结束符 '\0'
    tpDate[8] 0x00 数组结束符 '\0'

    duc_R1302(0x81) 读取时间 秒
    tpTime[6](d>>4&0x0f)+48 处理十秒
    tpTime[7](d&0x0f)+48 处理 秒

    duc_R1302(0x83) 读取时间 秒
    tpTime[3](d>>4&0x0f)+48 处理十分
    tpTime[4](d&0x0f)+48 处理 分

    duc_R1302(0x85) 读取 时
    tpTime[0](d>>4&0x0f)+48 处理十时
    tpTime[1](d&0x0f)+48 处理 时

    duc_R1302(0x8D) 读取 年
    tpDate[0](d>>4&0x0f)+48 处理十年
    tpDate[1](d&0x0f)+48 处理 年

    duc_R1302(0x89) 读取 月
    tpDate[3](d>>4&0x0f)+48 处理十月
    tpDate[4](d&0x0f)+48 处理 月

    duc_R1302(0x87) 读取 日
    tpDate[6](d>>4&0x0f)+48 处理十日
    tpDate[7](d&0x0f)+48 处理 日
    }

    void SaveDate(uchar *tpDate)
    {
    uchar ymd

    y (((tpDate[0]48)<<4)&0xf0)+(tpDate[1]48)
    m (((tpDate[3]48)<<4)&0xf0)+(tpDate[4]48)
    d (((tpDate[6]48)<<4)&0xf0)+(tpDate[7]48)

    v_W1302(0x8e0x00) 控制写入WP0
    v_W1302(0x900xa5)

    v_W1302(0x86d) 日
    v_W1302(0x88m) 月
    v_W1302(0x8cy) 年
    }

    void SaveTime(uchar *tpTime)
    {
    uchar hms

    h (((tpTime[0]48)<<4)&0xf0)+(tpTime[1]48)
    m (((tpTime[3]48)<<4)&0xf0)+(tpTime[4]48)
    s (((tpTime[6]48)<<4)&0xf0)+(tpTime[7]48)

    v_W1302(0x8e0x00) 控制写入WP0
    v_W1302(0x900xa5)

    v_W1302(0x80s) 秒
    v_W1302(0x82m) 分
    v_W1302(0x84h) 时

    delay(100)
    }

    二DS18B20

    DS18B20读取温度程
    _DS18B20_H_

    #define _DS18B20_H_

    void reset(void)
    unsigned char readbyte(void)
    void writebyte(unsigned char indata)
    unsigned int readtmp(void)
    void DealTemper(unsigned int tpTemper unsigned char *tpStr)

    #endif

    _DS18B20_C

    #include Mainh
    sbit DQP3^7

    ******************复位********************
    void reset(void)
    { uchar flag0
    DQ1
    delay_10us(1)
    DQ0
    delay_10us(70) 少延时22us
    DQ1
    delay_10us(8)
    flagDQ
    delay_10us(15)
    }

    ****************读字节*********************
    uchar readbyte(void)
    {
    uchar ioutdata0
    for(i0i<8i++)
    {
    DQ1
    delay_10us(1)
    DQ0
    outdata>>1 必须15us读取
    DQ1
    if(DQ)
    outdata|0x80
    delay_10us(4)
    }
    return(outdata)
    }

    *****************写字节********************
    void writebyte(uchar indata)
    {
    uchar i
    for(i0i<8i++)
    {
    DQ1
    delay_10us(1)
    DQ0
    DQindata&0x01 必须15us写入
    delay_10us(5)
    DQ1
    indata>>1
    }
    delay_10us(4)
    }

    ****************读温度***********************
    uint readtmp(void)
    {
    uint tmp
    uchar tlthtemptemp1
    reset()
    writebyte(0xcc) 跳序列号
    writebyte(0x44) 启动温度转换
    reset()
    writebyte(0xCC)
    writebyte(0xBE) 读9寄存器前两温度
    tlreadbyte() 低位
    threadbyte() 高位
    temptl&0x0f 取低四位
    temptemp*625 数部分
    tl>>4
    th<<4
    temp1tl|th 整数部分
    tmptemp1*100+temp 四位数高两位整数低两位数
    delay(200)
    return (tmp)
    }

    *******************************************
    功 温度数处理
    输入
    uint tpTempe 温度值 高字节温度整位低字节温度数位
    uchar *tpStr 整形数转化显示数输出
    uchar *tpStr 整形数转化显示数返回
    返回
    ***********************************************
    void DealTemper(uint tpTemper uchar *tpStr)
    {
    tpStr[7] 0x00 数组结束符 '\0'
    tpStr[6] 'C'
    tpStr[5] 0xdf '度' 符号

    tpStr[4]tpTemper10+48 取位 数位第二位
    tpTemper10
    tpStr[3]tpTemper10+48 取十位 数位第位
    tpStr[2]'' 数点
    tpTemper10
    tpStr[1]tpTemper10+48 取百位 位
    tpStr[0]tpTemper10+48 取千位 十位
    }

    三LCD1602
    _LCD_H_

    #ifndef _LCD_H_
    #define _LCD_H_

    void Int_lcd(void) 初始化
    unsigned char lcd_r_start(void)
    void lcd_w_cmd(unsigned char com)
    void lcd_w_dat(unsigned char dat)

    #endif

    _LCD_C_

    #include Mainh

    sbit RSP3^4
    sbit RWP3^5
    sbit EP3^6

    void Int_lcd(void)
    {
    lcd_w_cmd(0x3c) 设置工作方式
    lcd_w_cmd(0x0c) 设置光标
    lcd_w_cmd(0x01) 设置清屏
    lcd_w_cmd(0x06) 设置输入方式
    lcd_w_cmd(0x00) 设置初始显示位置
    }

    unsigned char lcd_r_start(void)
    {
    unsigned char s
    RW1 RW1RS0读lcd状态
    delay1()
    RS0
    delay1()
    E1 E端时序 低高低
    delay1()
    sP1 lcd数口读状态
    E0
    delay1()
    RW0
    delay1()
    return(s) 返回读取lcd状态字
    }

    void lcd_w_cmd(unsigned char com)
    {
    unsigned char i
    do 查lcd忙操作
    {
    ilcd_r_start() 调读状态字函数
    ii&0x80 操作屏蔽掉低7位
    delay(2)
    }
    while(i0) lcd忙继续查询否退出循环
    RW0
    delay1()
    RS0 RW1RS0写lcd命令字
    delay1()
    E1 E端时序
    delay1()
    P1com com中命令字写入lcd数口
    delay1()
    E0
    delay1()
    RW1
    delay(255)
    }

    void lcd_w_dat(unsigned char dat)
    {
    unsigned char i
    do 查忙操作
    {
    ilcd_r_start() 调读状态字函数
    ii&0x80 操作屏蔽掉低7位
    delay(2)
    }
    while(i0)
    RW0
    delay1()
    RS1 RW1RS0写lcd命令字
    delay1()
    E1 E端时序
    delay1()
    P1dat dat中命令字写入lcd数口
    delay1()
    E0
    delay1()
    RW1
    delay(255)
    }




    四.延时函数

    _DELAY_H

    #ifndef _DELAY_H_
    #define _DELAY_H_

    void delay_10us(unsigned int time)
    void delay(unsigned int t)
    void delay1(void)

    #endif



    _DELAY_C

    #include Mainh

    ******************10us延时*****************************
    名称: delay_10us
    功: 延时10us
    127us
    237us
    345us
    456us
    566us
    676us
    786us
    10115us
    1001ms
    **********************************************
    }
    void delay_10us(unsigned int time)


    {
    while(time)
    }

    void delay(unsigned int t)
    {
    unsigned int n
    n0
    while(n return

    void delay1(void)
    {
    _nop_()
    _nop_()
    _nop_()
    }

    五.键控制

    _KEY_H_

    #ifndef _KEY_H_
    #define _KEY_H_

    unsigned char DealKey(void)

    #endif





    _KEY_C_

    #include Mainh

    sbit key1P2^7 调整时间 时 年
    sbit key2P3^0 调整时间 分 月
    sbit key3P3^1 保存时间 秒 日
    sbit key4P3^2 确定保存进入菜单选择模式
    sbit key5P3^3 取消

    uchar TimeStatus 0

    uchar GetKey(void)
    {
    if (0key1)
    {
    if(TimeStatus 0) return 0
    delay(100)
    if (0key1)
    {
    while(1)
    {
    if(1key1)
    {
    delay(50)
    if(1key1) break
    }
    }
    return 1
    }
    }
    else if (0key2)
    {
    if(TimeStatus 0) return 0
    delay(100)
    if (0key2)
    {
    while(1)
    {
    if(1key2)
    {
    delay(50)
    if(1key2) break
    }
    }
    return 2
    }
    }
    else if (0key3)
    {
    if(TimeStatus 0) return 0
    delay(100)
    if (0key3)
    {
    while(1)
    {
    if(1key3)
    {
    delay(50)
    if(1key3) break
    }
    }
    return 3
    }
    }
    else if (0key4)
    {
    delay(100)
    if (0key4)
    {
    while(1)
    {
    if(1key4)
    {
    delay(50)
    if(1key4) break
    }
    }
    return 4
    }
    }
    else if (0key5)
    {
    delay(100)
    if (0key5)
    {
    while(1)
    {
    if(1key5)
    {
    delay(50)
    if(1key5) break
    }
    }
    return 5
    }
    }

    return 0
    }

    uchar SetDate(uchar *tpDate)
    {
    uchar DispFlag0

    ClrScr()
    DispSetDate(0x80)
    ScrDisp(0xc0tpDate)

    while(1)
    {
    switch(GetKey())
    {
    case 0
    break
    case 1 调整年
    if(tpDate[0]'9')
    {
    if(tpDate[1]<'9')
    {
    tpDate[1]++
    }
    else
    {
    tpDate[0] '0'
    tpDate[1] '0'
    }
    }
    else
    {
    if(tpDate[1]<'9')
    {
    tpDate[1]++
    }
    else
    {
    tpDate[0]++
    tpDate[1] '0'
    }
    }
    DispFlag 1
    break
    case 2 调整月

    if (tpDate[3]<'1')
    {
    tpDate[4]++
    if(tpDate[4]>'9')
    {
    tpDate[3]++
    tpDate[4]'0'
    }
    }
    else
    {
    if (tpDate[3]'1')
    {
    if(tpDate[4]<'1')
    {
    tpDate[4]++
    }
    else
    {
    tpDate[3]'0'
    tpDate[4]'0'
    }
    }
    else
    {
    tpDate[3]'0'
    tpDate[4]'0'
    }
    }

    DispFlag 1
    break
    case 3 调整日
    if(tpDate[6]<'3')
    {
    tpDate[7]++
    if(tpDate[7]>'9')
    {
    tpDate[6]++
    tpDate[7]'0'
    }
    }
    else
    {
    if(tpDate[6]>'3')
    {
    if(tpDate[7]<'1')
    {
    tpDate[7]++
    }
    else
    {
    tpDate[6]'0'
    tpDate[7]'0'
    }
    }
    }

    DispFlag 1
    break
    case 4
    SaveDate(tpDate)
    return 4 保存时间
    break
    case 5
    return 5 取消
    break
    default
    break
    }

    if(DispFlag1)
    {
    DispFlag 0
    ScrDisp(0xc0tpDate)
    }
    }
    }

    uchar SetTime(uchar *tpTime)
    {
    uchar DispFlag0

    ClrScr()
    DispSetTime(0x80)
    ScrDisp(0xc0tpTime)

    while(1)
    {
    switch(GetKey())
    {
    case 0
    break
    case 1 调整时间 时 位
    if(tpTime[0]>'2')
    {
    if(tpTime[1]<'3')
    {
    tpTime[1]++
    }
    else
    {
    tpTime[0] '0'
    tpTime[1] '0'
    }
    }
    else
    {
    if(tpTime[1]<'9')
    {
    tpTime[1]++
    }
    else
    {
    tpTime[0]++
    tpTime[1] '0'
    }
    }
    DispFlag 1
    break
    case 2 调整时间 分 位
    if(tpTime[4]<'9')
    {
    tpTime[4]++
    }
    else
    {
    if(tpTime[3]<'5')
    {
    tpTime[3]++
    tpTime[4] '0'
    }
    else
    {
    tpTime[3] '0'
    tpTime[4] '0'
    }
    }
    DispFlag 1
    break
    case 3
    if(tpTime[7]<'9')
    {
    tpTime[7]++
    }
    else
    {
    if(tpTime[6]<'5')
    {
    tpTime[6]++
    tpTime[7] '0'
    }
    else
    {
    tpTime[6] '0'
    tpTime[7] '0'
    }
    }
    DispFlag 1
    break
    case 4
    SaveTime(tpTime)
    return 4 保存时间
    break
    case 5
    return 5 取消
    break
    default
    break
    }

    if(DispFlag1)
    {
    DispFlag 0
    ScrDisp(0xc0tpTime)
    }
    }
    }

    uchar SetTMP(uchar LHmodeuint *tpTEMP)
    {
    uchar DispFlag0
    uchar tpTMP[10]
    uint tpTemper0

    ClrScr()
    switch(LHmode)
    {
    case 1
    DispSetLTMP(0x80)
    break
    case 2
    default
    DispSetHTMP(0x80)
    break
    }


    DealTemper(tpTempertpTMP)
    ScrDisp(0xc0tpTMP)

    while(1)
    {
    switch(GetKey())
    {
    case 0
    break
    case 1 调整温度 整数 位
    if(tpTemper<10000) tpTemper + 100
    else tpTemper tpTemper100
    DispFlag 1
    break
    case 2 调整温度 数 位
    if(tpTemper100<99) tpTemper ++
    else tpTemper tpTemper100*100
    DispFlag 1
    break
    case 3
    break
    case 4
    *tpTEMP tpTemper
    return 1 保存时间
    break
    case 5
    return 0 取消
    break
    default
    break
    }

    if(DispFlag1)
    {
    DispFlag 0
    DealTemper(tpTempertpTMP)
    ScrDisp(0xc0tpTMP)
    }
    }
    return 0
    }


    uchar DealKey(void)
    {
    uchar MenuDeep0

    while(1)
    {
    switch(GetKey())
    {
    case 0
    TimeStatus 0
    break
    case 1 移动光标
    if(TimeStatus 0) break
    if(MenuDeep>0)
    {
    MenuDeep
    DispMeau(MenuDeep)
    }
    break
    case 2 移动光标
    if(TimeStatus 0) break
    if(MenuDeep<3)
    {
    MenuDeep++
    DispMeau(MenuDeep)
    }
    break
    case 3
    break
    case 4 确定
    if(TimeStatus 1)
    {
    switch(MenuDeep)
    {
    case 0
    SetDate(Date)
    break
    case 1
    SetTime(Time)
    break
    case 2
    SetTMP(1<emper)
    break
    case 3
    SetTMP(2&HTemper)
    break
    }
    TimeStatus 0
    }
    else
    {
    DispMeau(MenuDeep)
    TimeStatus 1
    }
    break
    case 5 取消
    TimeStatus 0
    break
    default
    break
    }

    if(TimeStatus 0) return 0
    }
    return 0
    }


    六.菜单显示

    功:菜单显示出性化易操作
    _DISPMEAU_H_

    #ifndef _DISPMEAU_H_
    #define _DISPMEAU_H_

    void ScrDisp(unsigned char tpAddr unsigned char *tpStr)
    void DispSetDate(unsigned char tpAddr)
    void DispSetTime(unsigned char tpAddr)
    void DispSetLTMP(unsigned char tpAddr)
    void DispSetHTMP(unsigned char tpAddr)
    void DispCursor(unsigned char tpAddr)
    void DispMeau(unsigned char tpDeep)
    void ClrScr(void)

    #endif

    _DISPMEAU_C_

    #include Mainh

    ******************************
    功:tpStr数组数tpAddr位置开始显示
    输入参数
    uchar tpAddr 显示起始位置
    uchar *tpStr 显示容
    输出

    返回

    ************************************
    void ScrDisp(uchar tpAddr uchar *tpStr)
    {
    uchar ilen

    len strlen((char*)tpStr) 获取显示容字节数
    lcd_w_cmd(tpAddr) 设置显示位置
    for(i0i {
    lcd_w_dat(tpStr[i])
    }
    }

    void ClrScr(void) 清屏幕
    {
    ScrDisp(0x80 )
    ScrDisp(0xc0 )
    }

    void DispSetDate(uchar tpAddr)
    {
    ScrDisp(tpAddrSet Date )
    }

    void DispSetTime(uchar tpAddr)
    {
    ScrDisp(tpAddrSet Time )
    }

    void DispSetLTMP(uchar tpAddr)
    {
    ScrDisp(tpAddrSet Low TMP )
    }

    void DispSetHTMP(uchar tpAddr)
    {
    ScrDisp(tpAddrSet High TMP )
    }

    void DispCursor(uchar tpAddr) 显示尖头指示符号
    {
    lcd_w_cmd(tpAddr) 设置显示位置
    lcd_w_dat(0x7f)
    }

    void DispMeau(uchar tpDeep)
    {
    DispCursor(0x8d)

    switch(tpDeep2)
    {
    case 0
    DispSetDate(0x80)
    DispSetTime(0xc0)
    if(tpDeep20) DispCursor(0x8d)
    else DispCursor(0xcd)
    break
    case 1
    DispSetLTMP(0x80)
    DispSetHTMP(0xc0)
    if(tpDeep20) DispCursor(0x8d)
    else DispCursor(0xcd)
    break
    default
    break
    }
    }



    文档香网(httpswwwxiangdangnet)户传

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

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

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

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

    下载文档

    相关文档

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

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

    2年前   
    495    0

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

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

    3年前   
    901    0

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

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

    3年前   
    612    0

    单片机课程设计报告

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

    5年前   
    1669    0

    基于单片机的智能温控风扇设计毕业设计

    XX职业技术学院毕业设计论文作者 学号 系部 电子信息学院 专业 物联网应...

    4年前   
    858    0

    基于单片机的北斗定位系统

    现代社会空巢老人越来越多,老人因意外发生不能及时呼救给健康甚至生命安全带来威胁,因而,老人安全监护受到越来越多的关注。为了解决这一问题,本次设计使用了STC12C5A60S2单片机作为主处理器,...

    3年前   
    1102    0

    基于单片机的时钟设计

    随着时间的推移,事物的发展越来越趋向于高科技,单片机的出现,受到了社会各界的广泛关注,这是由于单片机具备丰富的功能。单片机的特点为:尺寸小,价格低,抗干扰强,开发容易等。运用的范围也很广,如检测...

    4年前   
    1035    0

    单片机课程设计实习报告

    单片机课程设计实习报告  实训任务:  做单一灯的左移右移,八个发光二极管l1-l8分别接在单片机的p1.0→p1.2→p1.3┅→p1.7→p1.6→┅→p1.0亮,重复循环3次。然后左移2...

    11年前   
    819    0

    开题报告-基于单片机的交通灯设计

    开题报告电气工程及自动化基于单片机的交通灯设计一、综述本课题国内外研究动态,说明选题的依据和意义当今社会,随着日益增长的社会发展,人们对于社活的水平也日益提高,不仅在物质享受方面有所提高,在精...

    4年前   
    1253    0

    基于单片机的智能小车设计开题报告

    电气与信息学院毕业设计(论文)开题报告 基于单片机的智能小车设计 电子 ...

    5个月前   
    308    0

    最新研究报告-基于单片机的步进控制系统的开发

    常 州 工 学 院PROTEL应用实践 题 目 用ProtelDXP软件设计的步进电机二级学院 电子信息与电气工程学院 班 级 ...

    2年前   
    287    0

    开题报告-基于单片机的汽车超速报警系统设计

    开题报告电气工程及自动化基于单片机的汽车超速报警系统设计一、综述本课题国内外研究动态,说明选题的依据和意义随着我国改革开放的继续深入以及国家经济战略的实施下,我国的市场经济不断发展,人民生活水...

    4年前   
    1036    0

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

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

    3年前   
    935    0

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

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

    1年前   
    292    0

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

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

    3年前   
    585    0

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

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

    3年前   
    783    0

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

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

    3年前   
    976    0

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

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

    3年前   
    755    0

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

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

    4年前   
    903    0

    基于单片机淬火炉温温度控制课程设计

    基于PID控制的淬火炉炉温控制系统设计1总体方案设计 这次课程设计针对PID控制的淬火炉进行温度控制,设计步骤分为以下几步。 首先进行控制系统的建模和数字控制器设计,设计方案为:选...

    1年前   
    340    0

    文档贡献者

    文***品

    贡献于2020-11-08

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

    该用户的其他文档