毕业设计(论文)基于AT89C51单片机的电子时钟设计_第1页
毕业设计(论文)基于AT89C51单片机的电子时钟设计_第2页
毕业设计(论文)基于AT89C51单片机的电子时钟设计_第3页
毕业设计(论文)基于AT89C51单片机的电子时钟设计_第4页
毕业设计(论文)基于AT89C51单片机的电子时钟设计_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、毕业设计(论文)题目: 基于at89c51的电子时钟 专业: 应 用 电 子 技 术 班级: 学号: 08号 姓名: 指导老师: 成都电子机械高等专科学校二一一年六月论 文 摘 要 为了进一步了解51单片机的定时器,在此对at89c51单片机在时钟计数上进行了研究;整个系统以at89c51作为控制核心,用8155进行i/o口的扩展,用按键进行时间设置,用lcd对时间进行实时显示;对系统时间的设置是采用外中断into,并且用的是电平触发方式,闭合刀开关进入中断后,按动按键可以设置时间,设置结果在lcd上显示,设置完成,断开刀开关,系统又进行时间显示。系统可以设置两个闹钟参考值,将时间与闹钟时间进

2、行比较,确定led是否闪烁。关键词: at89c51;8155;lcd;汇编;目 录第一章 绪论41.1本设计的要求:41.2 关于at89c51单片机41.2.1 主要技术指标和特性41.2.2 外部引脚51.3 关于adc0809转换器61.3.1 主要技术指标和特性61.3.2 内部结构和外部引脚61.3.3 工作时序与使用说明81.4关于8155i/o口扩展芯片91.5关于pt100概述10第二章 系统设计122.1系统硬件设计122.1.1 设计思路122.1.2 具体设计电路图122.2系统软件设计142.2.1 设计思路142.2.2 主程序和中断子程序流程图152.2.3 标度

3、转换子程序172.2.4 加热等级判断192.2.5 具体程序192.3仿真结果272.4总 结30参考文献30第一章 绪论1.1本设计的要求:(1) 电子钟功能,显示和设置时,分,秒(2) 可以设置2个闹钟点,到点时,相应发光二极管闪烁10秒停止(3) 所有键盘,显示都使用8155接口芯片1.2 关于at89c51单片机at89c51是一种带4k字节闪存可编程可擦除只读存储器(fperomflash programmable and erasable read only memory)的低电压、高性能cmos 8位微处理器,俗称单片机。at89c2051是一种带2k字节闪存可编程可擦除只读存

4、储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用atmel高密度非易失存储器制造技术制造,与工业标准的mcs-51指令集和输出管脚相兼容。由于将多功能8位cpu和闪烁存储器组合在单个芯片中,atmel的at89c51是一种高效微控制器,at89c2051是它的一种精简版本。at89c单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。1.2.1 主要技术指标和特性u 与mcs-51 兼容 u 4k字节可编程闪烁存储器 u 寿命:1000写/擦循环 u 数据保留时间:10年 u 全静态工作:0hz-24mhz u 三级程序存储器锁定 u 1288位内部ram u 3

5、2可编程i/o线 u 两个16位定时器/计数器 u 5个中断源 u 可编程串行通道 u 低功耗的闲置和掉电模式 u 片内振荡器和时钟电路 1.2.2 外部引脚vcc:供电电压。 gnd:接地。 p0口:p0口为一个8位漏级开路双向i/o口,每脚可吸收8ttl门电流。当p0口的管脚第一次写1时,被定义为高阻输入。p0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在fiash编程时,p0 口作为原码输入口,当fiash进行校验时,p0输出原码,此时p0外部必须被拉高。 p1口:p1口是一个内部提供上拉电阻的8位双向i/o口,p1口缓冲器能接收输出4ttl门电流。p1口管脚写入1后,

6、被内部上拉为高,可用作输入,p1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在flash编程和校验时,p1口作为第八位地址接收。 p2口:p2口为一个内部上拉电阻的8位双向i/o口,p2口缓冲器可接收,输出4个ttl门电流,当p2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,p2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。p2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,p2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,p2口输出其特殊功能寄存器的内容。p2口在flash编程

7、和校验时接收高八位地址信号和控制信号。 p3口:p3口管脚是8个带内部上拉电阻的双向i/o口,可接收输出4个ttl门电流。当p3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,p3口将输出电流(ill)这是由于上拉的缘故。 rst:复位输入。当振荡器复位器件时,要保持rst脚两个机器周期的高电平时间。 ale/prog:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在flash编程期间,此引脚用于输入编程脉冲。在平时,ale端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意

