基于单片机的万年历设计


     基单片机万年历设计
    二实验求
    设计万年历时钟显示LCD1602显示屏进行年月日时分秒设置外通键进行闹钟设置事件提醒功蜂鸣器进行闹铃提醒附加温湿度检测功温湿度传感器检测室温湿度温湿度数显示屏显示出

    三实验设备仪器
    1 STC89C52芯片作系统板控芯片
    2DHT11温湿度传感器
    3DS1302时钟芯片
    4LCD1602显示屏

    四实验模块原理介绍
    41 STC89C52单片机
    STC89C52STC公司生产种低功耗高性CMOS8位微控制器具8K字节系统编程Flash存储器STC89C52典MCS51核具传统51单片机具备功单芯片拥灵巧8 位CPU 系统编程FlashSTC89C52众嵌入式控制应系统提供高灵活超效解决方案
    (1)特性
    8K字节程序存储空间
    512字节数存储空间
    带4K字节EEPROM存储空间
    直接串口载
    (2)器件参数
    1 增强型8051单片机6时钟机器周期12时钟机器周期意选择指令代码完全兼容传统8051
    2 工作电压:55V~33V(5V单片机)38V~20V(3V 单片机)
    3工作频率范围:0~40MHz相普通80510~80MHz实际工作频率达48MHz
    4 户应程序空间8K字节
    5 片集成512字节RAM
    6 通IO 口(32)复位:P1P2P3 准双口弱拉P0口漏极开路输出作总线扩展时加拉电阻作IO口时需加拉电阻
    7 ISP(系统编程)IAP(应编程)需专编程器需专仿真器通串口(RXDP30TXDP31)直接载户程序数秒完成片
    8 具EEPROM 功
    9 316位定时器计数器定时器T0T1T2
    10外部中断4 路降中断低电触发电路Power Down 模式外部中断低电触发中断方式唤醒
    11 通异步串行口(UART)定时器软件实现UART
    12 工作温度范围:40~+85℃(工业级)0~75℃(商业级)
    13 PDIP封装
    1STC89C52单片机引脚图

    图41 STC89C52单片机引脚图
    ① 电源引脚(2根)
      VCC(Pin40):电源输入接+5V电源
      GND(Pin20):接线
    ②外接晶振引脚(2根)
      XTAL1(Pin19):片振荡电路输入端
      XTAL2(Pin20):片振荡电路输出端
    ③控制引脚(4根)
      RSTVPP(Pin9):复位引脚引脚出现2机器周期高电单片机复位
      ALEPROG(Pin30):址锁存允许信号
      PSEN(Pin29):外部存储器读选通信号
      EAVPP(Pin31):程序存储器外部选通接低电外部程序存储器读指令果接高电部程序存储器读指令
    ④编程输入输出引脚(32根)
      STC89C52单片机4组8位编程IO口分位P0P1P2P3口口8位(8根引脚)32根
    PO口(Pin39~Pin32):8位双IO口线名称P00~P07 P1口(Pin1~Pin8):8位准双IO口线名称P10~P17 P2口(Pin21~Pin28):8位准双IO口线名称P20~P27 P3口(Pin10~Pin17):8位准双IO口线名称P30~P37
    2STC89C52单片机系统
    STC89C52单片机系统复位电路时钟电路组成复位功通外部电路实现键K1控制单片机复位时钟电路通晶振实现单片机提供运行时钟根需求选晶振频率会差异次课程设计中采110592MHZ晶振频率单片机复位电路图42示晶振电路图43示

    图42 复位电路


    图43晶振电路
    42 DS1302芯片
    DS1302DALLAS公司出款实时时钟芯片广泛应电话传真便携式仪器等产品领域性指标:
    1DS1302实时时钟芯片提供秒分时日期月年等信息具软件动调整力通配置AMPM决定采24时格式12时格式
    2拥31字节数存储RAM
    3串行IO通信方式
    4DS1302工作电压较宽20V~55V范围均正常工作采双电源供电电源备电源高02V时电源供电否采备电源般纽扣电池
    5DS1302实时时钟芯片功耗低工作电压20V时工作电流300nA
    6DS13028引脚两种封装形式种DIP8封装芯片宽度(含引脚)300mil种SOP8封装两种宽度种150mil种208mil
    (1) DS1302引脚功

    图 44 DS1302芯片引脚图
    (1)Vcc2:电源引脚Vcc2Vcc1高02v时DS1302Vcc2供电Vcc2低Vcc1时Vcc1供电
    (23)X1X2:两引脚需接32768k晶振DS1302提供基准该晶振引脚负载电容必须6pF源晶振接X1X2悬空
    (4)GND:接
    (5)CE:DS1302输入引脚该引脚部40k拉电阻该引脚高电DS1302进行读写
    (6)IO:该引脚双通信引脚部含40k拉电阻进行数读写
    (7)SCLK:该引脚输入引脚部含40k拉电阻作通信时钟信号
    (8)Vcc1:备电源引脚
    (2) DS1302单片机接线图
    DS1302引脚单片机接线图图45示图45出引脚X1X2间接32768K晶体正振荡器Vcc1通纽扣电池接

    图45 DS1302单片机连接图

    43 LCD1602液晶显示屏
    LCD1602液晶屏够够时显示32字符价格便宜编程简单稳定LCD1602液晶屏种图形点阵显示器显示原理简单易懂液晶屏部液晶材料变化显示字符液晶具流动特性物质需外加微力量液晶分子运动
    (1)LCD1602引脚
    1602LCD采标准14脚(背光)16脚(带背光)接口引脚接口图图46示:

    图46 LCD1602引脚图
    (a) 引脚说明
    1脚:VSS电源
    2脚:VDD接5V正电源
    3脚:V0液晶显示器度调整端接正电源时度弱接时
    度高时会产生鬼影时通10K电位器调整
    4脚:RS寄存器选择高电时选择数寄存器低电时选择指令寄存器
    5脚:RW读写信号线高电时进行读操作低电时进行写操作RS
    RW低电时写入指令者显示址RS低电RW高电
    RS高电RW低电时写入数
    6脚:E端端E端高电跳变成低电时液晶模块执行命令
    7~14脚:D0~D78位双数线
    15脚:背光源正极
    16脚:背光源负极
    (b)LCD1602技术参数:
    显示容量:32字符
    芯片工作电压:4555V
    工作电流:20mA(50V)
    模块佳工作电压:50V
    (2)LCD1602单片机接线图

    图47 LCD1602单片机接线图
    LCD1602单片机接线图47示背光源正极(5)VDD(2)均接电源液晶显示器接保证度强10K电位器进行调整
    44 温湿度传感器DHT11
    DHT11数字温湿度传感器款含已校准数字信号输出温湿度复合传感器采专数字模块采集技术温湿度传感技术确保产品性长期稳定性传感器包括电阻式感湿元件NTC测温元件高性8位单片机相连接该产品具品质卓越超快响应抗干扰力强性价极高等优点
    DHT11传感器极精确湿度校验室中进行校准校准系数程序形式储存OTP存中传感器部检测信号处理程中调校准系数单线制串行接口系统集成变简易快捷超体积极低功耗信号传输距离达20米成类应甚苛刻应场合佳选产品4针单排引脚封装连接方便特殊封装形式根户需求提供
    (1)DHT11引脚功
    DHT11引脚图图48示般情况四引脚分:VCCDOUTNCGND引脚功表41示

    图48 DHT11引脚图
    表41 DHT11引脚功
    pin
    名称
    注释
    1
    VDD
    供电355VDC
    2
    DATA
    串行数单总线
    3
    NC
    空脚请悬空
    4
    GND
    接电源负极
    1电源引脚
    DHT11供电电压355V传感器电等 1s 越稳定状态期间需发送指令电源引脚(VDDGND)间增加100nF 电容作耦滤波
    2串行接口(单线双)
    DATA微处理器DHT11间通信步串行双接口采单总线数格式次通信高位先出序传输40位数时约4 ms
    数格式:
    8位湿度整数数+8位湿度数数+8位温度整数数+8位温度数数+8位校验数数分数部分整数部分前数部分扩展现读出零数传送正确时校验数等8位湿度整数数+8位湿度数数+8位温度整数数+8位温度数数结果末8位
    (2)DHT11单片机接线图
    DHT11单片机接线图图49示图49中出DHT11第三引脚接单片机P22引脚第引脚接电阻发光二极

    图49 DHT11单片机接线图
    45 蜂鸣器
    蜂鸣器种体化结构电子讯响器采直流电压供电广泛应计算机印机复印机报警器电子玩具汽车电子设备电话机定时器等电子产品中作发声器件蜂鸣器分源蜂鸣器源蜂鸣器两种处源蜂鸣器源蜂鸣器工作理想信号直流电通常标示VDCVDD等蜂鸣器部简单振荡电路恒定直流电转化成定频率脉信号带动钼片振动发音
    源蜂鸣器压电效应原理发声部带谐振荡器产生1525kHZ 电压信号源蜂鸣器发声源蜂鸣器单片机中电路图较简单图410蜂鸣器单片机接线图

    图410 蜂鸣器单片机接线图
    源蜂鸣器直接接额定电源连续发声IO口输出接1K电阻目基极限流低电方式启动蜂鸣器发声
    五流程图
    (1) 程序流程图
    图51系统程序流程图系统开始时先进行初始化然调整时间闹钟通串口屏时间显示出

    图51 程序流程图
    (2)子程序流程图
    系统程序开始执行分调子程序中子程序包括DS1302子程序DHT11子程序LCD1602子程序等
    (1)DS1302芯片子程序流程图
    DS1302实时时钟芯片提供秒分时日月年星期等信息具软件动调整力通配置AMPM决定采24时格式12时格式DS1302中读出年月日时分秒等信息图52DS1302芯片子程序流程图:

    图52 DS1302子程序流程图
    (2)DHT11子程序流程图
    DHT11温湿度传感器实时显示环境中温湿度数8位湿度整数数8位湿度数数8位温度整数数8位温度数数8位校验数DHT11子程序流程图53示:

    图53 DHT11子程序流程图
    (3)LCD1602子程序流程图
    LCD1602显示时先进行初始化紧接着读指令读完写指令数进行读写然显示出流程图图54示

    图54 LCD1602显示屏子程序流程图

    六实验目
    1学会掌握keil软件
    2学会掌握Altium Designer软件
    3实现万年历基功
    4通实验巩固单片机相关知识检验身动手力

    七实验容
    次实验STC89C52单片机作控芯片DS1302芯片作时钟芯片LCD1602显示屏显示设置闹钟事件提醒功外进行室温湿度检测显示终完成万年历设计

    八实验步骤
    1查询资料确定控芯片温湿度传感器时钟芯片LCD1602显示屏说明
    2根功求进行硬件电路设计Altium Designer软件设计电路整电路分控芯片控制模块LCD1602显示模块键设置模块蜂鸣器电路模块DHT11温湿度传感器模块硬件电路图图1示:


    图81:硬件电路图

    3根电路图编写C语言代码:
    代码:
    #include
    #define uchar unsigned char
    #define uint unsigned int
    #define lcddata P0
    #define readalarmsecond 0xc7 定义 DS1302 中读闹钟秒值命令字节
    #define writealarmsecond 0xc6 定义 DS1302 中写闹钟秒值命令字节
    #define readalarmminute 0xc5 定义 DS1302 中读闹钟分值命令字节
    #define writealarmminute 0xc4 定义 DS1302 中写闹钟分值命令字节
    #define readalarmhour 0xc3 定义 DS1302 中读闹钟时值命令字节
    #define writealarmhour 0xc2 定义 DS1302 中写闹钟时值命令字节

    #define readeventday 0xd7 定义 DS1302 中读事件提醒日期值命令字节
    #define writeeventday 0xd6 定义 DS1302 中写事件提醒日期值命令字节
    #define readeventmonth 0xd5 定义 DS1302 中读事件提醒月份值命令字节
    #define writeeventmonth 0xd4 定义 DS1302 中写事件提醒月份值命令字节
    #define readeventyear 0xd3 定义 DS1302 中读事件提醒年份值命令字节
    #define writeeventyear 0xd2 定义 DS1302 中写事件提醒年份值命令字节

    sbit lcdrsP2^7 LCD 数 命令选择端 (HL)
    sbit lcdrwP2^6 LCD 读写选择端 (HL)
    sbit lcdenP2^5 LCD 控制
    sbit beepP1^3 蜂鸣器控制端
    sbit DQ P1^4 温湿度传感器·
    sbit kmenuP3^2 功键
    sbit kupP3^3 增键
    sbit kdownP3^4 减键
    sbit kalarmP3^5 闹钟查键 Ring 显示闹钟需调时间
    sbit keventP3^6 事件查键 Ding 显示事件提醒需调时间
    sbit kmodeP3^7 切换温湿度显示
    sbit dsclkP2^2 ds1302 时钟信号端
    sbit dsdataP2^1 ds1302 数 IO 端
    sbit dsrstP2^0 ds1302 复位端
    sbit ACC7ACC^7 定义累加器高低位
    sbit ACC0ACC^0
    bit flagalarmflagsetaflagset 分定义闹钟响标志位闹钟设置标志位时间设置标志位
    bit flageventflagsseta 分定义事件提醒标志位事件提醒设置标志位
    uchar FLAGk
    uchar temp
    uchar T_data_HT_data_LRH_data_HRH_data_Lcheckdata
    uchar T_data_H_tempT_data_L_tempRH_data_H_tempRH_data_L_tempcheckdata_temp
    uchar comdata
    uchar kmenunumsmhddmmyy 功键次数计数器
    char secondminutehouryearmonthdayweek
    uchar inittime[7]{0x590x590x110x050x070x040x18} 初始化设置:
    2018 年 7 月 5 日 星期四 11 点 59 分 59 秒
    左右数次秒分时日月星期年
    年月日星期: 20180705 THU
    时间: 115959
    uchar code t1[] 液晶固定显示部分
    uchar code t2[]

    函数声明
    void delay(uint z) 毫秒级延时函数
    void di() 蜂鸣器发声函数
    void writecom(uchar com) 液晶写命令函数
    void writedata(uchar dat) 液晶写数函数
    void writetime(uchar adduchar dat) 液晶刷新时分秒
    void writenyr(uchar adduchar dat) 液晶刷新日期
    void writeweek(uchar week) 液晶星期显示函数
    void keyscan() 键盘扫描函数
    void dswritebyte(uchar d) DS1302 写入字节
    uchar dsreadbyte() DS1302 读出字节
    void dswrite(uchar add uchar dat) DS1302 指定址写入字节
    uchar dsread(uchar add) DS1302 指定址读出字节
    void init1302time(uchar *pClock) DS1302 时间初始化函数
    void init() 初始化函数
    void Delay_100us(uint j)延时100us
    void Delay_10us(void)延时10us
    void COM(void)
    void Read_DHT11(void)

    void delay(uint z) 毫秒级延时函数
    {
    uint xy
    for(xzx>0x)
    for(y110y>0y)
    }
    void di() 蜂鸣器发声函数
    {
    beep0
    delay(100)
    beep1
    }
    void writecom(uchar com) 液晶写命令函数
    {
    lcdrs0 置写入命令
    lcddatacom 送入数
    delay(1)
    lcden1 拉高端
    delay(1)
    lcden0 完成高脉
    }
    void writedata(uchar dat) 液晶写数函数
    {
    lcdrs1 置写入数
    lcddatadat 送入数
    delay(1)
    lcden1
    delay(1)
    lcden0
    }
    void writetime(uchar adduchar dat) 液晶刷新时分秒
    { 3时开始位置6 分 9 秒
    uchar shige
    shidat10
    gedat10
    writecom(0x80+0x40+add)
    writedata(0x30+shi)
    writedata(0x30+ge)
    }
    void writenyr(uchar adduchar dat) 液晶刷新日期
    { 0 年 3 月 6 日
    uchar shige
    shidat10
    gedat10
    writecom(0x80+add)
    writedata(0x30+shi)
    writedata(0x30+ge)
    }
    void writeweek(uchar week) 液晶星期显示函数
    {
    writecom(0x80+9) 第行隔十三字符开始写星期
    switch(week)
    {
    case 1 writedata('M')
    writedata('O')
    writedata('N')
    break
    case 2 writedata('T')
    writedata('U')
    writedata('E')
    break
    case 3 writedata('W')
    writedata('E')
    writedata('D')
    break
    case 4 writedata('T')
    writedata('H')
    writedata('U')
    break
    case 5 writedata('F')
    writedata('R')
    writedata('I')
    break
    case 6 writedata('S')
    writedata('A')
    writedata('T')
    break
    case 7 writedata('S')
    writedata('U')
    writedata('N')
    break
    }
    }
    void keyscan() 键盘扫描函数
    {
    if((flagalarm1)||(flagevent1)) 果闹钟响者事件提醒意键停止闹钟响者取消事件提醒
    {
    if((kmenu0)||(kup0)||(kdown0)||(kalarm0)||(kevent0))
    {
    delay(5)
    if((kmenu0)||(kup0)||(kdown0)||(kalarm0)||(kevent0))
    {
    while((kmenu&&kup&&kdown&&kalarm&&kevent))
    di()
    flagalarm0 清闹钟标志
    flagevent0 清事件提醒标志
    }
    }
    }
    if(kmenu0) 检测功键
    {
    delay(5)
    if(kmenu0)
    {
    kmenunum++ 记录功键次数
    if(flagseta1) 检测否进行闹钟设置
    if(kmenunum4) kmenunum1 进行闹钟设置时调节时分秒 kmenunum 等 123
    if(flagsseta1) 检测否进行事件提醒设置
    if(kmenunum8) kmenunum5 进行事件提醒设置时调节年月日 kmenunum 等 567
    flagset1 设置标志位表示进行种时间设置
    while(kmenu)
    di()
    switch(kmenunum) 定位光标闪烁点
    {
    case 1 writecom(0x80+0x40+10) 秒闪烁
    writecom(0x0f) 开光标闪烁
    break
    case 2 writecom(0x80+0x40+7) 分闪烁
    break
    case 3 writecom(0x80+0x40+4) 时闪烁
    break
    case 4 writecom(0x80+10) 星期闪烁
    break
    case 5 writecom(0x80+7) 日闪烁
    break
    case 6 writecom(0x80+4) 月闪烁
    break
    case 7 writecom(0x80+1) 年闪烁
    break
    case 8 kmenunum0
    writecom(0x0c) 取消光标闪烁
    flagset0 取消时间调节标志
    dswrite(0x8e0x00) * 允许写操作 *
    dswrite(0x80second10*16+second10) dswrite(0x82minute10*16+minute10) dswrite(0x84hour10*16+hour10)
    dswrite(0x8aweek10*16+week10)
    dswrite(0x86day10*16+day10)
    dswrite(0x88month10*16+month10)
    dswrite(0x8cyear10*16+year10)
    dswrite(0x8e0x80) * 禁止写操作 *
    break
    }
    }
    }
    if(kmenunum0) 功键时 检测增 减键
    {
    if(kup0)
    {
    delay(5)
    if(kup0)
    {
    while(kup)
    di()
    switch(kmenunum) 根功键次数调节相应数值
    {
    case 1 second++
    if(second60)
    second0
    writetime(9second)
    writecom(0x80+0x40+10) 面送液晶显示
    break 次 光标移位 光标复位
    case 2 minute++
    if(minute60)
    minute0
    writetime(6minute)
    writecom(0x80+0x40+7)
    break
    case 3 hour++
    if(hour24)
    hour0
    writetime(3hour)
    writecom(0x80+0x40+4)
    break
    case 4 week++
    if(week8)
    week1
    writeweek(week)
    writecom(0x80+11)
    break
    case 5 day++
    if(day32)
    day1
    writenyr(6day)
    writecom(0x80+7)
    break
    case 6 month++
    if(month13)
    month1
    writenyr(3month)
    writecom(0x80+4)
    break
    case 7 year++
    if(year100)
    year0
    writenyr(0year)
    writecom(0x80+1)
    break
    }
    }
    }
    if(kdown0)
    {
    delay(5)
    if(kdown0)
    {
    while(kdown)
    di()
    switch(kmenunum) 根功键次数调节相应数值
    {
    case 1 second
    if(second1)
    second59
    writetime(9second)
    writecom(0x80+0x40+10)
    break
    case 2 minute
    if(minute1)
    minute59
    writetime(6minute)
    writecom(0x80+0x40+7)
    break
    case 3 hour
    if(hour1)
    hour23
    writetime(3hour)
    writecom(0x80+0x40+4)
    break
    case 4 week
    if(week0)
    week7
    writeweek(week)
    writecom(0x80+11)
    break
    case 5 day
    if(day0)
    day31
    writenyr(6day)
    writecom(0x80+7)
    break
    case 6 month
    if(month0)
    month12
    writenyr(3month)
    writecom(0x80+4)
    break
    case 7 year
    if(year1)
    year99
    writenyr(0year)
    writecom(0x80+1)
    break
    }
    }
    }
    }
    if(kalarm0) 检测闹钟调节键否条if 语句 if(kmenunum0)
    { 层次
    delay(5)
    if(kalarm0)
    {
    flagseta~flagseta
    while(kalarm)
    di()
    if(flagseta0) 时退出闹钟设置保存相关数值
    {
    flagset0 清时间设置标志 if(kalarm0) if 语句writecom(0x80+0x40)中 flagset1 条语句设置
    flagset 标志位果进行闹钟时间设置会执行前面 if(kmenunum0) 语句中 flagset1 条语句
    writedata(' ') 清液晶 Ri闹钟调节标志
    writedata(' ')
    writecom(0x0c) 取消光标闪烁
    dswrite(0x8e0x00) * 允许写操作 *
    dswrite(writealarmsecondsecond10*16+second10) DS1302 中保存闹钟时分秒值
    dswrite(writealarmminuteminute10*16+minute10)
    dswrite(writealarmhourhour10*16+hour10)
    dswrite(0x8e0x80) * 禁止写操作 *
    }
    else 进入闹钟设置
    {
    sdsread(readalarmsecond)16*10+dsread(readalarmsecond)16 * 读取DS1302 中保存闹钟时分秒原始值转化十进制数存进 smh 保存面判断闹钟时间否达*
    mdsread(readalarmminute)16*10+dsread(readalarmminute)16
    hdsread(readalarmhour)16*10+dsread(readalarmhour)16
    seconds 闹钟时间十进制数传送变量 secondminutehour调节值
    minutem
    hourh
    writecom(0x80+0x40)
    writedata('R') 液晶显示闹钟调节标志
    writedata('i')
    writetime(3hour) 送液晶显示闹钟时间
    writetime(6minute)
    writetime(9second)
    }
    }
    }
    if(kevent0) 检测事件提醒调节键否条 if 语句 if(kmenunum0)
    { 层次
    delay(5)
    if(kevent0)
    {
    flagsseta~flagsseta
    while(kevent)
    di()
    if(flagsseta0) 时退出事件提醒设置保存相关数值
    {
    flagset0 清时间设置标志 if(kevent0) if 语句
    writecom(0x80+9) 中 flagset1 条语句设置
    flagset 标志位 果进行事件提醒时间设置
    会执行前面 if(kmenunum0) 语句中 flagset1 条语句
    writedata(' ') 清液晶 Ti 事件提醒调节标志
    writedata(' ')
    writedata(' ')
    writecom(0x0c) 取消光标闪烁
    dswrite(0x8e0x00) * 允许写操作 *
    dswrite(writeeventyearyear10*16+year10) DS1302 中保存事件提醒年月日值
    dswrite(writeeventmonthmonth10*16+month10)
    dswrite(writeeventdayday10*16+day10)
    dswrite(0x8e0x80) * 禁止写操作 *
    }
    else 进入事件提醒设置
    {
    yydsread(readeventyear)16*10+dsread(readeventyear)16 * 读取DS1302 中保存事件提醒年月日原始值转化十进制数存进 yymmdd 保存面判断事件提醒时间否达*
    mmdsread(readeventmonth)16*10+dsread(readeventmonth)16
    dddsread(readeventday)16*10+dsread(readeventday)16
    yearyy 事件提醒时间十进制数传送变量 hourdaymonthweek调节值
    monthmm
    daydd
    writecom(0x80+9)
    writedata('T') 液晶显示事件提醒设置标志
    writedata('i')
    writedata(' ')
    writenyr(0year) 送液晶显示事件提醒时间
    writenyr(3month)
    writenyr(6day)
    }
    }
    }
    }
    void dswritebyte(uchar d) DS1302 写入字节
    {
    uchar i
    ACCd
    for(i8i>0i)
    {
    dsdataACC0
    dsclk1 *什里时钟先 1 0 dsclk 初始化 0次循环
    置 0样形成 0 开始升 恰满足 ds1302 写数升
    时钟必须 0 开始求 *
    dsclk0
    ACCACC>>1
    }
    }
    uchar dsreadbyte() DS1302 读出字节
    {
    uchar i
    for(i8i>0i)
    {
    ACCACC>>1
    ACC7dsdata
    dsclk1 读数样 然降 0 开始 样设置 dsclk 刚满足求
    dsclk0
    }
    return ACC
    }
    void dswrite(uchar adduchar dat) DS1302 指定址写入字节
    {
    dsrst0
    dsclk0
    dsrst1
    dswritebyte(add) * 先写入址 命令字节 *
    dswritebyte(dat) * 写 1Byte 数 *
    dsclk1
    dsrst0
    }
    uchar dsread(uchar add) DS1302 指定址读出字节
    {
    uchar dat
    dsrst0
    dsclk0
    dsrst1
    dswritebyte(add) * 先写入址 命令字节 *
    datdsreadbyte() * 读 1Byte 数 *
    dsclk1
    dsrst0
    return dat
    }
    void init1302time(uchar *pClock) DS1302 时间初始化函数
    {
    uchar i
    uchar add0x80
    dswrite(0x8e0x00) * 允许写操作 *
    for(i7i>0i)
    {
    dswrite(add*pClock) * 次写入秒 分 时 日 月 星期 年 *
    pClock++
    add+2 DS1302 时钟寄存器占两址低位 0
    } 写址 低位 1读址 add 加 2
    dswrite(0x8e0x80) * 禁止写操作 *
    }
    void init() 初始化函数
    {
    uchar num
    变量初始化
    flagset0 时间设置标志位置 0表示未进行时间设置
    flagseta0 闹钟设置标志位置 0
    flagalarm0 闹钟标志位置 0
    kmenunum0 功键次数计数器置 0
    lcdrw0
    DS1302 初始化
    dswrite(0x8e0x00) * 允许写操作 *
    dswrite(0x800x00) 开 DS1302 晶振开始工作
    dswrite(0x840x00) 设置 24 时制
    init1302time(inittime) 初始化时间:
    2018 年 7 月 5 日 星期四 11 点 59 分 59 秒
    左右数次秒分时日月星期年
    dswrite(0x8e0x80) * 禁止写操作 *
    1602 液晶初始化
    writecom(0x38)开显示
    writecom(0x0c)开显示显示光标
    writecom(0x06)写指针加1
    writecom(0x01)清屏
    writecom(0x80)设置数指针起点
    for(num0num<16num++) 写入液晶固定显示部分
    {
    writedata(t1[num])
    delay(1)
    }
    writecom(0x80+0x40) 换液晶第二行
    for(num0num<16num++)
    {
    writedata(t2[num])
    delay(1)
    }
    }
    void Delay_100us(uint j)延时100us
    {
    uchar i
    for(j>0j)
    for(i0i<27i++)STC89C52RC
    }
    void Delay_10us(void)延时10us
    {
    uchar i
    iiiiiiSTC89C52RC
    }
    void COM(void)
    {
    uchar i
    for(i0i<8i++)
    {
    FLAG2
    while((DQ)&&FLAG++)
    Delay_10us()
    Delay_10us()
    Delay_10us()
    temp0
    if(DQ)temp1
    FLAG2
    while((DQ)&&FLAG++)
    超时跳出for循环
    if(FLAG1) break
    判断数位01
    果高电高预定0高电值数位 1
    comdata<<1
    comdata|temp 0
    }rof
    }


    湿度读取子程序

    变量均全局变量
    温度高8位 T_data_H
    温度低8位 T_data_L
    湿度高8位 RH_data_H
    湿度低8位 RH_data_L
    校验 8位 checkdata
    调相关子程序
    Delay() Delay_10us()COM()


    void Read_DHT11(void)
    {
    机拉低18ms
    DQ0
    Delay_100us(180)
    DQ1
    总线拉电阻拉高 机延时20us
    Delay_10us()
    Delay_10us()
    Delay_10us()
    Delay_10us()
    机设输入 判断机响应信号
    DQ1
    判断机否低电响应信号 响应跳出响应运行
    if(DQ) T
    {
    FLAG2
    判断机否发出 80us 低电响应信号否结束
    while((DQ)&&FLAG++)
    FLAG2
    判断机否发出 80us 高电发出进入数接收状态
    while((DQ)&&FLAG++)
    数接收状态
    COM()
    RH_data_H_tempcomdata
    COM()
    RH_data_L_tempcomdata
    COM()
    T_data_H_tempcomdata
    COM()
    T_data_L_tempcomdata
    COM()
    checkdata_tempcomdata
    DQ1
    数校验
    temp(T_data_H_temp+T_data_L_temp+RH_data_H_temp+RH_data_L_temp)
    if(tempcheckdata_temp)
    {
    RH_data_HRH_data_H_temp
    RH_data_LRH_data_L_temp
    T_data_HT_data_H_temp
    T_data_LT_data_L_temp
    checkdatacheckdata_temp
    }fi
    }fi
    }

    void main()
    {
    uchar temp
    init()
    while(1)
    {
    keyscan()
    if((flagalarm1)||(flagevent1)) 闹钟时间时执行段程序启动蜂鸣器发声
    {
    di()
    delay(100)
    di()
    delay(500)
    }
    if(flagset0&&flagseta0&&flagsseta0) 没进行时间设置 闹钟设置 事件提醒设置时 执行段程序
    {
    keyscan()
    Read_DHT11()读取 DHT11 数
    读取 DS1302 数
    tempdsread(0x81) 读秒数送 temp 暂时保存
    secondtemp16*10+temp16 BCD 码转换成十进制数
    tempdsread(0x83)
    minutetemp16*10+temp16
    tempdsread(0x85)
    hourtemp16*10+temp16
    tempdsread(0x87)
    daytemp16*10+temp16
    tempdsread(0x89)
    monthtemp16*10+temp16
    tempdsread(0x8b)
    weektemp16*10+temp16
    tempdsread(0x8d)
    yeartemp16*10+temp16
    年月日时分秒数送液晶显示
    writetime(3hour)
    writetime(6minute)
    writetime(9second)
    writenyr(0year)
    writenyr(3month)
    writenyr(6day)
    writeweek(week)
    显示湿度
    writecom(0x80+13)
    writedata(RH_data_H10+'0')
    writedata(RH_data_H10+'0')
    writedata('')
    显示温度
    writecom(0x80+0x40+12)
    writedata(T_data_H10+'0')
    writedata(T_data_H10+'0')
    writedata('')
    writedata(T_data_L10+'0')
    闹钟事件提醒判断
    if((seconds)&&(minutem)&&(hourh))
    flagalarm1
    if((yearyy)&&(monthmm)&&(daydd))
    flagevent1
    }
    }
    }
    4实物验证结果验证
    根硬件电路图进行实物搭建焊接硬件进行调试写程序烧录单片机中硬件实物图图82示:

    图82 硬件实物图
    图82中出LCD1602第行显示年月日环境中湿度第二行显示时分秒环境温度外功键加键减键闹钟键事件键组合实现闹钟设置事件提醒设置时间设置温湿度显示四种功

    九心体会
    通次实验培养综合运学知识发现提出分析解决实际问题锻炼实践力重环节回顾次单片机实验感觉受益良中编程仿真调试开发板等步骤次课程设计懂理实际相结合重理知识远远够学知识实践相结合起理中出结真正学知识服务生活服务社会提高实际动手力独立思考力时加强学合作老师沟通收获次实验发现身足学研究中会巩固加强专业知识学研究工作坚实基础

    仅供参考
    文档香网(httpswwwxiangdangnet)户传

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

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

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

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

    下载文档

    相关文档

    基于单片机的时钟设计

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

    4年前   
    1028    0

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

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

    1年前   
    487    0

    基于单片机的数控恒流源设计

    该数控直流恒流源采用模块化,主要由单片机控制模块、键盘输入模块、A/D转换模块、恒流源模块、D/A转换模块和显示模块六部分组成。通过开关和按钮的设置,配合AT89S52单片机的编程实现数字控制及...

    3年前   
    906    0

    基于单片机的电子琴设计

    综合课程设计题 目:可演奏的电子琴 学 院:管理科学与工程学院可演奏的电子琴摘要:随着社会的发展进步,音乐逐渐成为我们生活中很重要的一部分,有人曾说喜欢音乐的人不会向恶。我们...

    2周前   
    67    0

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

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

    4年前   
    1248    0

    基于凌阳单片机的红外通信接口设计

    科 研 训 练 报 告报告题目:基于凌阳单片机的红外通信接口设计姓 名 院(系) 电气与电子工程学院 ...

    2年前   
    388    0

    基于单片机的程控放大器设计

     毕业设计(论文) 基于单片机的程控放大器设计 专 业: 电子科学与技术 ...

    5年前   
    1645    0

    基于单片机的果实品质分类装置设计

    机器视觉简而言之就是利用摄像头拍摄实际图像,通过摄像头模块自动将图像信息转化为对应的电信号,输送给单片机逻辑处理,以此来达到对图像的智能化识别。果实采摘系统中使用机器视觉较多。

    3年前   
    2056    0

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

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

    5个月前   
    288    0

    基于单片机智能小车毕业设计

    毕 业 设 计(论 文)设计(论文)题目: 基于单片机的智能小车 ...

    6个月前   
    197    0

    基于单片机的智能灭火小车设计

    摘要:当今社会,火灾在现实生活中普遍存在,被称为自然界三大灾害之一。当火灾发后,灭火工作坏境恶劣时,人工不能完成一些灭火任务,此时便可以使用智能灭火小车去完成相应的任务。本文设计了一个以单片机为...

    4年前   
    1481    0

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

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

    3年前   
    990    0

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

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

    3年前   
    929    0

    基于单片机的智能鱼缸的设计与实现毕业设计

    近年来嵌入式发展迅速,智能家居也进入了人们的生活。智能鱼缸却没有快速发展。我根据市场上相关设备现状的分析和研究,从系统集成角度进行设计和开发,提出了一套多功能的智能观赏鱼缸控制系统的设计方案。

    5年前   
    4251    0

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

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

    3年前   
    583    0

    基于单片机的空调温度控制系统设计毕业设计

     毕业设计  题 目 基于单片机的空调温度控制系统设计 学生姓名 学 号 学 院 计算机与信息工程系 专业班级 指导...

    5年前   
    2543    0

    基于AT89S51单片机无线传输系统设计毕业设计

    毕业论文(设计) 题 目: 单片机无线传输系统设计 完 成 人: ...

    4年前   
    871    0

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

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

    3年前   
    898    0

    基于51单片机的智能窗户设计毕业设计

    基于51单片机的智能窗户设计【摘 要】 随着电子技术的发展和人民生活水平的不断提高,智能窗已经越来越多地被用到了现代智能化建筑中,提供住户一个安全、方便的环境。据统计,在未来的几年内,安装智...

    5个月前   
    113    0

    基于单片机的语音门铃设计毕业设计

    在现代电子产品中, 由于电子音乐门铃具有悦耳动听,价格低廉,耗电少等优点,在现代家居中的应用越来越流行。本毕业设计是基于单片机的“叮咚”门铃,通过单片机控制输出频率,由音频功率放大器LM386放...

    4年前   
    1255    0

    文档贡献者

    文***品

    贡献于2021-03-29

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

    该用户的其他文档