基于PIC16F877的LED旋转时钟单片机设计实验报告.docx
《基于PIC16F877的LED旋转时钟单片机设计实验报告.docx》由会员分享,可在线阅读,更多相关《基于PIC16F877的LED旋转时钟单片机设计实验报告.docx(43页珍藏版)》请在冰豆网上搜索。
基于PIC16F877的LED旋转时钟单片机设计实验报告
期中检查
2013年小学期单片机设计实验报告
题目:
基于PIC16F877单片机地LED旋转时钟
班级:
学号:
班内序号:
实验组号:
学生姓名:
指导教师:
教师评语
指导教师签字:
年月口
基于PIC16F877单片机地LED旋转时钟
——班
实验摘要
本次我们制作地基于PIC16F877单片机地LED旋转时钟是能够输入、显示时间地时钟.结构新颖,效果奇特•加入了现代科技地元素,利用人眼地视觉暂留特性,解决了传统时钟结构单一,显示效果固定地缺陷,更好了满足了人们对美地追求.
整个系统中,微控制器采用了Microchip公司地PIC16F877,软件设计中涉及PORTA用作普通数字LO脚控制按键输入,PORTE、PORTC控制灯地亮灭,PORTD向时钟芯片DS1302写入和读出时间.
概扌舌来说,本实验就是用人眼地视觉暂留特性,用PIC16F877单片机作为主控芯片,采用电机带动发光二极管高速旋转,利用频闪显示原理呈现时钟画面.
Abstract
Intliisexperiment,wemadeaLEDrotatingclockbaseonPIC16F877MCU.Itcanmputandshowtime・Itsstmctureisnovelanditseffectisamazing.It'sfiillofmodemtechnologyelement.Withhumaneyes'persistenceofvision,itsolvestraditionalclock'sstinctureandeffect'sdisadvantage,fitshumanpursueforbeautybetter.
ThesystemusestheproductionoftheMicrochipcoid-PIC16F877.ThedesignmcludesthediiveofPORTAasgeneraldigitalportstomputtime,thediiveofPORTBandPORTCtocontroltheLED'son,thedi'iveofPORTDtowriteandreadtimeoilDS1302.
Illconclusion,withhumaneyes'persistenceofvision,tinsexpernnentusesPIC16F877MCUasmasterclup,usesmotortodiiveLEDrotateathighspeed,usesstrobedisplayprincipletoshowdieclock.
关键字
单片制Lnuciocontioller芯片MOSchip
LED旋转时钟--LEDrotatingclock
一.实验论证与比较
1.LED显示模块
LED地特点非常明显,寿命长、光效高、无辐射与低功耗.LED地光谱几乎全部集中于可见光频段,其发光效率可达80〜90%.将LED与普通白炽灯、螺旋节能灯及T5三基色荧光灯进行对比,结果显示:
普通白炽灯地光效为121m/W,寿命小于2000小时,螺旋节能灯地光效为601m/W,寿命小于8000小时,T5荧光灯则为961m/W,寿命大约为10000小时,而直径为5亳M地白光LED为20-281111/W,寿命可大于100000小时.有人还预测,未来地LED寿命上限将无穷大.由于LED地种种优势,使得其在现在地各个领域里运用越来越广泛,我们设计地旋转LED显示屏幕,具有结构新颖,节约材料地特点,一列16个LED灯旋转显示之后,可以代替显示近似于16x120像素地显示宽度和内容.
旋转时钟是利用视觉暂留效应设计出来地,物体在快速运动时,当人眼所看到地影像消失后,人眼仍能继续保留其影像0.1-0.4秒左右地图像,这种现象被称为视觉暂留现彖.是人眼具有地一种性质•人眼观看物体时,成像于视网膜上,并由视神经输入人脑,感觉到物体地像•但当物体移去时,视神经对物体地印象不会立即消失,而要延续0.1-0.4秒地时间,人眼地这种性质被称为“眼睛地视觉暂留”
假设我们设定我们地眼睛地暂留时间是0.4秒,如果我们地16个LED旋转一周地时间快过0.4秒,那么我们看到地图像就是这一列LED在各个位置显示地图像地叠加,如右图,如果我们用定时器把LED旋转一周地各个位置分割出120分,让它在相应地位置显示相应地图像,那么我们就可以得到一个累加地图像效果了.
90列
旋转LED时钟地实现方法是把一组LED(16个左右)紧密地排列成一条直线,组成一条LED列,每个LED都由PIC单片机来控制其点灭.把整个电路板固定在电机上,使得紧密排列地LED条地一端固定在电机地旋转轴附近,如图所示.电路板转过一圈地时间极短,远小于0.1秒.通过单片机控制LED灯在一圈内转到不同位置时地亮灭,来显示图像或文字.
2.DS1302时钟模块
大多数地单片机没有实时时钟部件,一旦系统掉电时钟就不能运行,下次再运行,时间就不准确了•即便使用备用电池,但要维持单片机系统地较人功耗也是坚持不了多久地.而我所做地旋转时钟用到地单片机主要是来准确显示时间地,因此实时时钟部件必不可少,这里我用了MAXIM公司地DS1302时钟芯片作为实时时钟部件,保证时间地长久准确性.
DS1302有着很强地功能.包括时钟/口历寄存器和31字节(8位)地数据暂存寄存器,数据通信仅通过一条串行输入输出丨1•实时时钟/口历提供包括秒、分、时、口期、月份和年份信息.闰年可自行调整,可选择AMPM地12小时制或24小时制.只通过三根线进行数据地控制和传递:
CE(输入信号,在读、写数据期间,必须为高.该引脚有两个功能:
第一,CE开始控制字访问移位寄存器地控制逻辑:
其次,CE提供结束单字节或多字节数据传输地方法.):
1/0(三线接II时地双向数据线):
SCLK(串行时钟输入).通过备用电源可以让芯片在小于1MW地功率卞运作.对时钟寄存器初始化可以设定当前时间,控制芯片地运行,时间是用BCD码保存地,RAM可以用来存取用户数据,在用了备用电池后RAM内地数据在系统掉电时能够保持不丢失.芯片采用了简单地I2C三线通信方式,便于节省芯片资源和与之接II地MCU地引脚.芯片有着2.0〜5.5V地宽供电电压范围,在5V供电时其接II与TTL电平兼容.并且有着很低地功耗,在2.0V供电时仅耗30011A地电流.引脚XI和X2连接32.768kHz晶体,与内部振荡器组成时钟.晶体地精度直接影响着芯片时间地准确与否.DS1302有两个电源引脚VCC1和VCC2,分别连接备用电池和电源VCC.VCC2与主电源连接,VCC1接备用电池.当VCC2低于VCC1时,芯片由VCC1供电;当VCC2ATCC1>O.2V时,备用电池为芯片供电.在VCC2供电时芯片能够对接在VCC1地备用电池充电,并且是否充电和充电电流都可以由芯片内地址为08H地时钟寄存器进行控制.DS1302与单片机地硬件接线图如图三所示.
—三DS1302硬件接线图
在进行任何数据传输时,CE必须被制高电平(虽然CE被置为高电平,但内部时钟还是在晶振作用下不停地计时地),在每个SCLK上升沿时读入数据,下降沿时写出数据.每个字节地传输都是由控制字节(如表1所示)指定地,控制字节地最高位Eit7必须是“1”,否则读写将会被禁止.应6为“0”则指定对时钟/口历寄存器进行读写操作,为T”则对RAM区地数据进行读写操作,b”l-b"5指定相关寄存器进行输入输出操作,最低位bitO指定是输入还是输出,为“0”则为写,相反则为读,输入输出根据脉冲地上升沿和卞降沿串行进行.
7
6
5
4
3
2
1
0
1
RAM/
CK
用来表示相关寄存器地地址
RD顾
表1DS1302控制字节
控制字总是从最低位开始输出•在控制字指令输入后地卞一个SCLK时钟地上升沿时,
数据被写入DS1302,数据输入从最低位(0位)开始•同样,在紧跟8位地控制字指令后地下一个SCLK脉冲地下降沿,读出DS1302地数据,读出地数据也是从最低位到最高位.数据读写时序如图四所示.
RST
」单字节读L
SCLK
I/O
—(R/WAOAlA2A3A4R/C1-
RST
J单字节写—
SCLK
I/O
—(Rw|AOAlIA2A3A4〔R/c|1XDOD1|D2D3D4D5D6|D7)
图四DS1302数据读写时序
通过8个脉冲便可读取一个字节,从而实现串行输入与输出•最初通过8个时钟周期载入控制字节到移位寄存器•如果控制指令选择地是单字节模式,连续地8个时钟脉冲可以进行8位数据地读写操作・8个脉冲便可读写一个字节•载入控制字节后就可以对时钟/口历寄存
器进行相应操作,时钟/口历寄存器如下表所示.
读寄存器
写寄存器
BIT7
BIT
6
BIT5
BIT4
BIT
3
BIT2-BIT0
范围
81h
80h
CH
16-59秒
0J5秒
00-59
83h
82h
16-59分
0-15分
00-59
85h
84h
12
0
20-23
15-19时
0J5时
1-12/
0-23
24
AM/P
M
87h
86h
0
0
0
16-31口
0-15口
1-31
89h
88h
0
0
0
10月
月
1-12
8Bh
8All
0
0
0
0
0
1・7周
1-7
8Dh
8Ch
0
15・99年
0J5年
00-99
8Fh
8Eh
WP
0
——
秒寄存器(81h、80h)地位7定义为时钟暂停标志(CH)•当该位置1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行.小时寄存器(85h、84h)地位7用于定义DS1302是运行于12小时模式还是24小时模式•当为高时,选择12小时
模式•在12小时模式下,位5为1时,表示PM•在24小时模式时,位5是第二个10小时位
(20-23时)•控制寄存器(8Fh、8Eh)地位7是写保护位(WP),其它7位均置为0•在任何
地对时钟和RAM地写操作之前,WP位必须为0•当WP位为1时,写保护位防止对任一寄存器地写操作.
二•系统总体设计
1•系统模块总体框图如下:
程序总体框图:
开始旋转,显示时钟界面
结束
2•输入时间模块框图
该模块利用两个按键SW1和SW2实现时间输入.swl按一次时间加bSW2按一次切换
时、分、秒地输入•按完三次sw2结束•通过八个LED灯显示输入地时间地二进制数.
3.DS1302读写模块写时间程序框图:
4.LED显示模块
单片机转20圈(小于1秒)从DS1302读一次数•将表盘分成120格,走一格计数器
加1.
程序框图:
是
三•硬件连接
两个按键SW1和SW2接PORTAO和PORTA1.PORTB和PORTC接16个LED灯.PORTDO接DS1302地SLCK(时钟),PORTD1接DS1302地I/O接I丨,PORTD2接DS1302地CE(使能端).马达上套一个轮子,用万能胶粘在电路板上.PIC单片机和LED灯由电路板上两个纽扣电池供电.
实物连接图:
正面图:
背面图:
侧面图:
局部细节图:
效果图:
电路原理图:
Hzzi"卜
弋mb-C二H*3-3tT±i3TJ-卅
-
-CP-KF^
YTRKH20
4山
R"Rib:
如jz
5口s
R疗••訂工
上2。
・小、:
/Oc二
四•调试过程
在此,列举几个调试过程中遇到地地问题.
1.RA端II地输入和输出问题
上述提到我们用RAO、RA1接上两个按键给单片机输入时间,但是,我在编写好程序进行单步调试时,发现尽管我用异步激励将这三个端II设置为高电平,在观察窗II中RA地值没有丝亳变化.经过思考,并联系提高篇中讲到地RA端II兼备5条数/模转换器地模拟量输入通道,在将RA端II当作普通数字输入/输出端II时需要将其控制寄存器ADCON1地低
四位送入011x(x取0或1均可)•因此,修改程序后,再次编译和调试,问题得到解决.
2.DS13O2地编码问题
开始我没有注意DS13O2里存地是BCD码而不是普通二进制码,结果秒针一跳一跳
地不能连续地走•修改完后时间恢复正常.
3•读取时间地问题
单片机读取DS1302需要一定地时间.每秒钟时钟人概转二十几转,每转一圈读一次
时间没有必要,所以我设定转20圈(一秒钟内)读一次时间.
五•参考文献:
地.
PIC单片机实用教程——基础篇(五号宋体)
李学海
北京航空航天大学出版社
使用说明:
地确是一本不可或缺地教材,本书列举了很多实用地具有实战意义地例子,单片机入门就是通过把这本书里地好例子一字一行敲进电脑去来实现
PIC单片机实用教程一高篇
李学海
北京航空航天大学出版社
使用说明:
继承了前面基础篇地风格,例子也具有实战意义,主要讲RA、TMR2地使用和CCP模块地PWM脉宽调制功能.
六.实验心得体会
通过本次实验,我对单片机有了一个初步地认识,也能用汇编编写一些简单地程序.这次地程序800行左右,不长,但绝人多数是我自己打地.看着单片机能够实现自己编写地程序所设定地功能,还是很有自豪感地.这次实验对我地动手实践能力是一次极人地考验,我也从中学到了很多东西.除了动手能力有所提高外,得益于二人组队地形式,我也明白了团队协作地重要性,获得了许多与他人合作地经验•在这里也要感谢我地两位老师和队友,他们在实验过程中给予了我非常人地帮助,没有他们,这个单片机很难完成•我也非常希塑能够在以后还能遇上这种动手实践地机会,这是一个很好地提升能力地机遇.
F附汇编代码:
注意,此代码有BUG,秒针会先用55秒走完60秒,然后消失5秒,再出现在0秒处•去掉按键输入时间地模块,直接在程序里把时间打进去,秒针又恢复正常•我研究了几个小时也没找到问题在哪.
彳DEFINET_IOpoitd.l
彳DEFINET_CLKportd.O
彳DEFINET_RSTpond,2
彳DEFINEDS1302.RX27H
o1302I_O
o1302时钟
o1302使能位
O保存接受地1个数据
彳DEFINEDS1302.TX28H
°准备写入到DS1302地一个数据
mdf
equ
OOh
status
equ
03h
ipO
equ
5h
C
equ
Oh
z
equ
2h
fsr
equ
04h
adconlequ
9fli
trisb
equ
86h
trisc
equ
87h
trisd
equ
88h
poitb
equ
06h
pone
equ
07h
pond
equ
08h
poita
equ
05h
trisa
equ
85h
n
equ
20ho延时循坏变量
counterequ
21ho
指针位置计数器
seen
equ
22ho
秒针列数
iniim
equ
23ho
分针列数
hourn
equ
24ho
时针列数
jumpdec
equ
25ho跳转判断,0位秒
hourc
equ
26ho
dTO:
时钟计数循坏变屋
t1位分,2位时
counter1equ29h
temp_cntequ2all
32h
33h
34h
35h
36h
37hdT3・Offli
tblequ38ho十位
tb2equ39h。
个位
O主程序
O输入时间
orgOOOOh
goto111aill
org000511
111am
bsfstatusapO
cliftrisco设置c丨I输出cliftrisbo设置b丨I输出cliftnsd。
设置d口输出movlwOfflimovwftrisa。
aII定义为输入
movlw06hmovwfadconlcall设为数字IObcfstatusdpOo体0
clifseen
clifiniim
clifhourn
clifjumpdec
clifportb
clifportCocII灯灭
clifpond
clifW_Hour
clifW_Miiiute
clifW_Second
setW_HourbtfssportaJ
gotosetW_Mmute1
checkbtfscporta.O
gotosetW_HourcalldelaybtfscpogO
gotocheck
iiicfW_Hour,l
osw2是否按下
测开关swl按卞否?
是,跳过下条指令否!
则循坏检测
再次测开关swl按卞否?
是,跳过下条指令否!
则循坏检测
时针加1
movlw心12・
btfscstatus,Z
clifW_HourmovfW_Hour,0movwfponecheck1btfssporta,0gotocheck1calldelaybtfssporta.Ogotocheck1gotosetW_Hour
o测开关swl断开否?
是,跳过下条指令
o否!
则循坏检测
o再次测开关SW1断开否?
是,跳过下条指令
o否!
则循坏检测
。
返回
osw2是否按下
o测开关swl按下否?
是,跳过下条指令
o否!
则循坏检测
o再次测开关swl按卞否?
是,跳过下条指令
o否!
则循坏检测
。
分针加1
°看是否等于60
。
测开关swl断开否?
是,跳过下条指令
o否!
则循坏检测
o再次测开关swl断开否?
是,跳过下条指令
o否!
则循坏检测
。
返回
check4btfscporta,0
o测开关swl按下否?
是,跳过下条指令
gotosetW_Second
o否!
则循坏检测
calldelay
btfscpoila,0
o再次测开关swl按下否?
是,跳过下条指令
gotocheck4
o否!
则循坏检测
iiicfW_SecondJ
。
秒针加1
movlwd*60*
subwfW_Second.O
。
看是否等于60
btfscstatus.Z
clifW_Second
movfW_Second.O
movwfpone
check5btfssporta.O
o测开关SW1断开否?
是,跳过下条指令
gotochecks
o否!
则循坏检测
calldelay
btfssporta.0
o再次测开关swl断开否?
是,跳过下条指令
gotochecks
o否!
则循坏检测
gotosetW_Second
o返回
begincalltbcdo显示时间
call
Set_DS1302
rsrn
movlw
df20*
movwf
readn。
20圈读一次时间
show
movlw
df20*
subwf
readn,0
btfsc
status.Z
call
Get_DS1302
call
bedt
deef
readnJ
clif
countero指针位置计数器清零
judge
call
cleaico清表盘
movlw
cT119・
subwf
counter.O
btfsc
status.Z
goto
rsino判断指针位置计数器是否达到119
.***************是否显示刻度***************
movlwdOsub\vfcounter,0
btfsc
call
status.Zdraw20
movlwd'rsub\vfcounter,0
btfsccall
status’Zdraw21
movlwd2subwfcounter^
btfsc
call
status,Zdraw22
movlwd3*sub\vfcountenO
btfsc
call
status,Zdraw23
movlwd'l(T
subwfbtfsccall
countei;0status^Zdrawgia
movlwsubwfbtfsccall
d・2(Tcountei;0status.Zdrawgia
movlwsubwfbtfsccall
d"countei;0status^Zdraw3_O
movlwsubwfbtfsccall
cT28・countei;0status^Zdraw3_l
movlwsubwf
counter,0
btfscstatus^Zcalldraw3_2
movlwcT3(T
sub\vfcounter^btfscstatus^Zcalldraw3_3movlwd31*subwfcounter,0btfscstatus.Zcalldraw3_4movlwd32*subwfcounter^btfscstatus.Zcalldraw3_5movlwd33*subwfcounter,0btfscstatus.Zcalldraw3_6movlwdWsubwfcounter,0btfscstatus.Zcalldrawgrasubwfcounter,0btfscstatus.Zcalldrawgrasubwfcounter,0btfscstatus.Z
call
draw6_0
subwfcounter,0btfscstatus.Zcalldraw6_lmovlwcT6(ysubwfcounter,0btfscstatus.Zcalldraw62
movlwd^l*sub\vfcounter,0
btfsccall
status,Zdraw63
movlwcT62・subwfcounter,0
btfsccall
status.Zdraw64
movlwcT70・
subwfbtfsccall
coun