8、的是:每当用作外部数据存储器时,将跳过一个ale脉冲。如想禁止ale的输出可在sfr8eh地址上置0。此时, ale只有在执行movx,movc指令是ale才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ale禁止,置位无效。 /psen:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/psen有效。但在访问外部数据存储器时,这两次有效的/psen信号将不出现。 /ea/vpp:当/ea保持低电平时,则在此期间外部程序存储器(0000h-ffffh),不管是否有内部程序存储器。注意加密方式1时,/ea将内部锁定为reset;当/ea端保持高电平时,此间内部程

9、序存储器。在flash编程期间,此引脚也用于施加12v编程电源(vpp)。 xtal1:反向振荡放大器的输入及内部时钟工作电路的输入。 xtal2:来自反向振荡器的输出。 1.3关于8155i/o口扩展芯片1.3.1 8155的管脚定义 rst:复位信号输入端,高电平有效。复位后,3个i/o口均为输入方式。 ad0ad7:三态的地址/数据总线。与单片机低8位地址/数据总线(p0口)相连。单片机与8155之间的地址、数据、命令与状态信息都是通过这个总线口传送的。 rd:读选通信号,控制对8155的读操作,低电平有效。 wr:写选通信号,控制对8155的写操作,低电平有效。 ce:片选信号线,低电

10、平有效。 io/m :8155的ram存储器或i/o口选择线。当io/m 0时,则选择8155的片内ram,ad0ad7上地址为8155中ram单元的地址(00hffh);当io/m 1时,选择 8155的i/o口,ad0ad7上的地址为8155 i/o口的地址。 ale:地址锁存信号。8155内部设有地址锁存器,在ale的下降沿将单片机p0口输出的低8位地址信息及 ,io/ 的状态都锁存到8155内部锁存器。因此,p0口输出的低8位地址信号不需外接锁存器。 pa0pa7:8位通用i/o口,其输入、输出的流向可由程序控制。 pb0pb7:8位通用i/o口,功能同a口。 pc0pc5:有两个作用

11、,既可作为通用的i/o口,也可作为pa口和pb口的控制信号线,这些可通过程序控制。 timer in:定时/计数器脉冲输入端。 timer out:定时/计数器输出端。 vcc:5v电源。 1.3.2 8155的地址编码及工作方式 在单片机应用系统中,8155是按外部数据存储器统一编址的,为16位地址,其高8位由片选线 提供, ce0,选中该片。 当 ce0,io/m 0时,选中8155片内ram,这时8155只能作片外ram使用,其ram的低8位编址为00hffh;当 ce0,io/m 1时,选中8155的i/o口,其端口地址的低8位由ad7ad0确定,如表6-6所示。这时,a、b、c口的口

12、地址低8位分别为01h、02h、03h(设地址无关位为0)。 表一 8155芯片的i/o口地址 a7a6a5a4a3a2a1a0选择i/o口000命令/状态寄存器 001a口010b口011c口100定时器低8位101定时器高6位及方式1.4 lcd概述lcd1602 已很普遍了,具体介绍我就不多说了,市面上字符液晶绝大多数是基于hd44780 液晶芯片的,控制原理是完全相同的,因此hd44780 写的控制程序可以很方便地应用于市面上大部分的字符型液晶。字符型lcd 通常有14 条引脚线或16 条引脚线的lcd,多出来的2 条线是背光电源线vcc(15 脚)和地线gnd(16 脚),其控制原理

13、与14 脚的lcd 完全一样,定义如下表所示:表二 字符型lcd 的引脚定义hd44780 内置了ddram、cgrom 和cgram。ddram 就是显示数据ram,用来寄存待显示的字符代码。共80 个字节,其地址和屏幕的对应关系如下表:表三 地址和屏幕的对应关系表也就是说想要在lcd1602 屏幕的第一行第一列显示一个a字,就要向ddram 的00h 地址写入“a”字的代码就行了。但具体的写入是要按lcd 模块的指令格式来进行的,后面我会说到的。那么一行可有40 个地址呀?是的,在1602 中我们就用前16 个就行了。第二行也一样用前16 个地址。对应如下:表四ddram 地址与显示位置的

14、对应关系基本操作时序:读状态 输入:rs=l,rw=h,e=h 输出:db0db7=状态字写指令 输入:rs=l,rw=l,e=下降沿脉冲,db0db7=指令码 输出:无读数据 输入:rs=h,rw=h,e=h 输出:db0db7=数据写数据 输入:rs=h,rw=l,e=下降沿脉冲,db0db7=数据 输出:无第二章 系统设计2.1系统硬件设计2.1.1 设计思路 用at89c51的定时器0进行计时,每计时1秒就更新时间,并在lcd上显示。系统用8155对单片机进行了io口扩展,扩展的io口用来进行lcd显示和键盘设置。对主时间采用中断方式,对闹钟进行设置,其实质也只是更换了显示。2.1.2

15、 具体设计电路图图一 硬件设计图 备注:整个系统大致分为4个模块模块一:复位模块该模块在系统跑飞的时候,对系统进行复位。模块二:lcd模块对各种信息进行显示模块三:键盘模块对时间进行设置模块四:闹钟模块判断实时时间与设定时间是否相等2.2系统软件设计2.2.1 设计思路整个程序由三部分组成主程序:主要进行初始化,对实时时间进行显示和参考时间进行设置等;外部中断程序:扫描按键,将按键值送入显缓等;定时中断程序:对时间计数单元进行实时更新;显示子程序:对信息进行实时显示;2.2.2流程图图二 主程序流程图一图三 定时中断流程图图四 外部中断子程序图五 显示子程序2.2.3 具体程序 ;*;定义引脚

16、和ram存储分配;*led1 bit p1.3 ;led1控制脚led2 bit p1.4 ;led2控制脚lcd_rs bit p1.0 ;lcd控制线lcd_rw bit p1.1lcd_e bit p1.2t0cnt equ 30hsecond equ 31h ;秒计数单元minute equ 32h ;分计数单元hour equ 33h ;时计数单元disp_buf equ 34h ;34h3bh为时间显示缓存second1 equ 3dh ;参考时间1计数单元minute1 equ 3ehhour1 equ 3fhsettime1_buf equ 40h ;参考时间1的缓存地址sec

17、ond2 equ 49h ;参考时间2计数单元minute2 equ 4ahhour2 equ 4bhsettime2_buf equ 4ch ;参考时间2的缓存地址disp_flg equ 55h ;刷新显示标志,为1时刷新显示cover_flg equ 56h ;将bcd转换成as的标志位,在用键盘输入数值的时候要用到stime equ 57h ;lcd显示对象标志位wei equ 59h ;按键输入是,存储位置标志位channel equ 60h ;设置时间结束标识位nz_flg1 equ 61h ;与参考时间一相等标识位nz_flg2 equ 62h ;与参考时间二相等标识位t1con

18、t equ 63h ;led1闪烁次数t2cont equ 64h ;led2闪烁次数org 0000hljmp mainorg 0003hljmp pint0org 000bhljmp it0p;=;主程序;=org 1000hmain: mov sp,#65h mov ip,#01h mov tcon,#01h;外部中断0为电平触发 mov tmod,#01h;定时器0用模式1 mov th0,#0bdh;延时20ms mov tl0,#098h mov ie,#83h ;开中断 mov disp_flg,#01h clr a mov wei,a mov t0cnt,a mov nz_fl

19、g1,a mov nz_flg2,a mov t1cont,a mov t2cont,a mov second,a mov stime,a mov cover_flg,a mov channel,a mov minute,a mov hour,a ;默认时间为00:00:00 mov second1,#02 ;默认闹钟点1为00:00:02 mov minute1,a mov hour1,a mov second2,a ;默认闹钟点2为00:00:00 mov minute2,a mov hour2,a setb tr0 main_lp:lcall disp ;调显示子程序 lcall com

20、pare ;将时间与闹钟值想比较 mov a,nz_flg1 ;对闹钟一相等标识进行判断,以确定led1是否闪烁 cjne a,#01h,lpn cpl led1 inc t1cont mov a,t1cont cjne a,#28,lpn mov nz_flg1,#00h mov t1cont,#00h lpn: mov a,nz_flg2 ;对闹钟二相等标识进行判断,以确定led1是否闪烁 cjne a,#01h,lpen cpl led2 inc t2cont mov a,t2cont cjne a,#28,lpen mov nz_flg2,#00h mov t2cont,#00h lp

21、en: mov p3,#0ffh ;对显示对象按键进行扫描mov a,p3anl a,#01hcjne a,#01h,k_pressmov a,stimecjne a,#01h,nao2 mov r1,#settime1_buf ;若显示对象为闹钟1,则对其进行设置sjmp sknao2: cjne a,#02h,main_lp mov r1,#settime2_buf ;若显示对象为闹钟2,则对其进行设置sk:mov cover_flg,#01h mov channel,#01hmov wei,#00hlop:lcall keydmov a,channelcjne a,#00h,lop ;闹

22、钟时间是否设置完,没完,继续lcall bcd_as ;将设置到显缓中的值转换成二进制,存入计数单元,mov cover_flg,#00h ;清除相应标志位mov wei,#00hmov channel,#00hinc stimemov a,stimecjne a,#03h,main_lp mov stime,#00h sjmp main_lpk_press:lcall key_prg sjmp main_lp;=;对时间设置中断子程序;=pint0: push acc ;入栈保护 setb rs0 mov cover_flg,#01h ;显示时无需进行convert转换 mov wei,#0

23、0h mov a,#03h mov dptr,#7f00h movx dptr,a mov r1,#disp_buf ;设置按键值存入首地址 mov stime,#00h lcall keyd ;调用键盘设置子程序 lcall bcd_as ;将显缓的值转换到计数单元中 mov cover_flg,#00h ;清除相关标志,和还原 mov wei,#00h clr rs0 pop acc reti;*;按键次数决定显示内容;*key_prg:mov r5,#10 lcall delay_msmov p3,#0ffhmov a,p3anl a,#01hjb acc.0,cpinc stimemo

24、v a,stimecjne a,#03h,cp mov stime,#00hcp: ret ;*;按键子程序;*keyd:mov a,#03h mov dptr,#7f00h movx dptr,a mov a,#00h ;粗扫描mov dptr,#7f01hmovx dptr,amov dptr,#7f03hmovx a,dptrcpl aanl a,#07hjnz keyd1mov a,r1push acclcall disppop accmov r1,amov a,stimecjne a,#00h,s1 setb p3.2 ;判断p3.2口得电平状态来决定是否结束中断jb p3.2,k_

25、end1sjmp keyds1:mov a,channel cjne a,#00h,keyd sjmp k_end1 keyd1: mov r2,#0feh ;设置扫描列码 keyd2:mov a,r2 mov dptr,#7f01hmovx dptr,amov dptr,#7f03hmovx a,dptrcpl aanl a,#07hjnz keyd3 ;有键按下,就跳mov a,r2 ;列码左移rl amov r2,acjne a,#0efh,keyd2ljmp keydk_end1:sjmp k_endkeyd_1:sjmp keydkeyd3:swap amov 58h,r2anl 5

26、8h,#0fhorl a,58h ;行码,列码组成键值识别码mov 58h,amov dptr,#keytabmov r4,#0ffh ;r4为键值计数器loop:inc r4clr amovc a,a+dptr ;查表求键值inc dptrcjne a,58h,loopmov a,r4add a,#30hmov r3,wei ;对存储标志进行判断,以便将按键值存入对应的显缓中m2: mov r3,wei cjne r3,#00h,m4cjne a,#33h,com0 com0:jnc keyd sjmp sxm4:cjne r3,#01h,mm1 cjne a,#35h,com1 com1:

27、jnc keyd sjmp sxmm1:cjne r3,#02h,m5_1 inc r1 inc wei mov r3,weim5_1:cjne r3,#03h,m9_1 cjne a,#36h,com3 com3:jnc keyd_1 sjmp sxm9_1:cjne r3,#04h,mm2 sjmp sxmm2:cjne r3,#05h,m5_2 inc r1 inc wei mov r3,weim5_2:cjne r3,#06h,m9_2 cjne a,#36h,com4 com4:jnc keyd_1 sjmp sxm9_2:cjne r3,#07h,clxsx: mov r1,a ;

28、键值送显缓 kdl:mov dptr,#7f03h movx a,dptr ;看按键是否松开anl a,#07hcjne a,#07h,kdlinc r1inc weicjne r1,#3ch,kdl1 ;显示地址是否显完 clx:mov r1,#34h ;显示完就重新开始 mov wei,#00h mov channel,#00hkdl1:ljmp keydk_end:retkeytab:db 17h,1bh,1dh,1eh db 27h,2bh,2dh,2eh db 47h,4bh;= ;延时子程序;=delay_ms:mov r4,#64hmdl: nop nop nop nop djn

29、z r4,mdl djnz r5,delay_ms ret;=;t0中断处理程序;将每一秒的变化存入计数单元;=it0p:push psw push acc mov th0,#0bdh mov tl0,#098h mov disp_flg,#00h inc t0cnt mov a,t0cnt cjne a,#50,it0end mov t0cnt,#00h inc second mov disp_flg,#01h mov a,second cjne a,#60,it0end mov second,#00h inc minute mov a,minute cjne a,#60,it0end mo

30、v minute,#00h inc hour mov a,hour cjne a,#24,it0end mov hour,#00hit0end:pop acc pop psw reti;=;lcd显示子程序;=disp:lcall funset ;对lcd进行初始化 noplcall funsetnoplcall funsetnop lcall lcd_dely lcall dispon lcall lcd_dely lcall manlcdmov a,stimecjne a,#00h,dispset1 lcall lcd_delylcall lcd_delymov r2,#80hlcall

