单片机毕业论文报告40硬件图源程序41.docx
《单片机毕业论文报告40硬件图源程序41.docx》由会员分享,可在线阅读,更多相关《单片机毕业论文报告40硬件图源程序41.docx(23页珍藏版)》请在冰豆网上搜索。
单片机毕业论文报告40硬件图源程序41
中原工学院
《单片机与接口技术》课程设计报告
目录
一、引言······························3
2、设计任务··························3
3、硬件电路图的设计··················5
4、软件的编写·······················10
1)程序流程图······················11
2)实验源程序······················15
五、心得体会·························26六、参考文献························27
七、附录····························28
1、引言
单片微型计算机简称单片机,又称微控制器(MCU),它的出现是计算机发展史上的一个重要的里程碑,它以体积小、功能全、性价比高等诸多优点独具特色,在工业控制、尖端武器、通信设备、信息处理、家用电器等嵌入式应用领域中独占鳌头。
本次课设采用的STC89C51单片机是51系列单片机的一种代表,目前51系列单片机是国内目前应用最广泛的一种单片机之一。
单片机以其系统硬件构架完整、价格低廉、学生能动手等特点,成为工科学生硬件设计的基础课。
本次课程设计主要目的是为了更进一步学会使用和了解单片机,增强学生的动手能力,让我们更透彻的将平时所做的实验吃透学懂。
2、设计任务
一、所需设备:
伟福系列单片机仿真实验箱、PC机及实验指导书
二、设计内容
题目1:
数据采集系统
从键盘中任意选出6个键作为系统的功能键和LED数码显示一起组成一个单片机键盘显示系统(小的监控程序),并通过实验箱上的接口芯片实现相应的功能(注:
这些硬件电路全在实验箱上,但自己要能设计)。
要求设计相应的硬件电路,并画出实现题目要求功能的流程图,编写、调试相应的程序。
编程要求:
开机后显示班级号(4位),学号(2位)(复位状态),然后通过功能键设置参数,而后运行主程序。
6个功能键为:
设定
加一
减一
确定
运行
换位
设置参数步骤:
复位状态下,按下“设定”键后6位显示的状态为:
显示设定值 显示参数行号
8
8
8
8
0
1
四位设定值中的某一位小数点亮(或者整个值闪烁),表示对该位进行设置。
用“加一”、“减一”键改变该位的值,
用“换位”键改变设置位(由左到右),
用“确定”键保存设定的值。
本次设计要求能设置四行参数即可,每行参数在0-9999之间,当连续按“确定”键时,对应的行号(上图)从01-04循环变化。
按下“运行”键,执行数据采集程序(参考实验箱相应的硬件电路,但要求不同),采集模拟量0-5V,显示对应的物理量在0000-最大值之间变化。
5V对应的显示值(最大值)是多少可以在设定时通过某行(四行参数中的一行)参数设置的数值选择确定。
三、硬件电路图的设计
实验中主要用STC89C51单片机做处理器,首先的确保一个单片机最小系统,所以首先绘制的是单片机最小系统的电路图,下图是上次做小车时绘制的最小系统电路图:
要用到键盘和六个数码管显示,故需对其接口进行扩展,所用的器件有74HC138与P2口的高四位相连接,进行译码,译码之后和锁存器
74LS373所存P0口的位数相与,对数码管的段码和位码进行片选选定,同时也可对键盘的读取接口和数据采集芯片进行片选选通,从而给定一个确定的地址,这样单片机就可以与外接电路进行数据的采集,键盘的判定,及数字的显示等工作。
下图为74HC138的连接电路
其中P2.7接138的E3脚,E1和E2都接在低电平上,P2.6/P2.5/P2.4分别和138的C/B/A引脚连接,这样地址片选就可以达到从8000H到FFFF的地址。
下图为单片机P0口接74LS373锁存器
数码管段码接口和位码接口都用的是74LS374芯片,片选信号由138译码器和74LS373锁存器所给地址决定,键盘的读取用芯片74LS245芯片来扩展,本电路主要是参考平时所作实验,及实验的电路连接来设计的。
下图为段码接口,位码接口及键盘读入口的接线电路:
键盘及数码管显示电路设计好之后,接下来要设计的就是数据采集系统的电路,由于我选的题目是任务一里的第一个任务,所以数据采集系统使用的的是AD转换,将5V的电压通过电位器的调节,也就是模拟量通过AD0809芯片转换成数字量,在单片机上显示出来。
下图即为AD0809与单片机的接口电路:
AD0809其中D0—D7与P0口相接,由P0口的数据选择哪一路的输入,EOC与单片机P3.2口相连接,转换完后产生中断延时让其显示,片选线由138的Y1输出口和单片机的读口即P3.7经过一个或非门相连。
这样0809的地址即为9000H,由P0口给定的值决定是IN口口的输入,试验箱上只有两个输入口,我在编程时选定IN0口输入,IN0口接一个连了五伏电压的电位器。
4、软件的编写
软件所要实现的功能:
1、开机后显示班级、学号10-212;
2、用的是实验箱键盘最后一排的六个键,依次为:
“设定”“加一""减一""换位””确定“”运行“;
3、按“设定”键,默认第一位闪烁,此时按“加一”和“减一”键可以调整数值;
4、设定完一位后,按“换位”键可以对下一位进行设定;
5、四位都设定完之后,按“确定”键,去闪烁,并将参数01下设定的值保存;
6、再按下“确定”键,跳至参数02,此时可以依照步骤3对其进行设置;
7、参数01、02、03、04设定好之后,可以按“确定”键对设定的值查询;
8、在不同的参数下,按下“运行”键可以将以该设定值最大值,0为最小值的AD转换结果显示到前四位数码管上。
明确软件所要达到的目的之后,首先得先清楚试验中数码管和键盘的读入地址和数码管的位码地址,为编程序确定键值及参数会起到一个直接的作用,只有清楚这些了才能随心所欲的设定没一个功能键的位置。
(1)程序流程图
流程图是一个程序的主干,也就是说程序是建立在一个流程图的主体框架之上的,有流程图程序才可以有条理的进行编写.
下面为实验程序的流程图
N
Y
N
(2)实验源程序
WEIEQU08002H;位
DUANEQU08004H;段
INEQU08001H;键盘读入口
CS0809EQU09000H
LEDBUFEQU30H;显示缓冲区
CANSHUEQU51H;参数1234
ORG0000H
LJMPSTART
ORG0020H
START:
MOV25H,#00H
MOVLEDBUF,#01H;班级、学号的序码
MOVLEDBUF+1,#00H
MOVLEDBUF+2,#012H
MOVLEDBUF+3,#02H
MOVLEDBUF+4,#01H
MOVLEDBUF+5,#02H
MOV36H,#00H
MOV40H,#00H;参数1缓冲区
MOV41H,#00H
MOV42H,#00H
MOV43H,#00H
MOV44H,#00H;参数2缓冲区
MOV45H,#00H
MOV46H,#00H
MOV47H,#00H
MOV48H,#00H;参数3下缓冲区
MOV49H,#00H
MOV4AH,#00H
MOV4BH,#00H
MOV4CH,#00H;参数4下缓冲区
MOV4DH,#00H
MOV4EH,#00H
MOV4FH,#00H
MOV50H,#00H
MOVCANSHU,#01H;参数
L2:
MOVR0,#LEDBUF;显示班级、学号
LCALLDISPLAYLED1;显示子程序,R0为参数
LCALLTESTKEY;判断“有效键”是否按下?
JNB20H.0,L2;没有键按下,则继续显示班级、学号
L3:
MOV25H,#00H
MOVA,CANSHU
MOVB,#04H
MULAB
ADDA,#3CH;将参数首地址存入R0
MOVR0,A;第一次有键按下默认显示参数1下设定的值,即:
显示从40H单元开始的内容
LCALLDISPLAYLED2;调用设定参数显示子程序
LCALLTESTKEY;检测是否有键按下
JNB20H.0,L3;没有键按下,则继续显示参数1下设定的值
LCALLPAZ;有键按下,则判断运行键是否按下
CJNER5,#05H,QD1
LJMPSD;R5=5
QD1:
LJMPS44
SD:
SETB20H.1
MOV36H,#00H
MOVA,CANSHU
MOVB,#04H
MULAB
ADDA,#3CH;通过参数来选择设定值的缓冲区
ADDA,36H
MOVR0,A
H1:
MOVA,CANSHU
MOVB,#04H
MULAB
ADDA,#3CH
ADDA,36H
MOVR0,A;R0指向闪烁寄存字节处
JB20H.1,S1
MOV@R0,#10H
SETB20H.1
LJMPDS1
S1:
MOV@R0,90H;将闪烁字节的值显示出来
CLR20H.1
DS1:
MOVA,CANSHU
MOVB,#04H
MULAB
ADDA,#3CH
MOVR0,A;R0指向显示首区
LCALLDISPLAYLED2
LCALLTESTKEY
JNB20H.0,H1
LCALLPAZ
CJNER5,#02H,S11;换位
MOVA,CANSHU
MOVB,#04H
MULAB
ADDA,#3CH
ADDA,36H
MOVR0,A
MOV@R0,90H
INC36H
HW1:
MOVA,CANSHU
MOVB,#04H
MULAB
ADDA,#3CH
ADDA,36H
MOVR0,A
MOVA,36H
CJNEA,#04H,H1
MOV36H,#00H
LJMPHW1
S11:
CJNER5,#04H,S22;加1
INC70H;闪烁值加1
MOVA,90H
CJNEA,#0AH,H1
MOV90H,#00H
LJMPH1
S22:
CJNER5,#03H,S33;减1
DEC70H;闪烁值减1
MOVA,70H
CJNEA,#0FFH,H2
MOV90H,#09H
H2:
LJMPH1
S33:
CJNER5,#01H,H2;确定1(去掉闪烁,并将该参数下的设定值保存到对应的缓冲区)
MOVA,CANSHU
MOVB,#04H
MULAB
ADDA,#3CH
ADDA,36H
MOVR0,A
MOV@R0,90H
LJMPL3
S44:
CJNER5,#01H,W1;确定2(将参数加1,并将该参数下的设定值显示到数码管上)
INCCANSHU;参数加1,指向下一个参数
MOVA,CANSHU
CJNEA,#05H,L22
MOVCANSHU,#01H
LJMPL3
W1:
CJNER5,#00H,L22
YX:
LCALLAD;采集(调用AD转换子程序,获得AD值)
LCALLTESTKEY
JB20H.0,L22
LJMPYX;运行
L22:
LJMPL3
;判断"有效按键"子程序
TESTKEY:
MOVDPTR,#WEI
MOVA,#00H
MOVX@DPTR,A;6条列线全置0
MOVDPTR,#IN
位为:
0)
ANLA,#01H;若是最后一排有键按下,则ANL之后A=0,否则A=1
CJNEA,#01,B1;判断按下的是否是最后一排的键(有效按键)?
CLR20H.0;A=1,则最后一排没有键按下,将20H.0清0
LJMPFH
B1:
SETB20H.0;A=0,则最后一排有键按下,将20H.0置1
FH:
RET
;判断键位,通过R5返回,运行--00H,确定-01H,换位--02H,减1--03H,加1--04H,设定--05H
PAZ:
MOVR4,#0FEH;11111110B
MOVR5,#0FFH;11111111B
NEXT:
MOVDPTR,#WEI
MOVA,R4
MOVX@DPTR,A;只将第6列置0
MOVDPTR,#IN
;读入键状态
ANLA,#01H;若“运行”键按下,则ANL之后A=0;
CJNEA,#01H,QDZ;判断“运行”键是否按下?
(依次判断最后一排的键)
MOVA,R4
RLA;否,则左移一位
MOVR4,A
INCR5;执行后,R5=00H
LJMPNEXT
QDZ:
INCR5;按下“运行”键,则跳至此处,执行后,R5=00H
MOVLEDBUF,R5;若前面没有按“运行”键,则R5=01H;有,则R5=00H
LOOP:
LCALLTESTKEY
JB20H.0,LOOP;有键按,则循环检测按键
RET
;显示1子程序(班级、学号)
DISPLAYLED1:
MOVR2,#20H;选通第1位数码管
MOVR3,#06H;6位数码管显示,控制循环6次
L1:
MOVDPTR,#WEI
MOVA,R2
MOVX@DPTR,A
RRA;右移一位,选通下一位数码管
MOVR2,A
MOVDPTR,#LEDTAB
MOVDPTR,#DUAN
MOVX@DPTR,A;输出段码
LCALLDELAY;调用延时
INCR0;指向下一个要显示的段码
DJNZR3,L1
RET
;显示2子程序(设定值和参数)
DISPLAYLED2:
MOVR2,#20H;选通第1位数码管
SETB21H.0;将21H.0置1
MOVR3,#06H;6位数码管显示,控制循环6次
L12:
MOVDPTR,#WEI
MOVA,R2
MOVX@DPTR,A
RRA;右移一位,选通下一位数码管
MOVR2,A
CJNEA,#02H,L44;没选通第五位数码管(00000010B),则跳转,正常显示
CLR21H.0;选通了第五位数码管,则将21H.0清0
MOVDPTR,#LEDTAB
MOVDPTR,#DUAN
MOVX@DPTR,A;输出段码
LCALLDELAY;调用延时
JB21H.0,H11;21H.0等于1,即没选通第五位数码管,则跳转
MOVR0,#4FH;选通了第五位数码管,则给R0初始地址4FH
SETB21H.0
H11:
INCR0;(50H)=00H,第五位数码管显示“0”;(51H)=01H,第六位数码管显示“1”
DJNZR3,L12;直到六位数码管都显示一遍,返回
RET
;AD转换子程序
AD:
LCALLPXS;调系数
MOVDPTR,#CS0809;采集
MOVA,#00H
MOVX@DPTR,A
JNBP3.2,$:
利用ADC0809的EOC信号触发中断INT0(P3.2口)
LCALLZHUANHUAN
MOVR0,#60H
LCALLDISPLAYLED2
MOVP1,#80H
RET
;判系数子程序
PXS:
MOVA,CANSHU
MOVB,#04H
MULAB
ADDA,#3CH
MOVR0,A
MOVR1,A
SWAPA
INCR0
MOV53H,A
INCR0
SWAPA
INCR0
MOV54H,A
MOVA,53H
ANLA,#0F0H
CJNEA,#00,DYYQ
MOV25H,#01H
INCR1
SWAPA
INCR1
MOV53H,A
INCR1
SWAPA
ADDA,#00
MOV54H,A
DYYQ:
MOV57H,#02H
MOV58H,#55H
MOV55H,#00H
MOV56H,#00H
MOV22H,#00H
MOVR0,#0FFH
LOOP5:
INCR0
CLRC
MOVA,56H
ADDA,58H
DAA
MOV56H,A
MOVA,55H
ADDCA,57H
DAA
MOV55H,A
CLRC
MOVA,56H
SUBBA,54H
MOV22H.0,C
MOVA,55H
SUBBA,53H
MOV22H.1,C
MOVR2,22H
CJNER2,#00,NEXT5
MOVA,56H
CJNEA,54H,NEXT5
INCR0
NEXT5:
MOVC,22H.1
JCLOOP5
MOV22H,#00H
CLRC
MOVB,R0
RET
;转换子程序
ZHUANHUAN:
MULAB
MOV6AH,B
MOV6BH,A
MOV6CH,#03H
MOV6DH,#0E8H
MOVR0,#0FFH
LOOP1:
INCR0;判定千位
MOVA,6BH
MOV2BH,6BH
SUBBA,6DH
MOV6BH,A
MOVA,6AH
MOV2AH,6AH
SUBBA,6CH
MOV6AH,A
NEXT1:
JNCLOOP1
MOV60H,R0
MOV6AH,2AH
MOV6BH,2BH
MOV22H,#00H;判定百位
CLRC
MOV6CH,#00H
MOV6DH,#64H
MOVR0,#0FFH
LOOP2:
INCR0
MOVA,6AH
CJNEA,#00H,BW1
MOVA,6BH
MOV2BH,6BH
SUBBA,6DH
MOV6BH,A
LJMPNEXT2
BW1:
MOVA,6BH
SUBBA,6DH
MOV6BH,A
MOVA,6AH
SUBBA,6CH
MOV6AH,A
LJMPLOOP2
NEXT2:
JNCLOOP2
MOV61H,R0
MOV6BH,2BH
MOV22H,#00H;判定十位
CLRC
MOV6DH,#0AH
MOVR0,#0FFH
LOOP3:
INCR0
MOVA,6BH
MOV2BH,6BH
SUBBA,6DH
MOV6BH,A
NEXT3:
JNCLOOP3
MOV62H,R0
MOV63H,2BH
MOVA,25H
CJNEA,#01H,TZ1
MOV63H,62H
MOV62H,61H
MOV61H,60H
MOV60H,#00H
TZ1:
RET
;延时子程序
DELAY:
MOVR6,#06
D1:
MOVR7,#210
DJNZR7,$
DJNZR6,D1
RET;显示字形
LEDTAB:
DB3FH,06H,5BH,4FH,66H;01234
DB6DH,7DH,07H,7FH,67H;56789
DB77H,7CH,39H,5EH,79H;ABCDE
DB71H,00H,76H,40H;F灭H-
END
五、心得体会
对于这次课设,总体感觉还可以,比上学期参加培训时学习单片机的效果好多了,上学期就在张老师的带领下在周末进行电子设计大赛培训,总结一下上学期的收获就是认识了结了单片机。
这学期通过五月份的一次只能小车的设计,对单片机的熟练程度明显加强了,那一次的比赛可以说是我将书本知识运用于实践的第一次。
这学期相当于再次把单片机的课本又跟着老师学了一遍,现在对于单片机虽然还有些地方有些迷惑,但总体上来说51单片机的了解还是相对透彻的,通过这么长时间的单片机学习,我感觉到只有不断的去实验,不断地去验证,才可以将理论转化为实践,因为有些时候分析的想的会和实际发生的效果完全不同,只有不断的去试验去实践,才可以真正掌握一门技术。
这次课程设计虽然实间有两个星期,但是实验室相对紧张,我们上学期自己使用的板子有些功能还没有添加,相对来说硬件还是有点欠缺,所以时间还是很紧张的,因为一周只有在实验室能呆上一天多点,这样就对我们还是构成了挑战。
我选的是实验一的第一个题目,虽然有些子程序是平时做实验所做过的,但是整体来说程序还是比较复杂,用的汇编语言编程最大的一点弊端就是程序太长,调试起来比较吃力,有时一个小小的问题就得调试一两个小时,我最长的一次是AD转换成255后欲将其转换成所设置的最大数的问题,对于这个参数拿个笔计算起来几分钟的时间,但是要在试验箱上显示出来没有误差还真是不容易,就一个参数的取值问题我就在程序调试上花了近五个小时,最后的结果是把误差缩减到最小是15左右,最终实验结果是完成出来了,但是还是感觉不太理想。
我觉得单片机就是一个不断的试验和不断的实践的课程,只有自己不断地去练习才可以掌握其真谛。
通过过这次实训,我对单片机的有了更近一步的了解并且熟悉了单片机各个管脚的功能。
我深刻地认识到实践操作的重要性,同时理论知识必须与实践操作紧密相结合,两者缺一不可,这也是教学环节中的一个重要环节,只有坚持理论与实践相结合,才能更好的提高自己的动手操作能力,并且可以从中培养自己独立思考问题以及解决问题的能力。
这次实训实现了软件与硬件的有效结合,将书本知识运用到实践中,让我受益匪浅。
六、参考文献
《单片机原理、接口技术及应用(含C51)》(西安电子科技大学出版社主编杨学昭王东云)
《电路》(高等教育出版社第五版邱关源)
《电子技术基础》上下册(高等教育出版社康华光)
《新概念51单片机C语言教程》(电子工业出版社郭天祥)
七、附录
总体硬件电路图: