基于PIC16F877A的课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第一模块:课程原理设计方面的内容
●课程设计的目的:我是觉得焊板,是件挺有意思的事丰富同学自己动手做板,
设计电路的经验,加强同学的动手能力,强化自我分析问题,解决问题的能力,培养一种全局观,一种良好的思维方式。

同时也可以让同学学到做到事都要细心。

●课程设计的原理:这个课程设计没有什么原理,原理就是先用头脑,构想出
自己所要设计的东西,然后用Protel 99SE 画出电路原理图(电路设计原理图会在后面的清单中给出),再按照自己设计的电路图,利用万能的双手,将所需要用到的元件一个一个的焊接到万用板上,然后一个一个的把应该接的器件接起来,最后融合自己在这学期,PIC课程上所学得的编程语言,按照硬件所要实现的功能,编写源程序,最后就祈祷能一下子成功吧。

(原理好像挺简单的)
●设计内容:本设计为一个多功能时钟的设计,芯片基于8位机PIC单片机,
显示模块用LCD液晶显示器1602.
●硬件组成:PIC单片机一片,一个LCD液晶显示器1602,一个7805稳压管,
一个4M外接晶振,一个9V电池,电阻、电容若干,按键、导线若干。

(具体的材料清单后面在附录中会给出)
●设计要求(自己按自己的要求设计)
1.要求能在LCD1602上显示一个电子时钟
2.可以通过一个按键来控制正常计时还进入修改时间模块
3.再由一个按键控制选位,可以精确到每一位的选定,
4.由另一个按键控制时钟的准确调整(可能扩充时钟功能和其它显示模式
功能)
第二块:焊接实物方面遇到的问题及注意事项
1.焊接前一定得先将实物按照电路图合理的摆放在通用板上。

这个很关键,
好的实物布局可以在很大程度上降低焊接时的难度。

LCD1602有16个管
脚,其中有8个为数据和指令的输入、读出端口,3个为控制读/写数据
/指令的端口,其余的背光接口,或是接VCC,或是直接接地。

我在画电
路图的时候,将8个数据总线安排到PORTD端口,将3个控制端口安排
在PORTA端口,而因为PIC单片机芯片上的管脚排列方式,PORTD的端
口是分布在两边,只有PORTB的8个管脚在同一列上,当时安排端口的
时候,如果将PORTB端口做为数据总线,PORTC安排作为控制总线,那
样会大大降低布线、焊接的难度。

在焊板时,焊错了三次. 不过总算也
把板给焊好了,只是难看点。

2.单片机的电源由9V电池,通过7805稳压管,稳压后得到5V直接电源。

在焊接稳压管,由于稳压管比较脆弱(根据我自己焊接时出现的状况,
下的结论),所以在用电烙铁焊接触碰稳压管管脚时,不能过久接触,防
止稳压管让烧坏。

这个对于其它一些脆弱的器件都一样,像数码管、一
个译码器或选择器(如果没有用插槽的话,当然一般都会用),都需要特
别注意这种。

我自己焊坏过一次后,是通过逐个焊管脚来解决,就是像
稳压管的三个管脚,我是先焊接完一个后,就去焊其它的器件,等到稳
压管不热后,再来继续焊接它。

不知道这个不是个好办法,但我觉得好
用,至少我没有再焊坏过元器件了。

3.PIC单片机的焊接,一般是用插槽,但是通用板上没有列标号,插槽也
没有标号,密密麻麻的几十个管脚,很容易在焊接的时候出现错误,还有一点就是,我们在看PIC的管脚图是,是从正面的俯视图,但是焊接线的时候是从背面焊的,这样更加容易将对应的管脚接错,这个我也同有想到更好的办法,班级里面有的同学是买那种每一列都有标号的,这样比较好找管脚,我自己是将管脚对应的端口直接用笔注释在焊接面。

这样,只要是注释的时候没有出错的话,焊接错的机率无限为0.我自己焊了四块板,就只有焊第一块板的时候接错过一次。

4.开关的焊接也是个问题,这个曾经是我的一个问题,也是很多同学焊接
时出现的问题。

但是它在实际动手去焊接一个板前,几乎所以有都不会当它是个问题的问题。

在书上板板的学到的开关样子都是两个脚,分别接到想选择开通/判断的两个器件中间。

但在焊接的时候才发现,其实它至少都是有4个引脚,还有6个引脚的(自锁开关就是6个引脚)。

所以刚刚开始很多之前没有做过实物的同学都懵了,包括我自己。