31、wrlcdmov r3,#0ehmov dptr,#clock ;显示clocklcall disp_chrsjmp disp_t;dispset1:cjne a,#01h,dispset2;显示settime1lcall lcd_dely lcall lcd_dely mov r2,#84h lcall wrlcdmov r3,#09hmov dptr,#settime1lcall disp_chrsjmp disp_t1dispset2:lcall lcd_dely ;显示settime2lcall lcd_dely mov r2,#84h lcall wrlcdmov r3,#09hmo

32、v dptr,#settime2lcall disp_chrsjmp disp_t2disp_end1:sjmp disp_enddisp_t:mov r1,#hour;显示clock的时间 mov r0,#disp_buf mov a,cover_flg cjne a,#00h,nc lcall convertnc: lcall lcd_dely mov r2,#0c4h lcall wrlcd mov r0,#disp_buf mov r3,#08h lcall disp_dat sjmp disp_enddisp_t1:mov r1,#hour1 mov r0,#settime1_buf

33、;显示settime1的时间 mov a,cover_flg cjne a,#00,nc1 lcall convertnc1: lcall lcd_dely mov r2,#0c4h lcall wrlcd mov r0,#settime1_buf mov r3,#08h lcall disp_dat sjmp disp_enddisp_t2:mov r1,#hour2 ;显示settime2的时间 mov r0,#settime2_buf mov a,cover_flg cjne a,#00,nc2 lcall convertnc2: lcall lcd_dely mov r2,#0c4h

34、lcall wrlcd mov r0,#settime2_buf mov r3,#08h lcall disp_datdisp_end: ret;=;lcd驱动子程序;=;*;向lcd写入指令;入口:r2为输出数据;*wrlcd:clr lcd_rs clr lcd_rw setb lcd_e lcall e8155_b clr lcd_e nop ret;*;向lcd写入数据;入口:r2为输出数据;*wdlcd:setb lcd_rs clr lcd_rw setb lcd_e lcall e8155_b clr lcd_e nop ret ;*;读lcd状态;检测lcd是否忙;*lcd_d

35、ely:mov r5,#10 lcall delay_msret;*;向lcd写入清屏指令;入口:r2为输出数据;*clrlcd:mov r2,#01h lcall wrlcd ret;*;向lcd写入初始化指令,光标右移等;入口:r2为输出数据;*manlcd:mov r2,#06h lcall wrlcd ret;*;向lcd写入初始化指令 ,开显示,无光标,无闪烁;入口:r2为输出数据;*dispon:mov r2,#0ch lcall wrlcd ret ;*;向lcd写入初始化指令 ,设置8位数据口,2行显示,5*8点阵;入口:r2为输出数据;*funset:mov r2,#38h

36、lcall wrlcd ret ;*;向lcd写入数据 ,即要显示的固定字符;入口:dptr为表的首址,r3为显示字符数;r2为输出数据暂存位置;*disp_chr:lcall lcd_dely lcall lcd_dely mov a,#00h movc a,a+dptr mov r2,a lcall wdlcd nop inc dptr djnz r3,disp_chr ret;*;向lcd写入数据 ,即要显示的动态时间;入口:r0缓冲区起始地址,r3为缓冲区长度;r2为输出数据暂存位置;*disp_dat:;lcall wrlcdfd1: lcall lcd_dely lcall lcd

37、_dely mov a,r0 mov r2,a lcall wdlcd nop nop inc r0 djnz r3,fd1 ret;*;时间数据转换子程序;入口:r0缓冲区起始地址,;*convert:mov r7,#03hconv: mov a,r1 mov b,#10div abadd a,#30hmov r0,ainc r0mov a,badd a,#30hmov r0,ainc r0mov a,#0ahadda,#30hmov r0,ainc r0dec r1djnz r7,convret;*;8155扩展芯片初始化;*e8155_b:push dph ;入栈保护 push dpl mov a,#02h ;设置8155的b口输出,a口输入mov dptr,#7f00hmovx dptr,a mov a,r2 mov dptr,#7f02h movx dptr,apop dplpop dphret;*;在将bcd码转换成二进制前;对转换对象进行选择;*bcd_as:mov a,stime cjne a,#00h,set1 ;转换clock mov r0,#hour mov r1,#disp_buf lcall cover sjmp bcd_as_endset1: cjne a,#01,set2 ;转换闹钟1 mov r0,

温馨提示

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

评论

0/150

提交评论