毕业设计基于单片机的可编程作息时间控制器设计样本_第1页
毕业设计基于单片机的可编程作息时间控制器设计样本_第2页
毕业设计基于单片机的可编程作息时间控制器设计样本_第3页
毕业设计基于单片机的可编程作息时间控制器设计样本_第4页
毕业设计基于单片机的可编程作息时间控制器设计样本_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

扬州大学能源与动力工程学院题目:可编程作息时间控制器设计课程:单片机原理及应用课程设计专业:电气工程及其自动化班级:姓名:学号:

第一部分任务书

《单片机原理及应用》课程设计任务书一、课题名称详见《单片机课程设计题目(一)》:重要是软件仿真,运用Proteus软件进行仿真设计并调试;《单片机课程设计题目(二)》:重要是硬件设计,运用单片机周立功实验箱进行设计并调试。二、课程设计目课程设计是课程教学中一项重要内容,是达到教学目的重要环节,是综合性较强实践教学环节,它对协助学生全面牢固地掌握课堂教学内容、培养学生实践和实际动手能力、提高学生全面素质具备很重要意义。《单片机原理及应用》是一门理论性、实用性和实践性都很强课程,课程设计环节应占有更加重要地位。单片机原理及应用课程设计目是让学生在理论学习基本上,通过完毕一种涉及MCS-51单片机各种资源应用并具备综合功能小系统目的板设计与编程应用,使学生不但能将课堂上学到理论知识与实际应用结合起来,并且能进一步加深对电子电路、电子元器件等知识结识与理解,同步在软件编程、排错调试、有关软件和仪器设备使用技能等方面得到较全面锻炼和提高。为此后可以独立进行某些单片机应用系统开发设计工作打下一定基本。通过单片机硬件和软件设计、调试、整顿资料等环节培训,使学生初步掌握工程设计办法和组织实践基本技能,逐渐熟悉开展科学实践程序和办法。三、课程设计内容设计以89C51单片机和外围元器件构成单片机应用系统,并完毕相应软硬件调试。1.系统方案设计:综合运用单片机课程中所学到理论知识,学生依照所选课题任务、规定和条件进行总体方案设计。2.硬件电路设计:对方案中以单片机为核心电路进行设计计算,涉及元器件选取和电路参数计算,并画出总体电路图。3.软件设计:依照已设计出软件系统框图,用汇编语言或C51编制出各功能模块子程序和整机软件系统主程序。4.调试:在单片机EDA仿真软件环境Proteus下进行仿真设计并调试;或在单片机周立功实验箱上进行有关设计并调试。四、课程设计规定设计一种以单片机为核心可编程作息时间控制器:按照给定期间模仿控制,实现广播、上下课打铃、灯光控制(屏幕显示),同步具备日期和时钟显示。五、进度安排序号内容天数1布置任务,熟悉课题规定0.52总体方案拟定,硬件电路设计1.53软件编程1.54Proteus仿真,或在周立功实验箱上调试25总结,撰写课程设计报告1.5七、课程设计报告内容:总结设计过程,写出设计报告,设计报告详细内容规定如下:1.课程设计目和设计内容。2.课程设计规定。3.控制系统总框图及系统工作原理。4.控制系统硬件电路连接图,电路原理。5.软件设计流程图及其阐明。6.电路设计,软件编程、调试中遇到问题及分析解决办法。7.实验成果及其分析。8.体会。

第二部分课程设计报