这个问题用万用表很容易解决,但是不懂硬件,或者说没有接触硬件的同学,都不会去想到,这并不是同学们不会用万用表去测试,关键是想不到要用万用表去测试。

这就是有实际自己动手制作电路板和没有动过手的同学很明显的差别。

话说回来,这也是大家都动手亲自制作的初衷,这是一种学习,也是一种结合,学习的是书上学不到的具体器件的真实“长相”,结合的是把我们书上学到的知识和制作硬件这个过程结合起来,有动手能力的同时,也要有理论的知识做基础。

5.电阻阻值的选择,这个主要注意几个就行了。

第一个复位电路和键盘检
测端的上拉电阻,都得用10K的电阻。

数码管和LED灯等,串的电阻为470。

如果是多个LED灯和数码管,每个都需要接电阻的话,可以直接只用一个电阻,从地端接上来,再分别接到各个管,这样能使电路简单,焊接容易,又不影响电路和功能。

当然这样可能会造成管的烧坏。

但是这也是对书上板板的东西在实际运用中的灵活变通。

因为有时需要驱动的器件太多会造成驱动能力不够,用这个办法可以减少芯片的驱动负担。

6.导线的搭接,这是个很容易忽视的问题,在检查的时候,也很难检查到。

导线热的传导性很强。

在焊接导线时,因为它的外包层是塑料的,如果一条导线连续接触电烙铁太久的话,容易因为导线里面的铜钱过热,而把外面的塑料烧软或是烧穿掉,因为电路导线的焊接,需要跳来跳去,几条导线经常都会搭在一起,如果像上述说的情况出现的话,容易在两条导线的接触面,形成短路。

而短路的地方一定是在里面的,光用眼睛看是看不出问题来的,所以这就大大增加了排查错误的难度。

由此,在我们需要几条线又叠一起时,一定要等导线热散了,才能把导线压一起,这样就比较不容易出现因为过热而短路的情况。

对在硬件制作方面的心得:以上这些,都是焊接硬件时容易出现的错误,这也是根据我自己间接过程真正出现的问题总结出来的。

不管它们是不是问题,但都是我自己出现过的问题。

倒过去看下这些问题,仔细想了想,这些问题中,真正大的问题基本上都没有,但小问题并不是不是问题,在焊接电路时,往往是这些看上去不起眼的小问题而导致的失败。

我见过很多同学,在焊接电路完后,PIC单片机安上去后没有实现自己起初设想的,
检查了查不出是因为什么就重新接线,但其实没有几个在另外接的时候,能保证接出来的就对了,这就是,这种一遇到问题就另外重新焊接电路,而不是努力去寻找问题所在,这是一种相当于治标不治本了,或许在重新焊接的时候,不会再出现像上块板那种错误,但是像这种容易出现的小错误多了去了,如果不先正视它们,有一种坚持的精神,这样,不只不能做出完好的板,而且也不能从学一种处事的态度。

“简单的事并不代表容易”,这是自己一步步将这个课程设计做下来最深的体会,虽然是一个很简单的电路焊接,但是这是一个很考验耐心,细心,专心的一种事,说为苦差事也不为过。

但是,在自己付出几个星期把硬件,软件结合在一起,做出自己心目中的作品时,再苦也是甜的,这也是另一种证明自己的方式。

在软件编写过程遇到的问题
作品是由硬件和软件结合起来的,硬件制作需要的是“软功夫”,因为它需要的是细心的对着电路去焊接,而焊接的排布也是事先在Protel就已经布置好的了,并不需要太伤脑筋。

但软件的编写需要的就是“硬功夫”了,因为程序的编写,是建立在一定的理论基础上,不论做再简单的电路,写再简单的程序,如果没有对PIC单片机的工作原理,对其指令系统能熟练编写,那么,就是一个简单的流水灯也是一个大的坎。

特别是本学期所学的是汇编语言,这是种低级语言,是一种和硬件连接很紧密的语言,所以,在编写程序时,对PIC单片机内部各特殊寄存器的使用方面和原理的理解特别重要。

也因为其没有语句,所以逻辑会显得特别的杂乱,跳来跳去是别人最直接的感受,汇编程序,不说别人看的不懂,就是编写自己本人写的,在没有注释的情况下,隔了些日子,估计也不好看懂,我写的时钟程序,当时是早在课程设计之前一个星期左右写的,当时还有其它的考试和课程设计,所以时钟程序让我凉在一边,后面等自己硬件做好了,回头要烧写软件测试硬件的时候,发现自己的软件看不懂。

因为原本的程序很简单,在这个课程设计中,在原来的基础上想要扩展,就必需要把原来的程序看懂了才能着手,后来硬是花了一天半的时间才把原来的程序完全看懂了。

