课程设计.docx
《课程设计.docx》由会员分享,可在线阅读,更多相关《课程设计.docx(20页珍藏版)》请在冰豆网上搜索。
![课程设计.docx](https://file1.bdocx.com/fileroot1/2023-2/1/4516976c-57d0-45aa-9a30-fc278e0a6eb1/4516976c-57d0-45aa-9a30-fc278e0a6eb11.gif)
课程设计
一、设计名称:
秒表计时器
二、设计目的与要求:
目的:
通过对电子时钟的设计实践,了解PIC单片机系统控制过程、设计要求、应完成的工作内容和具体设计方法。
通过设计也有助于复习、巩固以往所学的知识,达到灵活应用的目的。
课程设计应强调能力培养为主,在独立完成设计任务的同时,还要注意其他方面的能力的培养与提高,如独立工作能力与创造力;综合运用专业及基础知识的能力,解决实际工程技术问题的能力等。
要求:
通过试验箱上的后四位LED显示器显示时钟范围:
00.00秒-99.99秒,分辨度:
0.01秒。
在设计过程中用一个定时器作为基本计数单元,使用一个矩阵式四键键盘进行控制,当定时器定时时间到时,就让0.01秒计数单元加1,当秒计数达到99.99时,就自动返回到0,重新开始秒计数。
并且使其前四位显示字符,字符难易度不论。
三、设计原理说明:
PIC16F877原理简介
1.1、
PIC16F877特性:
PIC16F877是由Microchip公司所生产开发的新产品,属于PICmicro系列单片微机,具有Flashprogram程序内存功能,可以重复烧录程序,适合教学、开发新产品等用途;而其内建ICD(InCircuitDebug)功能,可以让使用者直接在单片机电路或产品上,进行如暂停微处理器执行、观看缓存器内容等,让使用者能快速地进行程序除错与开发。
如图1为PIC16F877的40根接脚图,PDIP是指一般最常见的DIP(DualInLinePackage)包装,而PIC单片机也有PLCC(PlasticLeadedChipCarrier)与QFP(QuadFlatPackage)两种形式的包装,依照不同的需求,寻找不同的包装形式。
如图所示,每根接脚都有其特定功能,例如Pin11与Pin32(VDD)为正电源接脚,Pin12与Pin31(VSS)为地线接脚;而有些接脚有两种甚至三种以上功能,例如Pin2(RA0/AN0)代表PORTA的第一支接脚,在系统重置(Reset)后,可自动成为模拟输入接脚,接收模拟讯号,也可经由程序规划为数字输出输入接脚。
设计原理:
此次课程设计题目是秒表计时器,由课程设计的要求和任务,以及单片机课程学习和实验,最终采用MAPLAB+ICD+实验箱作为软件编程硬件调试平台,由于设计为秒表,要求系统对时间敏感,采用了定时器和简单循环来定时,其中一个软件一个硬件,会在方案论证中分析在0.01秒时采用的是硬件定时,即用单片机内部的定时器TMR0。
先将时钟初始化,赋入初值2ms定时,循环5次来进行0.01秒定时。
然后由定义的变量S0来进行加一运算,然后将其值通过PIC的SPI硬件接口将数据发送至级联的74HC595,最终在数码管上进行静态显示。
其中数码管的显示时,我在程序中首先定义了两个关于数码管显示的字形码定义,一个带小数点,一个不带小数点,以便在显示时调用即可。
四、硬件设计:
系统设计总框图:
硬件使用实验室现有多功能实验箱作为基础平台部分电路如图所示:
键盘:
其中K2为开始键,K4为暂停/继续键,K1为清零键。
.
由于电路为矩阵键盘,所以程序中先查询是否有按键按下,再判断是哪个按键按下。
显示电路:
利用单片机现有硬件SPI接口,外接八个级联74HC595实现静态显示。
由于设计只需要四位数码管,其余位作为动画显示。
74HC595参数:
QA--QH:
八位并行输出端。
QH':
级联输出端。
SI:
串行数据输入端。
74595的控制端说明:
/SCLR(10脚):
低点平时将移位寄存器的数据清零。
SCK(11脚):
上升沿时数据寄存器的数据移位。
QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。
(脉冲宽度:
5V时,大于几十纳秒就行了)
RCK(12脚):
上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。
(5V时,大于几十纳秒就行了),更新显示数据。
/G(13脚):
高电平时禁止输出(高阻态)。
如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。
比通过数据端移位控制要省时省力。
五、软件设计:
程序主流程图
中断服务程序流程图
整体电路:
程序清单:
LISTP=16F877
INCLUDE"P16F877.INC"
;---------------------现计时秒表-------------------------------
;时钟显示范围:
00.00秒-99.99秒,分辨度:
0.01秒;所用的寄存器如下
S0EQU0X20;0.01秒计时器
S1EQUS0+1;0.1秒计时器
S2EQUS0+2;1秒计时器
S3EQUS0+3;10秒计时器
SREGEQUS0+4;中断次数计数器
LEDFEQUS0+5;显示的LED的位置指示寄存器
XW_TEMPEQUS0+6;用于中断中保护W的值
XHOSTSEQUS0+7;用于中断中保护STATUS的值
DEYHEQUS0+8
DEYLEQUS0+9;以上两个寄存器用于软件延时
HOSTFEQUS0+0X0A;用于中断中保护FSR0L的值
JIANREQUS0+0X0B;保存键值
TEMPEQUS0+0X0C
ZDYEQUS0+0x0D
ORG0X00
NOP
GOTOMAIN
ORG0X04
GOTOCLKINT;转向中断服务程序
ORG0X10
;--------------------------------------------------------------------------
CONVERT;不带小数点的共阳极码表
ADDWFPCL,1
RETLW0XC0;0
RETLW0XF9;1
RETLW0XA4;2
RETLW0XB0;3
RETLW0X99;4
RETLW0X92;5
RETLW0X82;6
RETLW0XD8;7
RETLW0X80;8
RETLW0X90;9
RETLW0XBF;"-"
RETLW0XFF;灭灯
retlw0x89
retlw0x86
retlw0xc7
retlw0x8c
RETURN
CONVERT2;带小数点的共阳极码表
ADDWFPCL,1
RETLW0X40;0.
RETLW0X79;1.
RETLW0X24;2.
RETLW0X30;3.
RETLW0X19;4.
RETLW0X12;5.
RETLW0X02;6.
RETLW0X78;7.
RETLW0X00;8.
RETLW0X10;9.
RETLW0xA0
RETURN
;-----------------------SPI发送显示子模块--------------------------------
TRANSMIT
CLRFPORTA;LACK送低电平,为锁存做准备
MOVWFSSPBUF;启动发送
WAIT
BANKSELPIR1
BTFSSPIR1,SSPIF
GOTOWAIT;等待发送结束
BCFPIR1,SSPIF;清除中断标志
RETURN
;--------------------------显示子程序模块---------------------------------
DISPLAYMOVLW0X01
MOVWFLEDF
XIANDBTFSCS2,0
GOTOZXC
MOVLW0X0B
GOTOVBN
ZXCMOVLW0X0A
VBNCALLCONVERT
INCFLEDF
MOVFLEDF,W
SUBLW0X05
BTFSSSTATUS,Z
GOTOXIAND;显示动画
MOVLW0X01
MOVWFLEDF
MOVLW0XA0
MOVWFFSR
AGAINXIAN
MOVFLEDF,W
SUBLW0X02
BTFSSSTATUS,Z
GOTOXIANB
MOVFINDF,W
CALLCONVERT2;若是第二位,则查带小数点的码表
GOTOTRAN
XIANB
movfLEDF,w
sublw0x08
BTFSCSTATUS,Z
gotoxian8
movfLEDF,w
sublw0x07
BTFSCSTATUS,Z
gotoxian7
movfLEDF,w
sublw0x06
BTFSCSTATUS,Z
gotoxian6
movfLEDF,w
sublw0x05
BTFSCSTATUS,Z
gotoxian5
xian5MOVFLEDF,W
SUBLW0X05
BTFSSSTATUS,Z
gotoaaa
MOVLW0x0f
CALLCONVERT
GOTOTRAN
xian6MOVFLEDF,W
SUBLW0X06
BTFSSSTATUS,Z
gotoaaa
MOVLW0x0e
CALLCONVERT
GOTOTRAN
xian7MOVFLEDF,W
SUBLW0X07
BTFSSSTATUS,Z
gotoaaa
MOVLW0x0d
CALLCONVERT
GOTOTRAN
xian8MOVFLEDF,W
SUBLW0X08
BTFSSSTATUS,Z
gotoaaa
MOVLW0x0c
CALLCONVERT
GOTOTRAN
aaaMOVFINDF,W
CALLCONVERT
TRANCALLTRANSMIT;发送一个显示数据
INCFFSR
INCFLEDF
MOVFLEDF,W
SUBLW0X09
BTFSSSTATUS,Z
GOTOAGAINXIAN
BSFPORTA,5;最后给一个锁存信号,代表一次显示任务完成
RETURN
;-----------S0计数溢出处理子程序------------
CS0CLRFS0
INCFS1
RETURN
;-----------S1计数溢出处理子程序---------------
CS1CLRFS1
INCFS2
RETURN
;-----------S2计数溢出处理子程序---------------
CS2CLRFS2
INCFS3
RETURN
;-----------S3计数溢出处理子程序---------------
CS3CLRFS3
RETURN
;-----------时钟中断服务程序-------------------
CLKINTMOVWFXW_TEMP;保存W的值
SWAPFSTATUS,W
MOVWFXHOSTS;暂存STATUS的值
MOVFFSR,W
MOVWFHOSTF;保存FSR的值。
以上程序为中断现场保护--6
MOVLW0X07
MOVWFTMR0;对TMR0写入初值
BCFINTCON,T0IF;清除中断标志
INCFSREG
MOVFSREG,W
SUBLW0X05;TMR0每2ms中断一次
BTFSSSTATUS,Z;其中断5次后才执行对S0,S1,S2,S3的操作
GOTOTIFAN
CLRFSREG
INCFS0
MOVFS0,W
SUBLW0X0A
BTFSCSTATUS,Z
CALLCS0
MOVFS1,W
SUBLW0X0A
BTFSCSTATUS,Z
CALLCS1
MOVFS2,W
SUBLW0X0A
BTFSCSTATUS,Z
CALLCS2
MOVFS3,W
SUBLW0X0A
BTFSCSTATUS,Z
CALLCS3
TIFANMOVFHOSTF,W;以下为中断现场恢复
MOVWFFSR;恢复间接寻址指针FSR的值
SWAPFXHOSTS,W
MOVWFSTATUS;恢复STATUS的值
SWAPFXW_TEMP,1
SWAPFXW_TEMP,W;恢复W的值
RETFIE
;-----------------------TMR0初始化子程序-----------------------------------
CLKINSUB
BANKSELOPTION_REG
BCFOPTION_REG,T0CS;TMR0工作于定时器方式
BCFOPTION_REG,PSA;TMR0用分频
BCFOPTION_REG,PS2
BSFOPTION_REG,PS1
BCFOPTION_REG,PS0;TMR08分频比
BANKSELINTCON
BCFINTCON,T0IF;清除TMR0的中断标志
BCFINTCON,GIE;总中断禁止
BSFINTCON,T0IE;TMR0中断允许------10
RETURN
;---------------------------系统初始化子程序------------------------
MAINSUB
BANKSELTRISA
BCFTRISA,5;置RA5为输出方式,以输出锁存信号
BCFTRISB,1
BCFTRISB,2
BSFTRISB,4
BSFTRISB,5;设置与键盘有关的各口的输入输出方式
BCFTRISC,5
BCFTRISC,3;设置SCK与SDO为输出方式
BCFINTCON,GIE;关闭所有中断
MOVLW0XC0
MOVWFSSPSTAT;设置SSPSTAT寄存器
BANKSELSSPCON
MOVLW0X30
MOVWFSSPCON;设置SPI的控制方式,允许SSP方式,
;并且时钟下降沿发送,与“74HC595,当
;其SCLK从低到高电平跳变时,串行输入数据
;(DI)移入寄存器”的特点相对应---15
BCFSTATUS,IRP;间接寻址选中BANK0、BANK1
MOVLW0X01
MOVFTEMP
MOVLW0X00
MOVFJIANR
RETURN;返回
;-------------------------------键扫描子程序-----------------------------
KEYSCANCLRFPORTB;B1和B2两条线上送0
NOP
NOP;经过一段时间的延时,避开引脚电平的过渡过程
MOVFPORTB,W
ANDLW0X30;只检查B4和B5两位,屏蔽其它各位
SUBLW0X30
RETURN
;--------------------------------------------------------------------------
KEYDELAY;键盘去抖子程序(约8ms的软件延时)
MOVLW0X80
MOVWFDEYH
AGAIN2MOVLW0XFF
MOVWFDEYL
AGAIN1DECFSZDEYL,1
GOTOAGAIN1
DECFSZDEYH,1
GOTOAGAIN2
RETURN
;--------------------------------------------------------------------------
KEYSERVEMOVLW0X00
MOVWFJIANR
MOVLW0XFD;键盘服务子程序
MOVWFPORTB
BTFSSPORTB,4
GOTOS10
BTFSSPORTB,5
GOTOS9
MOVLW0XFB
MOVWFPORTB
BTFSSPORTB,4
GOTOS12
BTFSSPORTB,5
GOTOS11
GOTOTUICHU
S10MOVLW0X02
MOVWFJIANR
GOTOTUICHU
S9MOVLW0X01
MOVWFJIANR
GOTOTUICHU
S12MOVLW0X04
MOVWFJIANR
GOTOTUICHU
S11MOVLW0X03
MOVWFJIANR;把键值送给JIANR
TUICHURETURN
;--------------------------------显示缓冲区处理子程序----------------------
XIANHUANMOVLW0XA0
MOVWFFSR
MOVFS3,W
MOVWFINDF
INCFFSR
MOVFS2,W
MOVWFINDF
INCFFSR
MOVFS1,W
MOVWFINDF
INCFFSR
MOVFS0,W
MOVWFINDF
RETURN
;------------------------------------------------------------------------
MAINNOP
CALLMAINSUB;系统初始化
CALLCLKINSUB;调用时钟初始化子程序
;--------------------------------------------------------------------------
DENJIAN
BANKSELS0
CLRFS0
CLRFS1
CLRFS2
CLRFS3
CLRFSREG;复位显示数据即:
CLRFLEDF;使S0=S1=S2=S3=0
CALLXIANHUAN;把S3、S2、S1、S0的值装入显示缓冲区
CALLDISPLAY;显示
DENANBCFINTCON,GIE;关中断
CALLKEYSCAN;进行键扫描
BTFSSSTATUS,Z
GOTOXIAODOU1;如起始键按下,则消抖动
GOTODENAN;如起始键没按下,则继续等待
XIAODOU1CALLKEYDELAY;延时消抖动
CALLKEYSCAN;再次进行键扫描
BTFSCSTATUS,Z
GOTODENAN;若为干扰,则再次等待键按下
CALLKEYSERVE;不为干扰则查键值
MOVFJIANR,W
SUBLW0X01;键S9按下
BTFSSSTATUS,Z
GOTODENAN
BANKSELS0
CLRFS0
CLRFS1
CLRFS2
CLRFS3
CLRFSREG;设置新一次计时的初始条件
WAITSCALLKEYSCAN
BTFSSSTATUS,Z
GOTOWAITS;等键松开后再进行下面的操作
ABCMOVLW0X06
MOVWFTMR0
BSFINTCON,GIE;开总中断
HERECALLXIANHUAN;显示缓冲区处理
CALLDISPLAY;即时更新显示内容
CALLKEYSCAN
BTFSSSTATUS,Z
GOTOXIAODOU;若停止计时键按下,则消抖
GOTOHERE;若停止计时键没按下,则继续等待中断计时
XIAODOUCALLDISPLAY;利用消抖动时间调用显示程序
CALLDISPLAY
CALLDISPLAY
CALLDISPLAY
CALLDISPLAY
CALLDISPLAY
CALLDISPLAY
CALLDISPLAY
CALLDISPLAY
CALLKEYSCAN
BTFSCSTATUS,Z
GOTOHERE;若为干扰,则继续等待停止键按下
CALLKEYSERVE;不为干扰则查键值
MOVFJIANR,W
SUBLW0X03;键S11按下
BTFSSSTATUS,Z
GOTOHERE
BCFINTCON,GIE;若S11键按下,则禁止中断
CALLDISPLAY;若不为干扰,则禁止中断,更新显示内容
WAITRCALLKEYSCAN
BTFSSSTATUS,Z
GOTOWAITR;等键松开后再进行下面的操作
DENDAICALLKEYSCAN
BTFSCSTATUS,Z
GOTODENDAI;循环进行键扫描,等待继续键按下
CALLKEYDELAY
CALLKEYSCAN
BTFSCSTATUS,Z
GOTODENDAI;延时消抖
CALLKEYSERVE;不为干扰则查键值
MOVFJIANR,W
SUBLW0X03;键S11按下继续
BTFS