万年历实训报告


    
    物理机电学院课程设计报告



    课程名称: 电子系统课程设计
    专业班级: 12电(2)
    学 号:
    学生姓名:
    指导教师:
    完成时间: 2015317—2015616
    报告成绩:

    评阅意见:






    评阅教师 日期








    设计课题题目: 带温度简易时钟
    丶设计务求
    (1)具备显示年月日星期时分秒键盘输入功
    (2)具备温度测量功
    (3)年月日等日期调
    (4)具备闹钟功
    二系统设计方案
    1控制部分方案
    网查阅凌阳16位单片机设计凌阳16位单片机丰富中断源时基方便实验设计准确度相高C语言汇编兼容编程环境方便实现递调IO口功较强方便凌阳16位单片机做控制器特色编程音频处理完成语音录制播放识方便设计进行扩展设计更加完善成相低
    2显示部分方案
    网查阅液晶显示采8段数码济实惠效果加入语音报时功操作较液晶显示说然略显繁琐总体做较性化LED数码显示
    3系统基方案
    (1)单片机芯片方案:
    网查阅AT89S52片ROM全采Flash ROM3V超低压工作时MCS51系列单片机完全该芯片部存储器8KB ROM 存储空间样具89C51功具线编程擦技术电路进行调试时程序错误修改程序新增功需烧入程序时需芯片次拔插会芯片造成损坏
    (2)显示模块方案
    网查阅采LED数码动态扫描LED数码价格适中显示数字合适采动态扫描法单片机连接时占单片机口线少
    (3)时钟芯片方案
    网查阅采DS1302时钟芯片实现时钟DS1302芯片种高性时钟芯片动秒分时日周月年闰年补偿年进行计数精度高位RAM做数暂存区工作电压25V~55V范围25V时耗电300nA
    (4)温度传感器选择方案证
    方案:热敏电阻作传感器热敏电阻相应阻值相串联分压利热敏电阻阻值温度变化变化特性采两电阻变化分压值进行AD转换方案需AD转换电路增加硬件成热敏电阻感温特性曲线严格线性会产生较测量误差
    方案二:采数字式温度传感器DS18B20传感器数字式传感器仅需条数线进行数传输易单片机连接AD模块降低硬件成简化系统电路外数字式温度传感器具测量精度高测量范围广等优点
    单片机原理
    单片机简化微型计算机CPU中身带存储器ROMRAMCPU片总线IC(集成电路)技术电路通特殊工艺做块硅基片封装成芯片CPU片外存储器等等
    单片机CPU晶振存储器址锁存器逻辑门七段译码器(显示器)钮扩展芯片接口等通PCB工艺做环氧树脂板样完整单片微型计算机
    1 LED显示数码
    常见LED显示具清晰明亮特点显示接口绝数单片机应系统必备部件
    发光二极组成显示器单片机应产品中常廉价输出设备干发光二极定规律排列成某发光二极导通时相应点笔画点亮控制组合二极导通显出种字符
    显示器结构
    常7段显示器结构图示发光二极阳极连起称阳极显示器阴极连起成阴显示器1位显示器8发光二极组成中7发光二极a~g控制7笔画亮暗控制数点亮暗种笔画七段显示器显示字符较少字符形状失真控简单方便

    电路设计框图

    工作原理:STC89C52控制系统单片机接受时钟电路温度传感器信号LCD显示电路中显示出通键电路显示时间闹钟报警温度进行设置
    三单元电路分析设计
    1.原理分析
    (1)复位电路晶振电路(电路图图二)
    复位电路电阻R1 KΩ电容C10uf键组成电动复位程序跑飞时单片机复位晶振电路12M晶振30pf电容组成
    参数计算:震荡周期1震荡频率机器周期震荡周期*12系统复位时间t应该2us (t2*(112)*122us)STC89C52规格书中关DC特性描述中知道Reset Pin电压超Min07Vcc时Reset Pin会认高电事先假设系统电压5VVcc里成5V 果 Reset Pin电压07Vcc35V成Reset Pin高电果超35V电持续时间超2uS系统会复位然计算RST_H处 电 位考虑流入Reset Pin 电流该 电 路 阶RC电路电容两端暂态电流电压关系式:

    设Reset pin 电压: 34V时t0357RC仅t0357RC≥2us时系统会复位满足条件RC≧R1KΩC10uf符合求
    STC89C52单片机核心选12MHZ晶振晶振频率越高单片机运行速度越快考虑单片机运行速度快会导致存储器求会变高12MHZ晶振佳选择晶振电路电容没固定值外接电容会影响振荡器频率高低振荡器稳定性起振快速性选择30pf电容作起振电容
    复位晶振电路图示

    键电路图

    显示电路LCD1602模块构成LCD1602液晶屏5V电压驱动带背光显示两行行16字符显示汉字液晶12端电源1516背光源防止直接加5V烧坏背光灯15脚串联1K电阻限流液晶3端液晶度调节端通10K变位器调节液晶显示度液晶4端液晶控制器写数写命令选择端接单片机P23口液晶5端读写选择端液晶中读取数写入命令显示数端始终选择写状态低电接液晶6端信号操作时必须信号接单片机P25口

    温度传感器
    温度检测电路数字温度传感器DS18B20构成传统热敏电阻等测温元件相直接读出测温度根实际求通简单编程实现912位数字值读数方式设计中DS18B20温度传感器进行环境温度采集转化单片机P20脚接DS18B20IO口脚作数读入写出口

    温度传感器
    时钟电路
    时钟电路DS13026pf电容32768M晶振组成时钟芯片DS1302单片机STC89C52接口3条线完成单片机STC89C52P10时钟芯片数传输端相连P11作DS1302输入时钟SCLK控制端P12控制DS1302复位输入端DS1302接标准32768KHZ石英晶体

    述完成Proturs中进行仿真仿真结果:


    实验设计结果仿真结果致

    四软件部分设计(部分程序框图)
    软件部分函数DS1302ds18B20LCD1602text五程序部分组成函数text驱动文件函数程序(具体程序见附页)
    void main()
    {
    IE0X82 开定时中断
    TMOD0X01 选择定时器0工作方式1
    TR00 启动定时器0
    IntDS1302() 初始化DS1302
    delay1ms(1)
    Lcd_Int() 1602液晶初始化
    delay1ms(2)
    displaystar() 显示欢迎界面
    displaymainpart() 显示部分(变化)
    while(1)
    {
    display_Time( )
    Set( )
    if(ADD0)
    {
    Write_com(0x01)
    delay1ms(5)
    Temperature()
    Write_com(0x01)
    displaymainpart()
    }
    if((hourshoura)&&(minutesminutea)&&(seconds0))
    {
    if(alarmmode1)
    {
    Write_com(0x01)
    delay1ms(5)
    Write_Address(0x03)
    Write_Date('T')
    Write_Date('I')
    Write_Date('M')
    Write_Date('E')
    Write_Address(0x08)
    Write_Date('U')
    Write_Date('P')
    Write_Date('')
    delay1ms(5)
    while(1)
    {
    baojing(1)
    if(CANL0)
    {
    Write_com(0x01)
    delay1ms(5)
    displaymainpart()
    break
    }
    }
    }
    }
    }

    }
    程序框图图:


    实现功:程序功调DS1302DS18B20LCD1602键扫描四模块函数实现整系统运行功实现
    LCD1602模块液晶显示模块驱动程序调该模块程序液晶显示屏显示单片机DS1302DS18B20中读取时间温度值
    DS18B20模块温度传感器驱动程序调该模块程序读出刻温度值
    DS1302模块时钟芯片驱动程序实现单片机DS1302时钟芯片间通信调里面程序实现时间初始化调整时间写入时钟芯片实现单片机时钟芯片中读取出刻时间者调整时间
    键扫描模块实现键扫描时间温度显示通键扫描实现时间调整
    五丶系统测试结果
    功测试实际电路测试前先软件仿真仿真概整电路功设计基功实现LCD1602显示时间温度键设置复位电路电路复位仿真软件实现STC89C52开发板载程序然安装设计实际电路中LCD1602DS18B20DS1302器件安装然通电测试实际电路中功开启总开关LCD1602显示时间温度然调节K1K2K3K4键时间温度进行设置K1键选择设置位置K2键进行+操作K3键进行—操作K4键进行状态确定K5键进行状态复位复位键系统动复位通实际电路中测试软件仿真实现结果基完成整设计
    六丶心体会
    次电路设计中开始时候原理框架画出确定选器件否符合求然根器件写出程序进行仿真仿真成功开始画PCB时画PCB时没分配布局导致制板完成发现LCD1602单片机STC89C52距离造成调制程中键温度传感器操作时方便电路板功实现完全觉测试必须仅找出设计问题缺陷重新复设计东西知识点时提高设计力电路分析力时软件编程方面更高提高编程力加强学知识提高巩固
    七参考文献
    [1]郭天祥51单片机c语言教程 电子工业出版社2009
    [2]边春元C51单片机典型模块设计应[M]北京:机械工业出版社2008
    [3]高 歌Altium Designer电子设计应教程清华学出版社2011
    [4]戴仙金51单片机c语言程序开发实例清华学出版社2008
    [5]边春元C51单片机典型模块设计应[M]北京:机械工业出版社2008

    附页
    实验具体程序:
    #include
    #include
    unsigned char code displaywelcome[]{ Welcome To My Lcd Timer}欢迎界面
    unsigned char code displaywish[]{ Happy Every Day ^_^} 欢迎界面
    unsigned char code overtemperature[]{OVERTEMPERATURE}
    unsigned char code digit[]{0123456789} 数字代码
    unsigned char modeTHTLTNTDlengthtempswitchMaxtemp40amodealarmmodeminuteshours
    minuteasecondshoura12
    sbit SCLKP1^0 DS1302时钟输入
    sbit DATEP1^1 DS1302数输入
    sbit RESTP1^2 DS1302复位端口
    sbit SETP1^4 DS1302设置模式选择位
    sbit ADDP1^5 增加
    sbit REDP1^6 减
    sbit CANLP1^7
    void delay1ms(int i)1毫秒延时
    {
    int jk
    while(i)
    for(j76j>1j)
    for(k29k>1k)
    }
    void delaynus(unsigned char n) 延时干微秒
    {
    unsigned char i
    for(i0i}
    ***********蜂鸣器模块************
    sbit beepP3^6 位定义定义P6位fmp
    void dely500(void)
    {
    unsigned char i
    for(i250i>0i)
    {
    _nop_()
    }
    }
    void baojing(unsigned char n)
    {
    unsigned char xi
    while(n)
    {
    for(i0i<5i++)
    {
    for(x0x<200x++)
    {
    beep~beep
    dely500()
    }
    }
    for(i0i<3i++)
    {
    for(x0x<200x++)
    {
    beep~beep
    dely500()
    dely500()
    }
    }
    }
    }
    *******DS1302模块*************
    void Write1302(unsigned char date)1302写数
    {
    unsigned char i
    SCLK0
    delaynus(2)
    for(i0i<8i++)
    {
    DATEdate&0x01
    SCLK1
    delaynus(2)
    SCLK0
    delaynus(2)
    date>>1

    }
    }
    void WriteSet1302(unsigned char cmdunsigned char date) 根相应命令输入相应数
    {
    REST0
    SCLK0
    REST1
    Write1302(cmd)
    delaynus(5)
    Write1302(date)
    SCLK1
    REST0
    }
    unsigned char Read1302(void) 读取1302数
    {
    unsigned char idate
    delaynus(2)
    for(i0i<8i++)
    {
    date>>1
    if(DATE1)
    date|0x80
    SCLK1
    delaynus(2)
    SCLK0
    delaynus(2)
    }
    return date
    }
    unsigned char ReadSet1302(unsigned char cmd)根命令读取1302相应值
    {
    unsigned char date
    REST0
    SCLK0
    REST1
    Write1302(cmd)
    delaynus(2)
    dateRead1302()
    SCLK1
    REST0
    return date
    }
    void IntDS1302(void) DS1302初始化
    {
    unsigned char flag

    flag ReadSet1302(0x81)
    if(flag&0x80) { 判断时钟芯片否关闭
    WriteSet1302(0x8E0x00) 根写状态寄存器命令字写入保护指令
    WriteSet1302(0x80((010)<<4|(010))) 根写秒寄存器命令字写入秒初始值
    WriteSet1302(0x82((010)<<4|(010))) 根写分寄存器命令字写入分初始值
    WriteSet1302(0x84((010)<<4|(010))) 根写时寄存器命令字写入时初始值
    WriteSet1302(0x86((010)<<4|(010))) 根写日寄存器命令字写入日初始值
    WriteSet1302(0x88((010)<<4|(010))) 根写月寄存器命令字写入月初始值
    WriteSet1302(0x8c((1010)<<4|(1010))) 根写年寄存器命令字写入年初始值
    WriteSet1302(0x900xa5) 开充电功 选择2K电阻充电方式
    WriteSet1302(0x8E0x80) 根写状态寄存器命令字写入保护指令
    }
    }
    ***************液晶显示模块*****************
    sbit RSP2^5
    sbit RWP2^6
    sbit EP2^7
    sbit BFP0^7
    *液晶忙检测*
    bit BusyTest(void)
    {
    bit result
    RS0
    RW1
    E1
    _nop_()
    _nop_()
    _nop_()
    resultBF
    _nop_()
    _nop_()
    _nop_()
    E0
    return result
    }
    *写指令*
    void Write_com(unsigned char command)
    {
    while(BusyTest()0)
    RS0
    RW0
    E0
    _nop_()
    _nop_()
    _nop_()
    P0command
    _nop_()
    _nop_()
    _nop_()
    E1
    _nop_()
    _nop_()
    _nop_()
    E0
    }
    *写址*
    void Write_Address(unsigned char address)
    {
    Write_com(address|0x80)
    delay1ms(1)
    }
    *写数*
    void Write_Date(unsigned char date)
    {
    RS1
    RW0
    E0
    _nop_()
    _nop_()
    _nop_()
    P0date
    _nop_()
    _nop_()
    _nop_()
    E1
    _nop_()
    _nop_()
    _nop_()
    E0
    delay1ms(1)
    }
    *初始化*
    void Lcd_Int(void)
    {
    Write_com(0x38)
    delay1ms(1)
    Write_com(0x38)
    delay1ms(1)
    Write_com(0x06)
    delay1ms(1)
    Write_com(0x0c)
    delay1ms(1)
    Write_com(0x01)
    }
    void displaymainpart(void)显示液晶部分(变化部分)
    {
    Write_Address(0x01)
    delay1ms(1)
    Write_Date('D')
    Write_Date('A')
    Write_Date('T')
    Write_Date('E')
    Write_Date('')
    delay1ms(1)
    Write_Address(0x0A)
    delay1ms(1)
    Write_Date('')
    Write_Address(0x0D)
    Write_Date('')
    Write_Address(0x42)
    Write_Date('T')
    Write_Date('I')
    Write_Date('M')
    Write_Date('E')
    Write_Date('')
    Write_Address(0x4A)
    Write_Date('')
    Write_Address(0x4D)
    Write_Date('')
    Write_Address(0x06)
    Write_Date('2')
    Write_Date('0')
    }
    void display_Second(unsigned char second) 液晶显示秒
    {
    unsigned char ij
    isecond10
    jsecond10
    Write_Address(0x4E)
    Write_Date(digit[i])
    Write_Date(digit[j])
    delay1ms(1)
    }
    void display_Minute(unsigned char minute) 液晶显示分
    {
    unsigned char ij
    iminute10
    jminute10
    Write_Address(0x4B)
    Write_Date(digit[i])
    Write_Date(digit[j])
    delay1ms(1)
    }
    void display_Hour(unsigned char hour) 液晶显示时
    {
    unsigned char ij
    ihour10
    jhour10
    Write_Address(0x48)
    Write_Date(digit[i])
    Write_Date(digit[j])
    delay1ms(1)
    }
    void display_Day(unsigned char day) 液晶显示日
    {
    unsigned char ij
    iday10
    jday10
    Write_Address(0x0E)
    Write_Date(digit[i])
    Write_Date(digit[j])
    delay1ms(1)
    }
    void display_Month(unsigned char month) 液晶显示月
    {
    unsigned char ij
    imonth10
    jmonth10
    Write_Address(0x0B)
    Write_Date(digit[i])
    Write_Date(digit[j])
    delay1ms(1)
    }
    void display_Year(unsigned char year) 液晶显示年
    {
    unsigned char ij
    iyear10
    jyear10
    Write_Address(0x08)
    Write_Date(digit[i])
    Write_Date(digit[j])
    delay1ms(1)
    }
    void display_houra(unsigned char x) 闹钟时部分显示
    {
    unsigned char ij
    ix10
    jx10
    Write_Address(0x44)
    Write_Date(digit[i])
    Write_Date(digit[j])
    }
    void display_minutea(unsigned char x)闹钟分钟部分显示
    {
    unsigned char ij
    ix10
    jx10
    Write_Address(0x47)
    Write_Date(digit[i])
    Write_Date(digit[j])
    }
    void display_Time(void) 显示实时时间
    {
    unsigned char valuedaymonthyear
    Write_com(0x0c)
    valueReadSet1302(0x81)
    seconds(((value&0x70)>>4)*10+(value&0x0f))
    display_Second(seconds)
    valueReadSet1302(0x83)
    minutes(((value&0x70)>>4)*10+(value&0x0f))
    display_Minute(minutes)
    valueReadSet1302(0x85)
    hours(((value&0x70)>>4)*10+(value&0x0f))
    display_Hour(hours)
    valueReadSet1302(0x87)
    day(((value&0x70)>>4)*10+(value&0x0f))
    display_Day(day)
    valueReadSet1302(0x89)
    month(((value&0x70)>>4)*10+(value&0x0f))
    display_Month(month)
    valueReadSet1302(0x8D)
    year(((value&0xf0)>>4)*10+(value&0x0f))
    display_Year(year)
    }
    void displaystar(void) 显示欢迎界面
    {
    unsigned char ij
    Write_Address(0x0f)
    while(displaywelcome[i]'\0')
    {
    Write_Date(displaywelcome[i])
    i++
    delay1ms(1)
    }
    i0
    Write_Address(0x4f)
    while(displaywish[i]'\0')
    {
    Write_Date(displaywish[i])
    i++
    delay1ms(1)
    }
    j40
    while(j)
    {
    Write_com(0x18)循环左移
    delay1ms(700)
    }
    Write_com(0x01)
    delay1ms(10)
    }
    void gbdisplay(unsigned char address) 时间调整时光标闪烁
    {
    Write_Address(address)
    delay1ms(5)
    Write_com(0x0f)
    delay1ms(5)
    }
    void displaymaxt(unsigned char x) 显示温度
    {
    unsigned char ijk
    Write_com(0x0c)
    delay1ms(2)
    Write_Address(0x44)
    ix100
    jx10
    kx10
    Write_Date(digit[i])
    Write_Date(digit[j])
    Write_Date(digit[k])
    }
    *****************时间调整部分*********************
    void hourset(void) 调时
    {
    unsigned char timevaluehour
    delay1ms(500) 防止次触发
    WriteSet1302(0x8e0x00)写保护掉确保正常调整数值写入DS1302
    timevalueReadSet1302(0x85) 读取时数值
    hour(((timevalue&0x70)>>4)*10+(timevalue&0x0f))
    while(1)
    {

    if(ADD0)
    {
    delay1ms(50)
    if(ADD0)
    {
    hour++
    delay1ms(300)
    while(ADD0)
    }
    }
    if(RED0)
    {
    delay1ms(50)
    if(RED0)
    {
    hour
    delay1ms(300)
    if(hour0) hour23
    while(RED0)
    }
    }
    timevalue(((hour)10)<<4|(hour10))
    WriteSet1302(0x84timevalue)
    delay1ms(1)
    display_Hour(hour)
    Write_Address(0x49)
    delay1ms(5)
    if(hour>24) hour0
    delay1ms(5)
    if(CANL0)
    {
    mode0
    Write_com(0x0c)
    break
    }
    if(SET0) break
    }
    WriteSet1302(0x8e0x80)
    }
    void minuteset(void) 调分
    {
    unsigned char timevalueminute
    delay1ms(500)
    WriteSet1302(0x8e0x00)
    timevalueReadSet1302(0x83)
    minute(((timevalue&0x70)>>4)*10+(timevalue&0x0f))
    while(1)
    {
    if(ADD0)
    {
    delay1ms(10)
    if(ADD0)
    {
    minute++
    if(minute>60) timevalue0
    while(ADD0)
    }
    }
    if(RED0)
    {
    delay1ms(10)
    if(RED0)
    {
    minute
    delay1ms(300)
    if(minute0) minute59
    while(RED0)
    }
    }
    timevalue((minute10)<<4|(minute10))
    WriteSet1302(0x82timevalue)
    delay1ms(1)
    display_Minute(minute)
    Write_Address(0x4c)
    delay1ms(5)
    if(minute>60) minute0
    delay1ms(5)
    if(CANL0)
    {
    mode0
    Write_com(0x0c)
    break
    }
    if(SET0) break
    }
    WriteSet1302(0x8e0x80)
    }
    void secondset(void) 秒零
    {
    unsigned char second
    delay1ms(500)
    WriteSet1302(0x8e0x00)
    while(1)
    {
    if(ADD0)
    {
    delay1ms(10)
    if(ADD0)
    {
    second0
    WriteSet1302(0x800x00)
    while(ADD0)
    }
    }
    delay1ms(1)
    display_Second(second)
    Write_Address(0x4f)
    delay1ms(5)
    if(CANL0)
    {
    mode0
    Write_com(0x0c)
    break
    }
    if(SET0) break
    }
    WriteSet1302(0x8e0x80)
    }
    void yearset(void) 调年
    {
    unsigned char datevalueyear
    delay1ms(500)
    WriteSet1302(0x8e0x00)
    datevalueReadSet1302(0x8d)
    year(((datevalue&0x70)>>4)*10+(datevalue&0x0f))
    while(1)
    {
    if(ADD0)
    {
    delay1ms(10)
    if(ADD0)
    {
    year++
    while(ADD0)
    }
    }
    if(RED0)
    {
    delay1ms(10)
    if(RED0)
    {
    year
    delay1ms(300)
    while(RED0)
    }
    }
    datevalue((year10)<<4|(year10))
    WriteSet1302(0x8cdatevalue)
    delay1ms(5)
    display_Year(year)
    delay1ms(5)
    Write_Address(0x09)
    delay1ms(5)
    if(CANL0)
    {
    mode0
    Write_com(0x0c)
    break
    }
    if(SET0) break
    }
    WriteSet1302(0x8e0x80)
    }
    void monthset(void) 调月
    {
    unsigned char datevaluemonth
    delay1ms(500)
    WriteSet1302(0x8e0x00)
    datevalueReadSet1302(0x89)
    month(((datevalue&0x70)>>4)*10+(datevalue&0x0f))
    while(1)
    {
    if(ADD0)
    {
    delay1ms(10)
    if(ADD0)
    {
    month++
    if(month>12) month1
    while(ADD0)
    }
    }
    if(RED0)
    {
    delay1ms(10)
    if(RED0)
    {
    month
    delay1ms(300)
    if(month0) month12
    while(RED0)
    }
    }
    datevalue((month10)<<4|(month10))
    WriteSet1302(0x88datevalue)
    delay1ms(1)
    display_Month(month)
    Write_Address(0x0c)
    delay1ms(5)
    if(CANL0)
    {
    mode0
    Write_com(0x0c)
    break
    }
    if(SET0) break
    }
    WriteSet1302(0x8e0x80)
    }
    void dayset(void) 调日
    {
    unsigned char datevalueday
    delay1ms(500)
    WriteSet1302(0x8e0x00)
    datevalueReadSet1302(0x87)
    day(((datevalue&0x70)>>4)*10+(datevalue&0x0f))
    while(1)
    {
    if(ADD0)
    {
    delay1ms(10)
    if(ADD0)
    {
    day++
    if(day>31) day1
    while(ADD0)
    }
    }
    if(RED0)
    {
    delay1ms(10)
    if(RED0)
    {
    day
    delay1ms(300)
    if(day0) day31
    while(RED0)
    }
    }
    datevalue((day10)<<4|(day10))
    WriteSet1302(0x86datevalue)
    delay1ms(1)
    display_Day(day)
    Write_Address(0x0f)
    delay1ms(5)
    if(CANL0)
    {
    mode0
    Write_com(0x0c)
    break
    }
    if(SET0) break
    }
    WriteSet1302(0x8e0x80)
    }
    void alarmhourset(void) 闹钟时调整
    {
    unsigned char value
    valuehoura
    while(1)
    {
    if(ADD0)
    {
    delay1ms(20)
    if(ADD0)
    {
    Write_com(0x0c)
    delay1ms(5)
    value++
    if(value>23) value0
    while(ADD0)
    }
    }
    if(RED0)
    {
    delay1ms(20)
    if(RED0)
    {
    value
    if(value0) value23
    while(RED0)
    }
    }
    houravalue
    display_houra(houra)
    gbdisplay(0x45)
    if(CANL0)
    {
    delay1ms(500)
    break
    }
    }
    }
    void alarmminuteset(void) 闹钟分钟调整
    {
    while(1)
    {
    if(ADD0)
    {
    delay1ms(20)
    if(ADD0)
    {
    minutea++
    if(minutea>59) minutea0
    while(ADD0)
    }
    }
    if(RED0)
    {
    delay1ms(20)
    if(RED0)
    {
    minutea
    if(minutea0) minutea59
    while(RED0)
    }
    }
    display_minutea(minutea)
    gbdisplay(0x48)
    if(CANL0)
    {
    delay1ms(500)
    break
    }
    }
    }
    void TimeSet(void) 时间调整函数
    {
    display_Time()
    if(SET0)
    {
    delay1ms(10)
    if(SET0)
    {
    mode++
    delay1ms(20)
    switch(mode)
    {
    case(1){gbdisplay(0x48)hourset() delay1ms(500)} break
    case(2){gbdisplay(0x4c)minuteset()delay1ms(500)} break
    case(3){gbdisplay(0x4f)secondset()delay1ms(500)} break
    case(4){gbdisplay(0x09)yearset()delay1ms(500)} break
    case(5){gbdisplay(0x0c)monthset()delay1ms(500)} break
    case(6){gbdisplay(0x0f)dayset()delay1ms(500)} break
    }
    if(mode7) mode0
    }
    }
    }
    ***************显示温度模块********************
    unsigned char code displayexplain[]{Digit thermometer}
    unsigned char code displayerror[]{DS18B20 ERROR}
    unsigned char code displayerror1[]{PLEASE CHECK }
    unsigned char code displaypart1[]{WenDu}
    unsigned char code displaypart2[]{Cent}
    unsigned char flag
    **********************操作DS18B20模块***************************
    sbit DQP3^3
    unsigned char time
    **********************DS18B20初始化****************************
    bit IntDS18B20(void)
    {
    bit temp
    DQ1
    for(time0time<2time++)
    DQ0
    for(time0time<200time++)
    DQ1
    for(time0time<10time++)
    tempDQ
    for(time0time<200time++)
    return temp
    }
    **************************读DS18B20**********************
    unsigned char ReadDS18B20(void)
    {
    unsigned char i
    unsigned char dat
    for(i0i<8i++)
    {
    DQ1
    _nop_()
    DQ0
    _nop_()
    DQ1
    for(time0time<2time++)
    dat>>1
    if(DQ1)
    datdat|0x80
    else
    datdat|0x00
    for(time0time<10time++)
    }
    return dat
    }
    *********************DS18B20写数**************************
    void WriteDS18B20(unsigned char date)
    {
    unsigned char i
    for(i0i<8i++)
    {
    DQ1
    _nop_()
    DQ0
    DQdate&0x01
    for(time0time<10time++)
    DQ1
    for(time0time<1time++)
    date>>1

    }
    for(time0time<4time++)
    }
    *******************读取温度做准备************************
    void ReadyreadDS18B20(void)
    {
    IntDS18B20()
    WriteDS18B20(0XCC)
    WriteDS18B20(0X44)
    delay1ms(200)
    IntDS18B20()
    WriteDS18B20(0XCC)
    WriteDS18B20(0XBE)

    }
    *************1602液晶显示相关信息模块**********************
    ****************未检测DS18B20时显示信息模块****************
    void Display_Error(void)
    {
    unsigned char i0
    Write_Address(0x00)
    while(displayerror[i]'\0')
    {
    Write_Date(displayerror[i])
    i++
    delay1ms(100)
    }
    delay1ms(5)
    i0
    Write_Address(0x40)
    while(displayerror1[i]'\0')
    {
    Write_Date(displayerror1[i])
    i++
    delay1ms(100)
    }
    delay1ms(3000)
    }
    *************温度显示模块****************
    void Display_Explain(void)
    {
    unsigned char i0
    Write_Address(0x00)
    delay1ms(5)
    while(displayexplain[i]'\0')
    {
    Write_Date(displayexplain[i])
    i++
    delay1ms(5)
    }
    i0
    Write_Address(0x40)
    while(displaypart1[i]'\0')
    {
    Write_Date(displaypart1[i])
    i++
    delay1ms(5)
    }
    i0
    Write_Address(0x4C)
    while(displaypart2[i]'\0')
    {
    Write_Date(displaypart2[i])
    i++
    delay1ms(5)
    }
    Write_Address(0x49)
    Write_Date('')
    delay1ms(5)
    }
    *********************显示温度整数部分*************************
    void Display_Integer(unsigned char x)
    {
    unsigned char ijk
    ix100
    jx10010
    kx10
    Write_Address(0x46)
    if(flag1) Write_Date('')
    Write_Date(digit[i])
    Write_Date(digit[j])
    Write_Date(digit[k])
    delay1ms(50)
    }
    ************显示温度数部分*********************
    void Display_Decimal(unsigned char x)
    {
    Write_Address(0x4A)
    delay1ms(5)
    Write_Date(digit[x])
    delay1ms(50)
    }
    void displayovert(void)
    {
    unsigned char i
    Write_com(0x01)
    delay1ms(10)
    Write_Address(0x03)
    delay1ms(10)
    Write_Date('W')
    Write_Date('A')
    Write_Date('R')
    Write_Date('N')
    Write_Date('I')
    Write_Date('N')
    Write_Date('G')
    Write_Date('')
    Write_Address(0x40)
    while(overtemperature[i]'\0')
    {
    Write_Date(overtemperature[i])
    i++
    delay1ms(10)
    }
    }
    *******************温度函数********************
    void Temperature(void)
    {
    unsigned char i
    delay1ms(5)
    if(IntDS18B20()0) Display_Error()
    else
    {
    delay1ms(1)
    Write_com(0x01)
    delay1ms(5)
    Display_Explain()
    for(length50length>0length)
    {
    for(i0i<6i++)
    {
    flag0
    ReadyreadDS18B20()
    TLReadDS18B20()
    THReadDS18B20()
    if((TH&0XF8)0X00)
    {
    flag1
    TL~TL
    TH~TH
    TL+1
    if(TL>255) TH+1
    TNTH*16+TL16
    TD(TL16)*1016
    }
    TNTH*16+TL16
    TD(TL16)*1016
    Display_Integer(TN)
    Display_Decimal(TD)
    delay1ms(10)
    }
    if(tempswitch1)
    {
    if(TN>Maxtemp)
    {
    Write_Address(0x03)
    delay1ms(5)
    displayovert()
    while(1)
    {
    baojing(1)
    if(CANL0)
    {
    Write_com(0x01)
    delay1ms(5)
    break
    }
    }
    }
    }
    if(CANL0) break
    }
    }
    }
    void tempset(void)
    {
    if(ADD0)
    {
    delay1ms(10)
    if(ADD0)
    {
    Maxtemp++
    while(ADD0)
    }
    }
    if(RED0)
    {
    delay1ms(10)
    if(RED0)
    {
    Maxtemp
    while(RED0)
    }
    }
    }
    void Maxtempset(void) 高温报警设置
    {
    Write_com(0x01)
    delay1ms(10)
    Write_Address(0x03)
    delay1ms(10)
    Write_Date('T')
    Write_Date('E')
    Write_Date('M')
    Write_Date('P')
    Write_Address(0x09)
    Write_Date('S')
    Write_Date('E')
    Write_Date('T')
    Write_Address(0x40)
    Write_Date('M')
    Write_Date('A')
    Write_Date('X')
    Write_Date('')
    while(1)
    {
    if(SET0)
    {
    delay1ms(20)
    if(SET0)
    {
    Write_Address(0x4e)
    Write_com(0x0f)
    while(1)
    {
    if(ADD0)
    {
    delay1ms(20)
    if(ADD0)
    {
    Write_Address(0x4b)
    delay1ms(5)
    Write_Date('O')
    Write_Date('N')
    Write_Date(' ')
    tempswitch1
    }
    }
    if(RED0)
    {
    delay1ms(20)
    if(RED0)
    {
    Write_Address(0x4b)
    Write_Date('O')
    Write_Date('F')
    Write_Date('F')
    tempswitch0
    }
    }
    if(CANL0)
    {
    delay1ms(500)
    break
    }
    }
    }
    }
    if(tempswitch1)
    {
    Write_Address(0x4b)
    Write_Date('O')
    Write_Date('N')
    Write_Date(' ')
    tempset()
    displaymaxt(Maxtemp)
    if(CANL0)
    {
    Write_com(0x01)
    displaymainpart()
    break
    }
    }
    if(tempswitch0)
    {
    Write_com(0x0c)
    Write_Address(0x4b)
    Write_Date('O')
    Write_Date('F')
    Write_Date('F')
    }
    if(CANL0)
    {
    Write_com(0x01)
    displaymainpart()
    break
    }
    }
    }
    void alarmswitchset(void)
    {
    while(1)
    {
    if(ADD0)
    {
    delay1ms(100)
    if(ADD0)
    {
    alarmmode1
    Write_Address(0x4c)
    Write_Date('O')
    Write_Date('N')
    Write_Date(' ')
    }
    }
    if(RED0)
    {
    alarmmode0
    Write_Address(0x4c)
    Write_Date('O')
    Write_Date('F')
    Write_Date('F')
    }
    if(CANL0)
    {
    delay1ms(500)
    break
    }
    }
    }
    **************** 设置模块 ******************
    void Set(void)
    {
    if(SET0)
    {
    delay1ms(10)
    if(SET0)
    {
    Write_Address(0x40)
    Write_Date('T')
    Write_com(0x0f)
    delay1ms(1000)
    Write_com(0x0c)
    while(1)
    {
    TimeSet()
    if(ADD0)
    {
    delay1ms(20)
    if(ADD0)
    {
    Write_com(0x01)
    Write_Address(0x00)
    delay1ms(5)
    Write_Date('S')
    delay1ms(10)
    Maxtempset()
    }
    }
    if(RED0)
    {
    delay1ms(20)
    if(RED0)
    {
    Write_com(0x01)
    delay1ms(5)
    Write_Address(0x02)
    Write_Date('A')
    Write_Date('L')
    Write_Date('A')
    Write_Date('R')
    Write_Date('M')
    Write_Address(0x09)
    Write_Date('S')
    Write_Date('E')
    Write_Date('T')
    Write_Address(0x46)
    Write_Date('')
    display_houra(houra)
    display_minutea(minutea)
    if(alarmmode1)
    {
    Write_Address(0x4c)
    Write_Date('O')
    Write_Date('N')
    Write_Date(' ')
    }
    if(alarmmode0)
    {
    Write_Address(0x4c)
    Write_Date('O')
    Write_Date('F')
    Write_Date('F')
    }
    while(1)
    {
    if(SET0)
    {
    delay1ms(100)
    if(SET0)
    {
    amode++
    switch(amode)
    {
    case(1){gbdisplay(0x45)alarmhourset()Write_com(0x0c)delay1ms(500)} break
    case(2){gbdisplay(0x48)alarmminuteset()Write_com(0x0c)delay1ms(500)} break case(3){gbdisplay(0x4c)alarmswitchset()Write_com(0x0c)delay1ms(500)} break
    }
    if(amode4) amode0
    }
    }
    if(CANL0)
    {
    Write_com(0x01)
    delay1ms(5)
    displaymainpart()
    break
    }
    }
    }
    }
    if(CANL0)
    {
    Write_Address(0x40)
    Write_Date(' ')
    Write_com(0x0c)
    break
    }
    }
    }

    }
    }
    ***************函数**********************
    void main()
    {
    IE0X82 开定时中断
    TMOD0X01 选择定时器0工作方式1
    TR00 启动定时器0
    IntDS1302() 初始化DS1302
    delay1ms(1)
    Lcd_Int() 1602液晶初始化
    delay1ms(2)
    displaystar() 显示欢迎界面
    displaymainpart() 显示部分(变化)
    while(1)
    {
    display_Time( )
    Set( )
    if(ADD0)
    {
    Write_com(0x01)
    delay1ms(5)
    Temperature()
    Write_com(0x01)
    displaymainpart()
    }
    if((hourshoura)&&(minutesminutea)&&(seconds0))
    {
    if(alarmmode1)
    {
    Write_com(0x01)
    delay1ms(5)
    Write_Address(0x03)
    Write_Date('T')
    Write_Date('I')
    Write_Date('M')
    Write_Date('E')
    Write_Address(0x08)
    Write_Date('U')
    Write_Date('P')
    Write_Date('')
    delay1ms(5)
    while(1)
    {
    baojing(1)
    if(CANL0)
    {
    Write_com(0x01)
    delay1ms(5)
    displaymainpart()
    break
    }
    }
    }
    }
    }

    }

    文档香网(httpswwwxiangdangnet)户传

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

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

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

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

    下载文档

    相关文档

    万年历课程设计报告

    课程设计报告课程名称程序设计基础专周题目年历显示姓 名XX班 级XXXXXX学 号XX指导教师XXX设计时间2015-03-02至2015-03-06XX学院计算机工程系XX...

    3年前   
    567    0

    实场营销实训报告

    实场营销实训报告  我们这周上的实训课是市场营销实训。我们小组自实训课开始就一直在一起,这次的实训也不例外,。这次实训的主要目标人群是学生家长及校内学生们。这是个符合我们目前状况的实训,现在的...

    10年前   
    692    0

    windows实训报告

    实训是教学工作的重要环节,是课堂理论教学的检验和延续,是培养学生实践技能的重要场所。通过实训,使学生能够完成企业windows服务器的配置、管理与维护。通过实际操作,使学生掌握一定的操作技能,能...

    3年前   
    2047    0

    实训报告总结

    实训报告总结  我校组织的为期两周的实训马上就要结束了,心中有些不舍,从第一天满怀激动的来到与学校合作的玛世电子商务公司到现在要结束的实训,虽然只有短短两周时间,但我收获很多知识性的东西。以前...

    12年前   
    895    0

    实训报告

    三年的大学即将结束,在基本完成了各个专业的基础课,专业课的学习任务的基础上。进行了为期12周的专业课程实验。在虚拟贸易平台中,同学们都参与扮演进出口业务中的不同当事人,在这个共同组成的贸易环境里...

    5年前   
    1744    0

    物流实训报告

    物流实训报告  物流实训报告  目  录  一、实训内容... 2  二、实训目的... 2  三、实训中遇到的问题... 2  四、三种角色具体流程分析... 3  五、实训感想及心得体会....

    12年前   
    772    0

    实训报告

    人力资源管理沙盘模拟实验报告                            ——G组 1、企业基本情况 公司名称:创世集团(简称CS)    法人代表:包程程 成立时间:201...

    9年前   
    7861    0

    护理实训报告

    护理实训报告  学院                                      系部                                      班级      ...

    9年前   
    850    0

    铣床实训报告

    铣床实训报告  短短两周的金工实习,随着昨天下午最后一节笔试的结束而结束了。在这段时间,我学到了很多东西,见识了许多新奇的工艺,也了解到了技工人员的工作环境。我想这两周的实习将给我以后的工作带...

    11年前   
    1071    0

    实训报告总结

    实训报告总结  历经为期两个星期的实训能力扩展训练,在我们彼此的心目中有着或多或少的感悟!   前个星期的钳工实训使我更加了解到了划线,錾削,锯切,锉削,钻孔,绞孔,刮削等加工过程。同时也发现...

    12年前   
    900    0

    实训报告

    实训报告  一、实训时间:  二、实训目的:了解普通车床的工作原理,工作方式、结构特点各部件的用途,并掌握普通车床和立式升降铣床的基本操作。车工对应的机器主要是车床,车床主要由变速箱、主轴箱、...

    8年前   
    665    0

    ERP实训报告

    ERP实训报告  提示:在为期一周的erp实训中我认识和学习到erp系统及在企业运营中的重要性及涉及到的一些跨学科的知识。由此可以了解企业的运营过程、身临其境的进行操作,真正感受一个企业经营者...

    10年前   
    703    0

    会计实训报告

    会计实训报告  年级专业班级:  学        号:  姓        名:  提 交  日 期:  一、    实训基本情况  (一)实训时间:2012年9月6日――9月30日  (二...

    10年前   
    712    0

    社会实训报告

    社会实训报告 2010年1月,我有幸成为一名在社区工作的人员,在两年多的时间里,使我走向社会,接触社会,了解社会,熟悉社会,投身社会的良好形式,我觉得自己对社会工作专业有了更深一步的了解,让...

    12年前   
    11856    0

    实训6 BIOS设置实训报告

    实训6 BIOS设置实训报告实训内容进行常用的BIOS选项设置,包括系统日期和时间设置、超级用户密码和用户密码的设置、启动设备顺序设置、保存修改、不保存修改等;对照主板说明书和BIOS设置程序...

    4年前   
    1471    0

    经营之道(ERP实训)实训报告

    报告成绩: 教师签名: ...

    3年前   
    1053    0

    实训5 组装微机实训报告

    实训5 组装微机实训报告实训内容按要求进行主板部件组装、主机各部件组装及连接、整机连接。实训要求通过微机的实际组装,熟悉微机的组装顺序,掌握微机组装技术和方法。在组装过程中,逐步填写微机组装进...

    4年前   
    1177    0

    工程测量实训报告

    工程测量实训报告  在XX至XX学年第二学年十五,十六周,我们进行了为期14天的工程测量实习.我们一共分成九个小组,每个小组都配一个女生,可能是担心我们男生心不够细吧,测量开始之后我们小组各有...

    9年前   
    606    0

    动画造型 实训报告

    动画造型 实训报告 实训项目 面部结构 指导教师 张雪松 实训时间 11.5  5~8节 实训地点 实训楼A507 实训目的 了解课程基本内容;讲解面部的基本比例结构。 ...

    11年前   
    12186    0

    文档管理实训报告

    文档管理实训报告  通过两周的文档管理实训,不仅仅是巩固了课堂的理论知识,弄清模糊知识点,扩充知识;而且提高了文书文书处理,档案整理等档案工作的日常工作实操能力;更重要的是通过实训培养自身严谨...

    9年前   
    706    0

    文档贡献者

    文***享

    贡献于2022-10-04

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

    该用户的其他文档