目录1课题简介 11.1课题目 11.2课题规定 12可编程作息时间控制器方案设计 12.1系统总体简介 12.2系统整体框图 12.3系统工作原理 13可编程作息时间控制器硬件电路及芯片简介 23.1AT89C51单片机 23.21602LCD液晶显示屏 33.3其她重要元件 43.4硬件电路设计图 54可编程作息时间控制器软件编程设计 54.1系统初始化 54.2系统时间校正 64.3系统时间设定 74.4作息时间设定 74.5响铃解决 94.6逻辑控制 104.71602LCD液晶显示 115实验与成果分析 115.1实验调试 115.2实验成果 125.3实验问题 146小结与体会 15TOC\o"1-3"\h\u1课题简介1.1课题目由单片机AT89C51芯片和LCD显示屏,辅以必要电路,构成一种可编程作息时间控制器。电子钟采用采用单片机来完毕,LCD显示“时”,“分”,LED闪动来做秒计数,定期时间到能发出相应提示,从而可以实现作息时间控制。当前是自动化高度发达时代,特别是电子类产品都是靠内部控制电路来实现对产品控制,达到自动运营目,这就需要咱们这里要做设计中电器元件及电路支持。1.2课题规定在keiluVision和proteus上编写软件完毕设计。以AT89C51单片机为核心结合字符型LCD显示屏可编程作息时间控制器。按照给定期间模仿控制,实现广播、上下课打铃、灯光控制(屏幕显示),同步具备日期和时钟显示。上机调试程序。写出设计报告。2可编程作息时间控制器方案设计2.1系统总体简介可编程作息时间控制器是由简朴一路闹钟基本上增长至四路可调闹钟,从而实现依次执行作息时间提示任务。系统重要是由时间程序和闹钟程序所构成,由显示模块、时钟模块以及闹钟模块三大某些构成。其中时钟运算模块要对时、分、秒数值进行操作,并且秒算到60时,要自己清零并向分进1;分算到60时,要自己清零并向时进1,时算到24时,要清零,这样,才干循环记时。并在不同状态下使得四个按键有着不同功能,从而实现系统时间调节,同步可以在不同状态下可以调节闹钟时间。当定期到达时LCD将显示出当前闹钟是哪一路,响铃一分钟,并可以通过按键提前结束闹钟,恢复届时间显示状态。2.2系统整体框图LCD显示扬声器和灯闪广播单片机AT89C51按键LCD显示扬声器和灯闪广播单片机AT89C51按键2.3系统工作原理使用AT89C51单片机结合字符型LCD显示屏设计一种简易可编程作息时间控制器,若LCD选取有背光显示模块,在夜晚或黑暗场合中也可使用。程序执行后工作批示灯LED闪动,表达程序开始执行,同步显示系统时间。作息时间控制器是由4路可调闹钟构成,从而实现打铃等功能。当四路闹钟中任一路届时,均会点亮灯、打铃。其中操作键K1~K4功能分别为:设立限制时间/时调节、显示闹钟设立时间/分调节、设立闹钟时间/设立完毕、闹钟更换。3可编程作息时间控制器硬件电路及芯片简介系统重要是由AT89C51单片机、1602LCD液晶显示屏以及其她重要元件构成,按键作为系统控制输入端,可以进行时间、闹钟等内容设定,并通过液晶显示屏显示出时间等内容。3.1AT89C51单片机本设计核心硬件就是8051芯片,这里选取了AT89C51,AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)低电压,高性能CMOS8位微解决器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业原则MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMELAT89C51是一种高效微控制器,为诸多嵌入式控制系统提供了一种灵活性高且价廉方案。图3.1AT89C51引脚图引脚及其功能:P0口:P0口为一种8位漏级开路双向I/O口,每脚可吸取8TTL门电流。当P1口管脚第一次写1时,被定义为高阻输入。P0可以用于外部程序数据存储器,它可以被定义为数据/地址第八位。在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必要被拉高。P1口:P1口是一种内部提供上拉电阻8位双向I/O口,P1口缓冲器能接受输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉缘故。在FLASH编程和校验时,P1口作为第八位地址接受。P2口:P2口为一种内部上拉电阻8位双向I/O口,P2口缓冲器可接受,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因而作为输入时,P2口管脚被外部拉低,将输出电流。这是由于内部上拉缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址高八位。在给出地址“1”时,它运用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器内容。P2口在FLASH编程和校验时接受高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻双向I/O口,可接受输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉缘故。P3口也可作为AT89C51某些特殊功能口,如下所示:P3口管脚备选功能P3.0RXD(串行输入口)P3.1TXD(串行输出口)P3.2/INT0(外部中断0)P3.3/INT1(外部中断1)P3.4T0(记时器0外部输入)P3.5T1(记时器1外部输入)P3.6/WR(外部数据存储器写选通)P3.7/RD(外部数据存储器读选通)P3口同步为闪烁编程和编程校验接受某些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期高电平时间。ALE/PROG:当访问外部存储器时,地址锁存容许输出电平用于锁存地址地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变频率周期输出正脉冲信号,此频率为振荡器频率1/6。因而它可用作对外部输出脉冲或用于定期目。然而要注意是:每当用作外部数据存储器时,将跳过一种ALE脉冲。如想禁止ALE输出可在SFR8EH地址上置0。此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。此外,该引脚被略微拉高。如果微解决器在外部执行状态ALE禁止,置位无效。PSEN:外部程序存储器选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效/PSEN信号将不浮现。EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不论与否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。XTAL1:反向振荡放大器输入及内部时钟工作电路输入。XTAL2:来自反向振荡器输出。P1.0口接K1按键,P1.1口接K2按键,P1.2口接K3按键,P1.3口接K4按键,P2.0口接RS口,P2.1口接RW口,P2.2口接E口,P2.3口接发光二极管D2阳极,P2.4口接发光二极管D1阳极,P2.5口接电阻R3,P3口8个口依次和LCD数据口D0~D7.3.21602LCD液晶显示屏LM016L液晶模块采用HD44780控制器。HD44780具备简朴而功能较强指令集,可以实现字符移动、闪烁等功能。LM016L与单片机MCU(MicrocontrollerUnit)通讯可采用8位或者4位并行传播两种方式。HD44780控制器由两个8位寄存器、指令寄存器(IR)和数据寄存器(DR)、忙标志(BF)、显示数据RAM(DDRAM)、字符发生器ROM(CGROM)、字符发生器RAM(CGRAM)、地址计数器(AC)。IR用于寄存指令码,只能写入不能读出;DR用于寄存数据,数据由内部操作自动写入DDRAM和CGRAM,或者暂存从DDRAM和CGRAM读出数据。BF为1时,液晶模块处在内部解决模式,不响应外部操作指令和接受数据。DDRAM用来存储显示字符,能存储80个字符码。CGROM由8位字符码生成5*7点阵字符160种和5*10点阵字符32种,8位字符编码和字符相应关系,可以查看参照文献[3]中表4。CGRAM是为顾客编写特殊字符留用,它容量仅64字节。可以自定义8个5*7点阵字符或者4个5*10点阵字符。AC可以存储DDRAM和CGRAM地址,如果地址码随指令写入IR,则IR自动把地址码装入AC,同步选取DDRAM或者CGRAM单元。LM016L液图3.2LCD1602引脚图晶模块引脚功能见表:第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示屏对比度调节端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一种10K电位器调节对比度。第4脚:RS为寄存器选取,高电平时选取数据寄存器、低电平时选取指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。将respack-81口接电源,2~8口顺序和P3口相连接,并和LCD数据口D1~D7相接,VSS接地,VDD接电源,VEE接滑动变阻器,RS口接P2.0口,RW口接P2.1口,E口接P2.2口。3.3其她重要元件图3.3独立式键盘(1)独立式键盘接口电路:在单片机应用系统中,有时只需要几种简朴按键向系统输入信息。这时,可将每个按键接在一根I/O接口线上,这种方式连接称为独立式键盘。每个独立式按键单独占有一根I/O接口线,每根I/O接口线工作状态不会影响到其她I/O接口线。这种按键接口电路配备灵活,硬件构造简朴,但每个按键必要占用一根I/O接口线,I/O接口线挥霍较大。故只在按键数量不多时采用这种按键电路。在此电路中,按键输入都采用低电平有效。上拉电阻保证了按键断开时,I/O接口线有拟定高电平。当I/O接口内部有上拉电阻时,外电路可以不配备上拉电阻。蜂鸣器:将蜂鸣器一端电源,另一端接至晶闸管集电极,当需要闹钟响时,P2.5将发出有规律电平使得晶闸管导通,从而使得蜂鸣器发出声响。respack-8:上拉电阻键K1~K4分别与单片机P1.0~P1.3口相接。3.4硬件电路设计图图3.4系统整体电路图将respack-81口接电源,2~8口顺序和P3口相连接,并和LCD数据口D1~D7相接。发光二极管D1和P2.4口相连接用以显示秒计时,发光二极管和P2.3口相连接用以显示闹钟时广播,按键K1~K4分别与单片机P1.0~P1.3口相接,以实现按键多功能使用。4可编程作息时间控制器软件编程设计可编程作息时间控制器软件编程重要涉及系统初始化、系统时间校正、系统时间设定、作息时间设定、响铃解决、逻辑控制以及1602LCD液晶显示,整个程序中响铃合理解决以及显示某些是核心某些,只有解决好闹钟及时响应才会使得整个可编程作息时间控制器按照预定设计进行工作,同步各个模块逻辑上合理分派又将是整个功能实现基本。4.1系统初始化sbitK1=P1^0;sbitK2=P1^1;sbitK3=P1^2;sbitK4=P1^3;sbitrs=P2^0;sbitrw=P2^1; sbitlcden=P2^2;sbitLED2=P2^3; sbitled=P2^4;sbitbeep=P2^5;TH0=(65536-50000)/256; TL0=(65536-50000)%256;此段程序重要是是定义电路外部接口,涉及K1~K4按键,LCDrs口、rw口、广播控制端LED2、发光二极管控制端led以及蜂鸣器控制端beep。将定期器0工作模式选取为工作方式1,同步给定期器装初值,并且开始计数。4.2系统时间校正图4.1系统时间校正流程图程序:TH0=(65536-50000)/256; TL0=(65536-50000)%256;aa++; if(aa==20) {aa=0;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;}write_sfm(9,shi);write_sfm(12,fen);}}一方面初始化时定期器开始工作,当计时时间届时进入中断服务,由于方式1没有自动装初值功能,因而需再次装入初值,每一次所定期间为50ms,通过软件计数办法,当计数达到20次时刚好1秒钟,如果计数不到20次,则再次给定期器装入初值,直到计数达到20次,把计数初值清零,并再次向计数器装初值,重复执行之前操作,同步分加一,并显示,如果分为60时则不显示,先清零然后将时加一,再显示分,如果时不是24时,则直接通过LCD显示出来,如果时刚好为24时,则现需要清零,然后在用LCD显示出来。4.3系统时间设定图4.2变化小时流程图图4.3变化分钟流程图 程序:if(K1==0) while(!K1) TR0=0;if(K1==0)shi++; if(shi==24)shi=0; if(K2==0) while(!K2);fen++; if(fen==60) fen=0; if(K3==0) TR0=1; 当K1被按下时,则修改系统时间,同步定期器停止工作。开始时,光标停留在分钟上,当再次按下K1时,光标将会跳到小时并且小时位时间将会加一,如果时位数等于24时,则自动清零,从零开始再往上加,如果按下K2键按下则分钟自动加一,如果分钟达到60时则自动清零,从零开始往上加,并通过LCD显示出此时状态。当按下K3键时,则退出系统时间更改,并启动定期器工作,开始通过LCD在第二行显示出修改后时间。此程序重要作用就是通过人为办法来设定系统时间,使得系统时间满足实际需要。4.4作息时间设定图4.4变化闹钟定期小时流程图图4.5变化闹钟定期分钟流程图程序:if(K3==0) while(!K3); write_sfm(12,fen1); write_sfm(9,shi1); if(K2==0) {write_sfm(12,fen1); write_sfm(9,shi1); while(!K2); write_sfm(12,fen); write_sfm(9,shi); if(K1==0) while(!K1); shi1++; if(shi2==24) shi1=0; write_sfm(9,shi1); if(K2==0) {while(!K2); fen1++; if(fen1==60) fen1=0; write_sfm(12,fen1); if(K3==0) write_sfm(12,fen); write_sfm(9,shi);由于可编程时间控制器是由四路闹钟构成,因此只要通过逻辑上先后顺序便可以实现,并且这四路闹钟设定上都是相似,因而在这里将四路闹钟选取其中第一路做简介。当通过K4键进入闹钟设定电路后,如果处在广播闹钟时间设定期,此时如果没有按下任何开核心,LCD将显示此时闹钟标志“GB”并且再其背面显示当前系统时间,在没有按下K3键之前,如果按下K2键,则LCD将显示此处闹钟时间,并且在其前面有此路标志,如“GB”,松开按键K2时,LCD将显示之前状态;如果按下初次按下K3键,则开始修改闹钟时间,此时光标在分钟上闪烁,此时按下K2键则修改闹钟分钟,如果分等于60时,则自动清零,否则继续往上加;如果按下K1键则修改闹钟小时,如果小时数等于24,则自动清零,否则继续往上加。当第二次按下K3键,则完毕次闹钟设定,并显示之前状态,如果继续按K4键则切换到下一路闹钟,也可以进行上述操作,或者返回系统时间界面。4.5响铃解决图4.6响铃解决流程图程序:if((((fen==fen1)&&(shi==shi1))||((fen==fen2)&&(shi==shi2))||((fen==fen3)&&(shi==shi3))||((fen==fen4)&&(shi==shi4)))&&(flag2==1)) if((fen==fen1)&&(shi==shi1)&&(flag2==1))if((((fen==fen1)&&(shi==shi1)&&(flag2==0))||((fen-1==fen1)&&(shi==shi1)))&&(flag4==0))if((fen==fen2)&&(shi==shi2)&&(flag2==1)) if((((fen==fen2)&&(shi==shi2)&&(flag2==0))||((fen-1==fen2)&&(shi==shi2)))&&(flag4==0))if((fen==fen3)&&(shi==shi3)&&(flag2==1))if((((fen==fen3)&&(shi==shi3)&&(flag2==0))||((fen-1==fen3)&&(shi==shi3)))&&(flag4==0))if((fen==fen4)&&(shi==shi4)&&(flag2==1))if((((fen==fen4)&&(shi==shi4)&&(flag2==0))||((fen-1==fen4)&&(shi==shi4)))&&(flag4==0))if(K4==0&&flag3==0)当四个定期闹钟任意一路到达时,在没有按下响铃终结键K4时,flag2都等于1,此时闹钟响起,同步使得flag3等于0。在闹钟响闹完一种周期后将继续向下执行,并且依照后来程序鉴定是哪一路闹钟在响闹,执行这一路所规定内容,但是无论哪一路时间到都会响铃并且灯闪,不同是依照判断选取出时间到那一路并通过LCD显示出来闹钟时间及某路闹钟;此时若按下K4键,则使得flag2等于0,当进行与否闹钟响闹时将会不在响应,也就是闹钟被手动关闭,从而不需要一定要响铃一分钟后在关闭闹钟,实现手动关断闹钟功能。当闹钟关断过后将及时跳出,并且使得LCD显示当前时间。使得可编程时间控制器可以在响铃时可以显示当前闹铃及时间,同步可以手动关断闹铃,并且当闹铃关断过后可以跳出当前显示返回到系统时间。 4.6逻辑控制图4.7逻辑控制流程图程序:while(1){if((K4==0)&&(flag3==1)){K4num++;if(K4num==5)K4num=0; if(K4num==0){time(); flag4=0;}if(K4num==1){guangbo();flag4=1;}if(K4num==2){shangke(); flag4=1;}if(K4num==3){xiake();flag4=1;}if(K4num==4){dengkong(); flag4=1;}clock();}}只有当没有一路闹钟响闹时才会执行此程序,由于在闹钟响闹时K4键将会作为闹钟停止功能键使用,因此只有在没有闹钟响闹时,K4键才会早为闹钟更换,同步变量K4num将作为K4键所处闹钟或者系统时间区别出来,以实现逻辑上合理。系统刚启动时,按键K4处在系统时间状态,在此状态下可以运用之前所简介功能进行所需要修改,当第一次按下K4键时,就会进入广播定期控制口,此时可以依照需要修改所要定期间,并可以显示自己所定闹钟时间,再次按下K4键时,将会进入上课定期闹钟,和之前闹钟同样,可以进行相似操作,当再次按下K4键时将进入下课闹铃状态,然后将要进入是灯光控制定期,此时Knum4为4,当再次按下K4键时,将通过判断清零,重新开始,以此来实现按键K4可以更换闹钟功能,同步更改闹钟时间功能。4.71602LCD液晶显示VSS引脚接地,VDD提供电源,VEE接滑动变阻器来控制液晶屏对比度。RS为寄存器选取,高电平时选取数据寄存器、低电平时选取指令寄存器。R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。程序:voidwrite_com(ucharcom) {rs=0;rw=0;lcden=0;P3=com;lcden=1;lcden=0;}液晶写命令函数voidwrite_date(uchardate) {rs=1;rw=0;lcden=0;P3=date;lcden=1;lcden=0;}液晶写数据函数当需要将内容显示到LCD显示屏上之前,一方面要向液晶显示屏输入写命令函数,有上硬件分析可以得到LCD液晶显示上一排地址从80H~8FH,一共16位,下面一排地址从C0H~CFH,同样是16位,因此在进行液晶显示之前一方面拟定要将成果在哪一位上显示,然后在调用液晶写数据函数,只有两者结合使用才会得到想要成果。5实验与成果分析5.1实验调试设计规定:一种以单片机为核心可编程作息时间控制器,可以按照给定期间模仿控制,实现广播、上下课打铃、灯光控制(屏幕显示),同步具备日期和时钟显示。一方面运用Keil软件编辑程序,按上图要生成目的代码文献,不断地调试程序。联调:加载目的代码文献打开元器件单片机属性窗口,在“ProgramFile”栏中添加上面编译好目的代码文献“keil-17.hex”;在“ClockFrequency”栏中输入晶振频率为11.0592MHz。每一小块程序编写过后都进行联调,这样可以及时观测到自己所编程序与否符合自己目,当浮现问题时及时解决,可以避免当有大量问题后无法找出错误地方,可以提高编程效率,也有助于最后将程序编写出来。5.2实验成果图5.3广播定期响闹时图5.4上课定期响闹图5.5下课定期响闹图5.6灯控定期响闹图5.7上课定期设定5.3实验问题实验中浮现问题最多就是LCD显示,又是显示出乱码,又是是不断闪烁输入标题,有则是光标来来回回闪烁而不是固定在某一位,这些问题基本上都是由于LCD刷新问题上,有时候由于逻辑上先后顺序没有做好,有完全是由于缺少必要逻辑区别,使得显示在程序执行过程中LCD不单单刷新了我所需要内容,也将我此时不需要内容也刷新出来,因此屏幕上内容是闪烁,因而我加了4个基本变量进行控制,以此来实现所需要刷新。同步整个延时又是非常重要,在进行按键设定期这个问题就浮现了,有时候按一下会会进行几种需要操作,使得成果不符合我规定,因此应用刚开始编写程序时不断恰当增长延时使得程序徐徐符合规定。6小结与体会通过本次单片机课程设计让我学到了许多新知识,让我受益匪浅,其中对1602LCD液晶显示屏有了非常深刻结识。刚开始分到课题时,我便开始研究这个课题,由于咱们课题是在题目4基本上改过来,因而我先研究了一下题目4规定以及原理,再结合咱们课题让我对这个课题有了某些理解,下午时咱们和大多数同窗同样先将电路图画了出来,但是当我做完这个课题过后,我很批准教师意见,不应当及时画电路图,由于咱们对整个课题还不是很理解,对于Proteus软件也不懂,成果就是咱们用了一下午只画了一张图,并且对于整个课程设计课题理解毫无协助。由于咱们对课题理解有困难,不可以将课题所规定内容完全弄明白,因而咱们向李教师谋求协助,帮咱们把咱们课题分析了一下,听过之后咱们基本已经理解了这个课题,但是对于详细实行还是没有头路,当我在实验室纠结1602LCD液晶显示屏究竟是如何工作时,夏教师告诉我Proteus软件中就有有关例子,于是我便通过自己所找到资料以及这个例子自学了LCD显示屏,由于例子是用c语言写,因此最后我也选取使用c语言来编写程序,但是在后来我所遇到困难远远不止这些。一方面我要自学有关c语言,同步我在网上找到了某些有关资料学习了一下,并结合李教师对课题分析,让我对这个课题有了自己思路。一方面,我就把我思路认真整顿下来,然后规划好每一块所要完毕任务,然后再用Keil软件编写出来,在进行联调,每一小步调试都必要做到没有问题,只有这样在总联调时不会由于问题太多而做不出来。在后来几天里我都在学习和使用c语言,让我对LCD显示屏有了更多结识,但是在整个程序编写过程中问题基本都处在LCD显示上,一遍遍尝试后总会浮现某些问题,曾经我也由于最后一点点问题想向教师请教,最后自己没有解决时候甚至想放弃,但是最后我还是坚持下来,并最后完毕了程序基本规定,并且通过了李教师第一次检查,并对李教师提出某些不满足地方进行了修改,但是这些修改在进过之前所设计中遇到问题来说也挺难得,但是我不久就解决掉了,由于我对自己程序以及LCD显示屏有了好好地结识,从而最后实现了比较好成果,当李教师验收过后感到非常高兴,在此我非常感谢李教师对我设计过程中提供协助,以及最后对我设计成果承认。虽然在这一周半课程设计中每时每刻都让我在思考我课题,同步由于有关网络资源局限性曾经使我在用汇编语言还是应用c语言徘徊过,但是当我选取其中一种时我就坚持了下来,并通过不断地努力在不断地更改程序,可以说整个课程设计是非常痛苦,由于我曾经想放弃过,但是我最后还是坚持了下来,并通过自己坚持不懈努力完毕本次课题任务。虽然整个课程设计过程有点痛苦,但是当我看到自己最后成果时还是很开心,由于我这几天努力没有白白挥霍,培养了我独立思考能力,提高我自学以及应用能力,这将是我后来学习生活非常宝贵经历。在编写程序过程中每一块认真编写才为后来整个程序完毕奠定基本,正如咱们在平时生活中同样,只有不断地积累,才会为后来更大收获打下坚实基本,而本次课程设计就可以当做我一次小小积累,可以说这是我大学以来最让我纠结一次课程设计,也是第一种让我有放弃念头课程设计,当我最后调出程序那一刻让我明白,有时候在那自暴自弃还不如竭尽自己权力去解决这个问题,在这过程中确会有许多麻烦,有时会把本来没有问题弄出来,有时通过一次次调试还是达不到自己规定,但是只要咱们坚持住,不放弃还是会解决。回眸这一周多单片机课程设计,发现自己程序按模块划分还不是很难,和当时刚刚拿到题目时各种不明白、各种不懂发现自己真收获了诸多,并且在看看有关类似课题时可以基本找出基本设计思路,对于用到602LCD液晶显示屏有关内容可以做出有关反映,这个显示屏曾经让我绞尽脑汁仍旧不懂,曾经让我程序漏洞百出,但是最后我征服了它,这是我一大收获。同步在李教师和夏教师督促下可以准时到达实验室,从而合理分派和合理使用了课程设计时间。最后,我要非常感谢李教师和夏教师在课程设计中提供协助,以及李教师最后对我课程设计成果必定。

参考文献[1]张毅刚主编,单片机原理及应用,北京:高等教诲出版社,[2]陈涛编著,单片机应用及C51程序设计,北京:机械工业出版社,[3]周润景主编,PROTEUS入门实用教程,北京:机械工业出版社,[4]皮大能主编,单片机课程设计指引书,北京:北京理工大学出版社,[5]楼然苗主编,单片机实验与课程设计(Proteus仿真版),浙江:浙江大学出版社,

附录设计程序#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharUinti,miao,fen,fen1,fen2,fen3,fen4,shi,shi1,shi2,shi3,shi4,flag1,flag2,flag3,flag4,flag5,aa,K1num,K2num,K3num,K4num,N; //K1num-K1按键被按下标记变量,K2num-K2按键被按下标记变量,K3num=0-K3按键被按下标记变量ucharcodetable[]="H.I.TCHINA";//定义初始上电时液晶默认显示状态ucharcodetable2[]="TIME";ucharcodeAlarm_0[]="GBDS";ucharcodeAlarm_1[]="SKDS";ucharcodeAlarm_2[]="XKDS";ucharcodeAlarm_3[]="DKDS"; ucharcodeAlarm_00[]="GB";ucharcodeAlarm_11[]="SK";ucharcodeAlarm_22[]="XK";ucharcodeAlarm_33[]="DK"; ucharcodedeng[]="LIGHTING";sbitK1=P1^0; //四个按键sbitK2=P1^1;sbitK3=P1^2;sbitK4=P1^3;sbitrs=P2^0;sbitrw=P2^1; //灯光控制端sbitlcden=P2^2;sbitLED2=P2^3; //广播控制端sbitled=P2^4;///发光二极管控制端sbitbeep=P2^5; //蜂鸣器控制端voiddelay(uintz) //延时函数{uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--) ; }voidwrite_com(ucharcom)//液晶写命令函数{rs=0;rw=0;lcden=0;P3=com;delay(5);lcden=1;delay(5);lcden=0; }voidwrite_date(uchardate)//液晶写数据函数{rs=1;rw=0;lcden=0;P3=date;delay(5);lcden=1;delay(5);lcden=0; }voidwrite_sfm(ucharadd,uchardate) //液晶写时分秒函数{ucharshi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}voidinit() //初始化函数{uintnum; //写液晶循环控制变量aa=0; //中断次数标志K1num=0; //K1按键被按下标记变量K2num=0; //K2按键被按下标记变量K3num=0; //K3按键被按下标记变量K4num=0;//K4按键被按下标记变量flag1=1; //控制lcd屏刷新变量flag2=1;//控制闹钟响闹启动关闭标记flag3=1;//控制闹钟响起时,按下K4停止闹钟响闹标记flag4=1;//进入闹钟设立时标记变量flag5=1;//进入时间设立时标记变量led=1; //发光二极管初始化LED2=0; //广播初始化rw=0; N=100; //系统启动时,闹钟时间到发出声音为持续三次发出“哗”一声miao=0; //系统初始化时间fen=0;shi=7;fen1=6; //初始化闹钟时间shi1=7;fen2=8; //初始化闹钟时间shi2=7;fen3=10; //初始化闹钟时间shi3=7;fen4=12; //初始化闹钟时间shi4=7;beep=0; //蜂鸣器初始化lcden=0; //液晶使能端初始化write_com(0x38); //1602液晶初始化,设立16*2显示。5*7点阵,8位数据接口write_com(0x0c);//设立开显示,不显示光write_com(0x06); //写一种字符后地址指针自动加1write_com(0x01);//显示清0数据指针清0write_com(0x80); //将数据指针定位到第一行,第一种字处for(num=0;num<15;num++) //显示闹钟标示:H.I.TCHINA{write_date(table[num]);delay(10); }write_com(0x80+0x40+11);//写出时间显示某些两个冒号write_date(':');write_com(0x80+0x40+14);write_date('');write_com(0x80+0x40+15);write_date('');write_sfm(12,fen); //送去液晶显示秒分时write_sfm(9,shi);TMOD=0x01; //设立定期器0为工作方式1TH0=(65536-50000)/256;//定期器装初值TL0=(65536-50000)%256;EA=1; //开总中断ET0=1; //开定期器0中断TR0=1; }voidxianshi() //系统时间显示{write_com(0x80+0x40);for(i=0;i<9;i++)write_date(table2[i]);write_com(0x80+0x40+11);//写出时间显示某些两个冒号write_date(':');write_com(0x80+0x40+14);write_date('');write_com(0x80+0x40+15);write_date('');write_sfm(12,fen); //送去液晶显示秒分时write_sfm(9,shi);}voidtime() //更改系统时间{if( (K1num==0)&&(flag3==1)){write_com(0x80+0x40);for(i=0;i<9;i++)write_date(table2[i]); } if(K1==0)//判断K1按下,则开始修改时间{delay(5);flag5=1;if(K1==0&&K1num==0){K1num=1; while(!K1) //判断与否松开按键,后同if(K1num==1){TR0=0; //关闭计数器0write_com(0x0f); //光标开始闪烁write_com(0x80+0x40+13);} } }if(K1==0&&K1num==1) //判断K1按下,修改系统时间小时{delay(5);if(K1==0){write_com(0x80+0x40+10); //光标定位到小时位置K1num=1; //置K1num=1while(!K1);shi++; //则调节时加1if(shi==24)shi=0; //若满24后将清零write_sfm(9,shi); //每调节一次送液晶显示write_com(0x80+0x40+10);} } if(K2==0&&K1num==1) //判K2按下,修改系统时间分钟{delay(5);if(K2==0){write_com(0x80+0x40+13); //光标定位到分钟位置K1num=1;while(!K2);fen++; //则调节分加1if(fen==60) fen=0;//若满60后将清零write_sfm(12,fen); //每调节一次送液晶显示write_com(0x80+0x40+13); } }if(K1num==1) //当设立时间或闹钟时,K3被按下设立完毕。{ if(K3==0) //判断K3按下{delay(5);if(K3==0){ flag5=0;K1num=0;while(!K3);write_com(0x0c); //取消光标闪TR0=1; //启动定期器使时钟开始走flag1=1;//flag=1.则修改系统时间时液晶显示系统时间值,flag=0,则为修改闹钟时间时,屏幕显示是修改闹钟时间值flag1=1;write_com(0x80+0x40+11);write_date(':');write_com(0x80+0x40+14);write_date('');write_com(0x80+0x40+15);write_date(''); } } }}voidguangbo()//广播定期{if(K3num==0){write_com(0x80+0x40);for(i=0;i<9;i++)write_date(Alarm_00[i]); }if(K3==0&&K3num==0) //判断K3初次被按下,则设立闹钟{delay(5); //延时消抖,后同if(K3==0){ flag1=0;write_com(0x80+0x40+13); //第一次按下光标定位到分钟位置while(!K3);K3num=1;write_com(0x80+0x40);for(i=0;i<9;i++)write_date(Alarm_0[i]);write_sfm(12,fen1); //送去液晶显示定期分,时write_sfm(9,shi1);write_com(0x0f); //光标开始闪烁write_com(0x80+0x40+13); //显示位置回到调节处} } if(K2==0&&K3num==0) //K2被按下时显示定期时间{ delay(5);if(K2==0){ write_sfm(12,fen1); //送去液晶显示定期分,时write_sfm(9,shi1);while(!K2); write_sfm(12,fen);//K2松开显示当前时间write_sfm(9,shi);} }if(K1==0&&K3num==1) //修改小时,判断K1键按下,K3num=1,表达K3按键按下,则此时修改是闹钟时间小时{delay(5);if(K1==0){ write_com(0x80+0x40+10); //光标定位到小时位置K3num=1;while(!K1);shi1++; //则调节定期时加1if(shi2==24) //若满24后将清零shi1=0;write_sfm(9,shi1); //每调节一次送液晶显示write_com(0x80+0x40+10); //显示位置重新回到调节处} } if(K2==0&&K3num==1)//按键2按下,修改闹钟时间分钟{ delay(5);if(K2==0){ write_com(0x80+0x40+13); //光标定位到分钟位置K3num=1;while(!K2);fen1++; //则调节分加1if(fen1==60) //若满60后将清零fen1=0;write_sfm(12,fen1);//每调节一次送液晶显示write_com(0x80+0x40+13); //显示位置重新回到调节处} }if(K3num==1) //当设立闹钟时,K3被按下设立完毕。{ if(K3==0) //判断K3按下{ delay(5);if(K3==0){ K1num=0;K3num=0;while(!K3);write_com(0x0c); //光标停止闪烁 flag1=1; //flag=1.则修改系统时间时液晶显示系统时间值,flag=0,则为修改闹钟时间时,屏幕显示是修改闹钟时间值write_sfm(12,fen);//送去液晶显示分,时write_sfm(9,shi);write_com(0x80+0x40+11);write_date(':');write_com(0x80+0x40+14);write_date('');write_com(0x80+0x40+15);write_date('');}} }}voidshangke() //上课定期{if( K3num==0){write_com(0x80+0x40);for(i=0;i<9;i++)write_date(Alarm_11[i]); } if(K3==0&&K3num==0) //判断K3初次被按下,则设立闹钟{ delay(5); //延时消抖,后同if(K3==0){ flag1=0;write_com(0x80+0x40+13); //第一次按下光标定位到分钟位置while(!K3);K3num=1;write_com(0x80+0x40);for(i=0;i<9;i++)write_date(Alarm_1[i]);write_sfm(12,fen2); //送去液晶显示定期分,时write_sfm(9,shi2);write_com(0x0f); //光标开始闪烁 write_com(0x80+0x40+13); //显示位置回到调节处}} if(K2==0&&K3num==0) //K2被按下时显示定期时间{ delay(5);if(K2==0){ write_sfm(12,fen2); //送去液晶显示定期分,时write_sfm(9,shi2);while(!K2); write_sfm(12,fen); //K2松开显示当前时间write_sfm(9,shi); } }if(K1==0&&K3num==1) //修改小时,判断K1键按下,K3num=1,表达K3按键按下,则此时修改是闹钟时间小时{ delay(5);if(K1==0){ write_com(0x80+0x40+10); //光标定位到小时位置K3num=1;while(!K1);shi2++; //则调节定期时加1if(shi2==24) //若满24后将清零shi1=0;write_sfm(9,shi2); //每调节一次送液晶显示write_com(0x80+0x40+10); //显示位置重新回到调节处} } if(K2==0&&K3num==1) //按键2按下,修改闹钟时间分钟{ delay(5);if(K2==0){ write_com(0x80+0x40+13); //光标定位到分钟位置K3num=1;while(!K2);fen2++; //则调节分加1if(fen1==60) //若满60后将清零fen1=0;write_sfm(12,fen2); //每调节一次送液晶显示一下write_com(0x80+0x40+13); //显示位置重新回到调节处} }if(K3num==1) //当设立时间或闹钟时,K3被按下设立完毕。{ if(K3==0) //判断K3按下{ delay(5);if(K3==0){K1num=0;K3num=0;while(!K3);write_com(0x0c); //光标停止闪烁 flag1=1; //flag=1.则修改系统时间时液晶显示系统时间值,flag=0,则为修改闹钟时间时,屏幕显示是修改闹钟时间值write_sfm(12,fen);//送去液晶显示分,时write_sfm(9,shi);write_com(0x80+0x40+11);write_date(':');write_com(0x80+0x40+14);write_date('');write_com(0x80+0x40+15);write_date('');}}}}voidxiake() //下课定期{ if( K3num==0){ write_com(0x80+0x40);for(i=0;i<9;i++)write_date(Alarm_22[i]); } if(K3==0&&K3num==0) //判断K3初次被按下,则设立闹钟{delay(5); //延时消抖,后同if(K3==0){ flag1=0;write_com(0x80+0x40+13); //第一次按下光标定位到分钟位置while(!K3);K3num=1;write_com(0x80+0x40);for(i=0;i<9;i++)write_date(Alarm_2[i]);write_sfm(12,fen3); //送去液晶显示定期分,时write_sfm(9,shi3);write_com(0x0f); //光标开始闪烁write_com(0x80+0x40+13); //显示位置回到调节处}}if(K2==0&&K3num==0) //K2被按下时显示定期时间{delay(5);if(K2==0){ write_sfm(12,fen3); //送去液晶显示定期分,时write_sfm(9,shi3);while(!K2); write_sfm(12,fen); //K2松开显示当前时间write_sfm(9,shi);} }if(K1==0&&K3num==1) //修改小时,判断K1键按下,K3num=1,表达K3按键按下,则此时修改是闹钟时间小时{ delay(5); if(K1==0){ write_com(0x80+0x40+10); //光标定位到小时位置K3num=1;while(!K1);shi3++; //则调节定期时加1if(shi3==24) //若满24后将清零shi1=0;write_sfm(9,shi3); //每调节一次送液晶显示write_com(0x80+0x40+10); //显示位置重新回到调节处} }if(K2==0&&K3num==1) //卸螷2按下,修改闹钟时间分钟{ delay(5);if(K2==0){ write_com(0x80+0x40+13); //光标定位到分钟位置K3num=1;while(!K2);fen3++; //则调节分加1if(fen1==60) //若满60后将清零fen1=0;write_sfm(12,fen3);//每调节一次送液晶显示write_com(0x80+0x40+13); } } if(K3num==1) //当设立时间或闹钟时,K3被按下设立完毕。{ if(K3==0) //判断K3按下{delay(5);if(K3==0){ K1num=0;K3num=0;while(!K3);write_com(0x0c); //光标停止闪烁 flag1=1;write_sfm(12,fen);//送去液晶显示分,时write_sfm(9,shi);write_com(0x80+0x40+11);write_date(':');write_com(0x80+0x40+14);write_date('');write_com(0x80+0x40+15);write_date('');}}}}voiddengkong() //灯光控制{if(K3num==0){write_com(0x80+0x40);for(i=0;i<9;i++)write_date(Alarm_33[i]); } if(K3==0&&K3num==0) //判断K3初次被按下,则设立闹钟{delay(5); //延时消抖,后同if(K3==0){flag1=0;write_com(0x80+0x40+13); //第一次按下光标定位到分钟位置while(!K3);K3num=1;write_com(0x80+0x40);for(i=0;i<9;i++)write_date(Alarm_3[i]);write_sfm(12,fen4); //送去液晶显示定期分,时write_sfm(9,shi4);write_com(0x0f); //光标开始闪烁write_com(0x80+0x40+13); //显示位置回到调节处} }if(K2==0&&K3num==0) //K2被按下时显示定期时间{delay(5);if(K2==0){write_sfm(12,fen4); //送去液晶显示定期分,时write_sfm(9,shi4);while(!K2); write_sfm(12,fen); //K2松开显示当前时间write_sfm(9,shi);} }if(K1==0&&K3num==1) //修改小时,判断K1键按下,K3num=1,表达K3按键按下,则此时修改是闹钟时间小时{delay(5);if(K1==0){write_com(0x80+0x40+10); //光标定位到小时位置K3num=1;while(!K1);shi4++; //则调节定期时加1if(shi4==24) //若满24后将清零shi1=0;write_sfm(9,shi4); //每调节一次送液晶显示一下write_com(0x80+0x40+10); //显示位置重新回到调节处} }if(K2==0&&K3num==1) //按键2按下,修改闹钟时间分钟{ delay(5);if(K2==0){ write_com(0x80+0x40+13); //光标定位到分钟位置K3num=1;while(!K2);fen4++; //则调节分加1if(fen1==60) //若满60后将清零fen1=0;write_sfm(12,fen4); //每调节一次送液晶显示一下write_com(0x80+0x40+13); //显示位置重新回到调节处} }if(K3num==1) //当设立时间或闹钟时,K3被按下设立完毕。{ if(K3==0) //判断K3按下{ delay(5);if(K3==0){K1num=0;K3num=0;while(!K3);write_com(0x0c); //光标停止闪烁 flag1=1;//flag=1.write_sfm(12,fen);//送去液晶显示分,时write_sfm(9,shi);write_com(0x80+0x40+11);write_date(':');write_com(0x80+0x40+14);write_date('');write_com(0x80+0x40+

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论