这就是汇编一个大的缺点,至少在我看来是这样。

因为在扩展软件功能的时候,功能是一步一步加就去的,从原来只在LCD1602上显示四个位,到后面变成有小时们,分位和秒位,到后面显示其它的修饰字符,再到后面的可以调时间,可以在调时间时不影响时钟的继续走,这样一步一步下为,这没有什么很系统的办法,遇到的问题也很多,而且逻辑方面的问题也不好说明,所以这里很不好具体说明。

总之,在程序的编写方面,遇到的最大的问题是子程序的调用太多,导致堆栈数据的丢失,而出现程序的跑飞,这是我编写程序上遇到的最大问题,也是现在限制我继续扩展功能的最大阻碍。

在整个课程设计做下来的过程中,学到的不是知识,而是一种面对问题,处理问题,解决问题的态度。

这种感受真是很难从语言上表达。

但却是确实学到的东西!!!
LCD1602液晶显示器的各种参数图片。

图1. 1602接口电路
图2. 1602写操作时序
图三.1602液晶时序参数其中程序中涉及到的指令:
1.01H:清屏幕,清数据指针
2.38H:显示模式的设置,16*2,5*7点阵
3.地址码:80H+(00h-27h),0COH(00h-27h)
4.18h和19H,分别为屏幕的左移和右移
5.0EH:开背光显示,不显示光标
6.06H:当写一个字符后,地址指针自动加1
基于PIC16F877A的1602液晶电子可调时钟设计程序
LIST P=16F877A
INCLUDE"P16F877A.INC"
__CONFIG 3B32H
#DEFINE RS PORTA,5
#DEFINE RW PORTA,4
#DEFINE E PORTA,3
TMP1 EQU 20H
COUNT EQU 21H
COUNT1 E QU 22H
COUNT2 E QU 23H
COUNT3 E QU 24H
COUNT4 E QU 25H
COUNT5 E QU 26H
YI EQU 27H
ER EQU 28H
SAN EQU 29H
SI EQU 2AH
WU EQU 2BH
LUI EQU 2CH
TMP_YI EQU 2DH
TMP_ER EQU 2EH
TMP_SAN EQU 2FH
TMP_SI EQU 30H
TMP_WU EQU 31H
TMP_LUI EQU 32H
AN8 EQU 33H
WEI EQU 34H
WYIEQU 0CCH
WER EQU 0CBH
WSAN EQU 0C9H
WSI EQU 0C8H
WWU EQU 0C6H
WLUI EQU 0C5H
;**********************
ORG 0000H
NOP ;放置一条ICD必需的空操作指令
GOTO MAIN
;************************** 主程序************************
MAIN BSF 03H,5 ;转体1
MOVLW 07H
MOVWF ADCON1 ;设置RA口全部为普通数字IO口MOVLW 00H
MOVWF TRISA ;定义A口为输出
MOVWF TRISD ;定义D口为输出
MOVLW 0FFH
MOVWF TRISB
MOVLW 07H
MOVWF OPTION_REG
BCF 03H,5 ;回体0
CLRF INTCON
MOVLW 02H
MOVWF PORTA
CLRF PORTB
CLRF ER
CLRF YI
CLRF SAN
CLRF SI
CLRF WU
CLRF LUI
MOVLW 0AH
MOVWF COUNT1
MOVWF COUNT3
MOVWF COUNT5
MOVLW 06H
MOVWF COUNT2
MOVWF COUNT4
MOVLW '0'
MOVWF TMP_YI
MOVWF TMP_ER
MOVWF TMP_SAN
MOVWF TMP_SI
MOVWF TMP_WU
MOVWF TMP_LUI
CALL C1602
MOVLW 80H
CALL ML
CALL WRITE1
MOVLW 0C0H
CALL ML
CALL WRITE2
NOP
XX BCF INTCON,T0IF
MOVLW 0FH
MOVWF TMR0
XX1 B TFSS INTCON,T0IF
GOTO FF2
CALL PLUS
GOTO XX
FF2 BTFSC PORTB,0
GOTO XX1
CALL B0_JPSM
CALL CHANGE1
GOTO XX
GOTO $
PLUS NOP
A1 INCF YI
MOVF YI,W
XORLW 0AH
BTFSS 03H,2
GOTO A1_1 ;还没有到10直接执行下一步
BCF 03H,2 ;到10了,先清除全零标志位
CLRF YI
A1_1 MOVF YI,W
CALL BIAO
MOVWF TMP_YI
CALL SHOW
DECFSZ COUNT1 ;用来控制个位给十位进位
RETURN ;还没有要进位
MOVLW 0AH
MOVWF COUNT1
GOTO A2 ;个位要给十位进位了
A2 INCF ER
MOVF ER,W
XORLW 06H
BTFSS 03H,2
GOTO A2_2 ;还没有到10直接执行下一步
BCF 03H,2 ;到10了,先清除全零标志位
CLRF ER
A2_2 MOVF ER,W
CALL BIAO
MOVWF TMP_ER
CALL SHOW
DECFSZ COUNT2 ;用来控制个位给十位进位
RETURN ;还没有要进位
MOVLW 06H
MOVWF COUNT2
GOTO A3 ;个位要给十位进位了
A3 INCF SAN
MOVF SAN,W
XORLW 0AH
BTFSS 03H,2
GOTO A3_3 ;还没有到10直接执行下一步
BCF 03H,2 ;到10了,先清除全零标志位
CLRF SAN
A3_3 MOVF SAN,W
CALL BIAO
MOVWF TMP_SAN
CALL SHOW
DECFSZ COUNT3 ;用来控制个位给十位进位
RETURN ;还没有要进位
MOVLW 0AH
MOVWF COUNT3
GOTO A4 ;个位要给十位进位了
A4 INCF SI
MOVF SI,W
XORLW 06H
BTFSS 03H,2
GOTO A4_4 ;还没有到10直接执行下一步
BCF 03H,2 ;到10了,先清除全零标志位
CLRF SI
A4_4 MOVF SI,W
CALL BIAO
MOVWF TMP_SI
CALL SHOW
DECFSZ COUNT4 ;用来控制个位给十位进位
RETURN ;还没有要进位
MOVLW 06H
MOVWF COUNT4
GOTO A5 ;个位要给十位进位了
A5 INCF WU
MOVF WU,W
XORLW 0AH
BTFSS 03H,2
GOTO A5_5 ;还没有到10直接执行下一步
BCF 03H,2 ;到10了,先清除全零标志位
CLRF WU
A5_5 MOVF WU,W
CALL BIAO
MOVWF TMP_WU
CALL SHOW
DECFSZ COUNT5 ;用来控制个位给十位进位
RETURN ;还没有要进位
MOVLW 0AH
MOVWF COUNT5
GOTO A6 ;个位要给十位进位了
A6 INCF LUI
MOVF LUI,W
XORLW 06H
BTFSS 03H,2
GOTO A6_6 ;还没有到10直接执行下一步
BCF 03H,2 ;到10了,先清除全零标志位
CLRF LUI
A6_6 MOVF LUI,W
CALL BIAO
MOVWF TMP_LUI
CALL SHOW
RETURN
SHOW MOVLW 0CH
CALL ML
MOVLW WYI
CALL ML
MOVF TMP_YI,W
CALL SJ
MOVLW WER
CALL ML
MOVF TMP_ER,W
CALL SJ
MOVLW WSAN
CALL ML
MOVF TMP_SAN,W
CALL SJ
MOVLW WSI
CALL ML
MOVF TMP_SI,W
CALL SJ
MOVLW WWU
CALL ML
MOVF TMP_WU,W
CALL SJ
MOVLW WLUI
CALL ML
MOVF TMP_LUI,W
CALL SJ
RETURN
BIAO ADDWF PCL,F
RETLW '0'
RETLW '1'
RETLW '2'
RETLW '3'
RETLW '4'
RETLW '5'
RETLW '6'
RETLW '7'
RETLW '8'
RETLW '9'
;****************** 送第一行数字程序***************
WRITE1 CLRF COUNT ;清0查表偏移地址
WRITE_A MOVF COUNT,W
CALL BIAO_1 ;查表,显示A LAZY YOUTH
MOVWF TMP1 ;送暂存器
INCF COUNT,1 ;偏移地址加1
MOVF TMP1,W
XORLW 00H ;判断是否显示完所有数据(约定表格做后一个00H做为结束标志)
BTFSC STATUS,Z
GOTO ET ;全部显示完成
MOVF TMP1,W
CALL SJ ;没有显示完,把当前查表所得数据送LCD显示GOTO WRITE_A ;调用显示程序
ET NOP
RETURN ;子程序返回
;*******************送第二行数子程序**************
WRITE2 CLRF COUNT ;清0查表偏移地址
WRITE2_A MOVF COUNT,W
CALL BIAO_2 ;查表,显示A LOUSY AGE
MOVWF TMP1
INCF COUNT,1 ;偏移地址加1
MOVF TMP1,W
XORLW 00H ;判断是否显示完所有数据
BTFSC STATUS,Z
GOTO ET1 ;
MOVF TMP1,W
CALL SJ ;调用显示程序
GOTO WRITE2_A
ET1 NOP
RETURN ;是,程序返回
BIAO_1
ADDWF PCL,F
RETLW 'M'
RETLW 'y'
RETLW ' '
RETLW 'f'
RETLW 'i'
RETLW 'r'
RETLW 's'
RETLW 't'
RETLW ' '
RETLW 'd'
RETLW 'e'
RETLW 's'
RETLW 'i'
RETLW 'g'
RETLW 'n'
RETLW 00H
BIAO_2 ADDWF PCL,F
RETLW 'T'
RETLW 'i'
RETLW 'm'
RETLW 'e'
RETLW ':'
RETLW '0'
RETLW '0'
RETLW ':'
RETLW '0'
RETLW '0'
RETLW ':'
RETLW '0'
RETLW '0'
RETLW 00H
;*********************1602初使化******************
C1602 ;调用延时,刚上电LCD复位不一定有PIC快(196MS)
MOVLW 01H ;清屏命令,数据指针清零,所有显示清零CALL ML ;调用写命令程序
MOVLW 38H ;显示开、光标显示、光标不显示
CALL ML ;当读或写一个字符后,地址指针加一,且光标加一
MOVLW 0EH ;当写一个字符后,整屏显示不移动
CALL ML ;设置数据地址指针
MOVLW 06H ;8位2行5x7点阵
CALL ML
MOVLW 01H
CALL ML
MOVLW 0CH
CALL ML
RETURN
CHANGE1 MOVLW 0EH
CALL ML
CHANGE11 CLRF AN8
MOVLW WLUI
MOVWF WEI
CHANGE BTFSC PORTB,1
GOTO B2
CALL B1_JPSM
INCF AN8
MOVF AN8,W
XORLW 09H
BTFSC 03H,2
GOTO CHANGE11
GOTO CHANGE
B2 BTFSC PORTB,2
GOTO PB0
CALL B2_JPSM B20 MOVF AN8,W
XORLW 01H
BTFSC 03H,2
CALL A6
B21 MOVF AN8,W
XORLW 02H
BTFSC 03H,2
CALL A5
B22 MOVF AN8,W
XORLW 04H
BTFSC 03H,2
CALL A4
B23 MOVF AN8,W
XORLW 05H
BTFSC 03H,2
CALL A3
B24 MOVF AN8,W
XORLW 07H
BTFSC 03H,2
CALL A2
B25 MOVF AN8,W
XORLW 08H
BTFSC 03H,2
CALL A1
GOTO CHANGE
B1_JPSM MOVLW 0FH
CALL ML
SS1 BTFSC PORTB,1
GOTO SS1
CALL DELAY10MS
BTFSC PORTB,1
RETURN
SS2 BTFSS PORTB,1
GOTO SS2
CALL DELAY10MS
BTFSS PORTB,1
GOTO SS2
MOVF WEI,W
CALL ML
INCF WEI
RETURN
B2_JPSM NOP
SS3 BTFSC PORTB,2
GOTO SS3
CALL DELAY10MS
BTFSC PORTB,2
GOTO CHANGE
SS4 BTFSS PORTB,2
GOTO SS4
CALL DELAY10MS
BTFSS PORTB,2
GOTO SS4
RETURN
PB0 BTFSC PORTB,0
GOTO CHANGE
CALL B0_JPSM
RETURN
B0_JPSM BTFSC PORTB,0
GOTO CHANGE
CALL DELAY10MS
BTFSC PORTB,0
GOTO CHANGE
PB0_1 BTFSS PORTB,0
GOTO PB0_1
CALL DELAY10MS
BTFSS PORTB,0
GOTO PB0_1
RETURN
;*******************送数据到LCD子程序*************
SJ MOVWF PORTD
BSF RS
BCF RW
BCF E
CALL DELAY1
BSF E
RETURN
;*******************写命令程序******************** ML MOVWF PORTD
BCF RS ;写入控制命令的子程序
BCF RW
BCF E
CALL DELAY1 ;高脉冲使能
BSF E
RETURN
DELAY1 BCF INTCON,T0IF
MOVLW 0FdH
MOVWF TMR0
LXX BTFSS INTCON,T0IF
GOTO LXX
BCF INTCON,T0IF
RETURN
DELAY10MS BCF INTCON,T0IF
MOVLW 0D3H
MOVWF TMR0
KXX BTFSS INTCON,T0IF
GOTO KXX
RETURN
END。

相关文档
最新文档