单片机.docx
《单片机.docx》由会员分享,可在线阅读,更多相关《单片机.docx(20页珍藏版)》请在冰豆网上搜索。
单片机
微型计算机技术专业方向课程设计报告
题目名称:
多功能数字钟
专业:
自动化班级:
07级2班
姓名:
李东学号:
200728335
学校:
青岛理工大学自动化学院
指导教师:
史贺男丁新平
2010年1月3日至10日
课程设计任务书
·课程名称:
微型计算机技术
·设计题目:
多功能数字钟
·系统硬件要求:
1配置单片机的外部程序ROM空间,容量为16K(使用27128芯片)。
2使用8031内部时钟信号为系统提供计时信号。
3配置6位LED数码管显示时间,设置6位操作按键。
·系统功能要求:
1在6位LED数码显示器上显示:
时、分、秒(各2位)
2按键功能自定义,实现按键调整时间功能。
3具有闹钟功能(选做)
4具有秒表功能(选做)
·其他要求:
1每位同学独立完成本设计
2依据题目内容要求,提出系统设计方案
3设计系统电路原理图
4调试系统硬件电路、功能程序
5编制课程设计报告书并装订成册,报告书内容包括(按顺序):
1报告书封面
2课程设计报告书
3评语页(空白)
4系统设计方案的提出、分析
5系统中典型电路的分析
6系统软件结构框图
7系统电路原理图
8源程序
成绩
评语
1系统硬件设计
1.151单片机与外部存储器的连接
几个重要概念及地址译码方式
①分清地址线:
片内地址线、片选地址线;
②片内地址线的接法:
直接与系统的地址线相连。
③片选地址线的接法:
可用全译码方式、部分译码方式、线选法方式连接。
④用地址译码电路产生芯片的选通信号。
通常这种选通信号采用集成译码电路产生。
1.28031通过8155对LED的接口(包括按键)
8031对8155的连接(图)
8155含有:
①256字节的RAM;
②一个14位定时/计数器
③三个并行I/O口:
A、B、C口。
其中A、B口为8位,C口为6位。
A、B口可作为基本I/O口,也可作为选通I/O口;C口除可作为基本I/O口外,还可用作A口、B口的应答控制联络信号线;
④一个控制寄存器组,用来存放控制命令字;
8155引脚说明:
①AD0~AD7:
地址/数据复用线。
可与P0口直接相连。
②CE:
片选,输入,低电平有效。
③IO/M:
RAM和I/O口选择线。
当IO/M=1时,选中I/O口;
当IO/M=0时,选中RAM。
④ALE:
地址锁存信号。
⑤RD:
读选通,输入,低电平有效。
⑥WR:
写选通,输入,低电平有效。
⑦TIMERIN:
定时器输入,是片内定时器的脉冲信号输入端。
⑧TIMEROUT:
定时器输出,计时结束时可以输出矩形波或脉冲波。
⑨PA0~PA7、PB0~PB7:
A/B口通用的输入/输出线。
由编程来决定是输入还是输出。
⑩PC0~PC5:
C口的输入/输出或控制信号线。
8155对LED的连接(图)
显示要点
①要对8155初始化:
A口、C口均设为输出
②要设置一个显示缓冲区:
DISBUF存放要显示的数,利用内部RAM(70H~73H)
③在程序中建立一个段码(字形码)表:
TAB
④利用查表指令:
MOVCA,@A+DPTR取出段码
⑤轮流扫描显示(位码左移,指向下一位LED)
数码管由7个发光二极管组成,行成一个日字形,它门可以共阴极,也可以共阳极.通过解码电路得到的数码接通相应的发光二极而形成相应的字,这就是它的工作原理.基本的半导体数码管是由7个条状的发光二极管(LED)按图1所示排列而成的,可实现数字"0~9"及少量字符的显示。
另外为了显示小数点,增加了1个点状的发光二极管,因此数码管就由8个LED组成,我们分别把这些发光二极管命名为"a,b,c,d,e,f,g,dp",
数码管的分类:
数码管按各发光二极管电极的连接方式分为共阳数码管和共阴数码管两种。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。
共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。
当某一字段的阳极为低电平时,相应字段就不亮。
共阴数码管内部连接。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。
共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的阴极为高电平时,相应字段就不亮。
共阳数码管内部连接。
8031通过8155对LED(图)
2系统软件
2.1按键功能
S1键:
秒设置键
S2键:
时设置键
S4键:
时间/闹钟/秒表键
S5键:
分设置键
2.2软件流程图
2.3软件分析
2.3.1中断服务程序
时间的运行依靠定时中断子程序对时钟单元数值进位调整来实现的。
计数器T0打开后,进入计时,满100毫秒后,重装定时。
中断一次,满一秒后秒进位,满60秒后即为1分钟,分钟单元进位,60分到了后,时单元进位,24小时满后,天单元进位。
这样然后根据进率,得到年、月、日、时、分、秒存储单元的值,并经译码后,通过扫描程序送LED中显示出来,实现时钟计时功能。
累加是用指令INC来实现的。
进入中断服务程序以后,执行PUSHPSW和PUSHA将程序状态寄存器PSW的内容和累加器A中的数据保存起来,这便是所谓的.保护现场..以保护现场和恢复现场时存取关键数据的存储区叫做堆栈。
在软件的控制之下,堆栈可在片内RAM中的任一区间设定,而堆栈的数据存取与一般的RAM存取又有区别,对它的操作,要遵循.后进先出.的原则。
2.3.2定时器/计数器
在实际的控制系统中常要求有外部实时时钟,以实现定时或延时控制;还要求有外部计数器,以实现对外界事件进行计数。
不管是定时还是计数工作方式,定时器T0或T1在对内部时钟或对外部事件计数时,不占用CPU事件,除非定时器/计数器溢出,才可能中断CPU的当前操作。
由此可见,定时器是单片机中效率高而且工作灵活的部件。
在作定时器使用时,输入的时钟脉冲是由晶体振荡器的输出
经12分频后得到的。
当它用作对外部事件计数时,接相应的外部输入引脚T0(P3.4)或T1(P3.5)。
51对内部定时/计数器的控制
在51中,与定时/计数器T0、T1工作方式有关的寄存器为TMOD和TCON。
其中:
TMOD控制定时/计数器T0、T1的工作方式,而TCON控制定时/计数器的启动方式和禁止/允许定时中断。
定时器共有两个控制字,由软件写入TMOD和TCON两个8位寄存器,用来设置T0或T1的操作模式和控制功能。
3设计体会
数字时钟是采用数字电路实现对时、分、秒进行数字显示的计时装置,广泛用于个人家庭、车站办公室等公共场所,成为人们日常生活中不可缺少的必需品。
通过这次的实习,了解了电子时钟的电路结构图,更好的熟悉了电子时钟的工作过程和原理。
再设计的过程中,在硬件的选型方面,即选电容、电阻等时遇到了一些问题,经过查书和上网查资料最终解决了问题。
Protel软件是上学期实习时学习如何使用的,经过了一学期的时间,对于软件的部分功能忘记了,在经过了熟悉之后,终于成功的设计出来了。
最困难的当属程序的设计了,从书本上和网上查找了大量资料,总算将程序写了出来。
经过实习之后,发现自己在单片机的各个方面还有许多不足,同时也学习了大量知识和收获了宝贵的经验。
;*****led显示单片机定时闹铃程序*************************************
;变量地址分配
;************************************
HourEQU3AH;小时计数器的地址
MinuteEQU3BH;分钟计数器的地址
SecondEQU3CH;秒计数器的地址
P1ValEQU3DH;数码管位驱动值的地址
ClockModeBIT20H.0;模式(正常走时/闹时)设置寄存器地址,
值为0时正常走时,为1时闹时设定
AlarmOnOffBIT20H.1;闹钟开启/关闭标志,为0关闭,为1开启
AlarmTimeOnBIT20H.2;此位为1时表示闹时时间到
DispHourEQU21H;小时显示寄存器的地址
DispMinuteEQU22H;分钟显示寄存器的地址
DispSecondEQU23H;秒显示寄存器的地址
AlarmHourEQU2EH;闹时小时计数器的地址
AlarmMinuteEQU2FH;闹时分钟计数器的地址
S4BITP3.2;闹钟设置键
S2BITP3.3;小时设置键
S5BITP3.5;分钟设置键
;***********
;程序开始
;***********
ORG0000H
AJMPMain
ORG0BH
AJMPTimeInt
ORG0020H
Main:
MOVSP,#70H
MOV39H,#14H
MOVHour,#12
MOVMinute,#00
MOVSecond,#00
MOVAlarmHour,#06
MOVAlarmMinute,#00
CLRClockMode
CLRAlarmTimeOn
SETBp1.7
MOVTMOD,#00000001B
MOVTH0,#03CH
MOVTL0,#0B0H
MOVIE,#82H
SETBTR0
L1:
JBK1,CheckMinuteKey
LCALLDelay
JBK1,CheckMinuteKey
SETBClockMode
LCALLAlarmSet
CheckMinuteKey:
JBK3,CheckHourKey
MOVA,Minute
ADDA,#1
MOVMinute,A;
CJNEA,#60,NotOver1
MOVMinute,#0
NotOver1:
JNBK3,$
CheckHourKey:
JBK2,CheckAlarm
MOVA,Hour
ADDA,#1
MOVHour,A
CJNEA,#24,NotOver2
MOVHour,#0
NotOver2:
JNBK2,$
CheckAlarm:
;
JNBAlarmTimeOn,ToReturn
LCALLLOOP
ToReturn:
AJMPL1
;***************************
;定时器Timer0中断服务程序
;***************************
TimeInt:
MOVTH0,#03CH
MOVTL0,#0B0H
PUSHACC
PUSHPSW
SETBRS0
CLRRS1
DJNZ39H,NotoneSecond
MOV39H,#14H
LCALLClock
LCALLConvertoBuffer
NotoneSecond:
LCALLScanDisplay
POPPSW
POPACC
RETI
ScanDisplay:
MOVR1,#30H
MOVR4,#11111110B
MOVA,R4
PLAY:
MOVP2,A
MOVA,@R1
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
LCALLDelay
INCR1
MOVA,R4
RLA
JNBACC.6,LD1
MOVR4,A
AJMPPLAY
LD1:
RET
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
Clock:
MOVA,Second
ADDA,#1
MOVSecond,A
CJNEA,#3CH,NotOverFlow
MOVSecond,#0
MOVA,Minute
ADDA,#1
MOVMinute,A
CJNEA,#3CH,NotOverFlow
MOVMinute,#0
MOVA,Hour
ADDA,#1
MOVHour,A
CJNEA,#18H,NotOverFlow
MOVHour,#0
NotOverFlow:
JNBAlarmOnOff,NotAlarm
MOVA,Minute
CJNEA,AlarmMinute,NotAlarm
MOVA,Hour
CJNEA,AlarmHour,NotAlarm
SETBAlarmTimeOn
NotAlarm:
RET
ConvertoBuffer:
MOVR1,#30H
JBClockMode,DispAlarmSet
MOVA,Second;
MOVDispSecond,A;
MOVA,Minute;
MOVDispminute,A;
MOVA,Hour;
MOVDispHour,A
AJMPConvert
DispAlarmSet:
JBAlarmOnOff,AlarmOn
MOVDispSecond,#00H
AJMPNext
AlarmOn:
MOVDispSecond,#11
Next:
MOVA,AlarmMinute
MOVDispminute,A
MOVA,AlarmHour
MOVDispHour,A
Convert:
MOVA,DispSecond
MOVB,#10
DIVAB
MOV@R1,B
INCR1
MOV@R1,A
INCR1
MOVA,DispMinute
MOVB,#10
DIVAB
MOV@R1,B
INCR1
MOV@R1,A
INCR1
MOVA,DispHour
MOVB,#10
DIVAB
MOV@R1,B
INCR1
MOV@R1,A
RET
;************************************
;闹时设置子程序
;************************************
AlarmSet:
JNBK1,$
LCALLDelay
CheckArmMinuteKey:
JBK3,CheckArmHourKey
CL1:
SETBAlarmOnOff
MOVA,AlarmMinute
ADDA,#1
MOVAlarmMinute,A
CJNEA,#60,ArmNotOver1
MOVAlarmMinute,#0
ArmNotOver1:
JNBK3,$
CheckArmHourKey:
JBK2,AlarmSetEnd
SETBAlarmOnOff
MOVA,AlarmHour
ADDA,#1
MOVAlarmHour,A
CJNEA,#24,ArmNotOver2
MOVAlarmHour,#0
ArmNotOver2:
JNBK2,$
JBK3,AlarmSetEnd
ACALLCL1
AlarmSetEnd:
JBK1,AlarmSet
JNBK1,$
CLRClockMode
RET
;************************************
;闹时服务子程序
;************************************
LOOP:
CLRP1.7
ACALLDelay1
SETBP1.7
JBK1,LOOP
JNBK1,$
CLRAlarmOnOff
CLRAlarmTimeOn
AlarmReturn:
RET
;************************************
;延时子程序
;************************************
DELAY1:
MOVR3,#15
LOOP1:
MOVR5,#90
NOP
LOOP2:
DJNZR5,LOOP2
DJNZR3,LOOP1
RET
Delay:
MOVR6,#05H
Del:
MOVR7,#08Fh
DJNZR7,$
DJNZR6,Del
RET
END
这个程序到这里就完毕了,再来一个简单一点的单片机定时闹铃程序,不过不带led显示,定时1秒,要其他时间自己修改R0和R1的就可以了。
ORG0000H
;LJMPMAIN
;ORG0030H
;MAIN:
MOVSP,#60H
MOVTMOD,#02H
MOVTL0,#06H
MOVTH0,#06H
MOVR0,#100
MOVR1,#20
SETBTR0
WAIT:
JNBTF0,$
CLRTF0
DJNZR1,WAIT
MOVR1,#20
DJNZR0,WAIT
MOVR0,#100
CPLP1.0
AJMPWAIT
END