广东机电师兄心血《计算机控制技术》课程设计报告A4版.docx
《广东机电师兄心血《计算机控制技术》课程设计报告A4版.docx》由会员分享,可在线阅读,更多相关《广东机电师兄心血《计算机控制技术》课程设计报告A4版.docx(11页珍藏版)》请在冰豆网上搜索。
广东机电师兄心血《计算机控制技术》课程设计报告A4版
广东机电职业技术学院
《计算机控制技术》
课程设计报告
(2014-2015学年第一学期)
专业:
电气自动化
班级:
电气0000班__
姓名:
学号:
指导教师:
老师
1、秒表设计
1、秒表的硬件设计(电路图及说明)
开发环境:
ProteusProV7.5SP3
主芯片:
AT89C51*1(CPU工作时钟晶振12MHz)
六位七段共阴极数码管7SEG-MPX6-CC-BLUE*1
八单线驱动器74LS240*1
反相器74LS04*6
秒表功能按钮:
①复位清零;②启动/暂停;③读取时间;④读取模式
秒表功能使用说明:
⒈清零状态下,按下“启动/暂停”按钮,秒表开始计时,再按一次可暂停,显示屏记录当前秒数,再按一次可继续计时;
⒉清零状态下,按下“读数”按钮切换读数模式,接着按下“启动/暂停”按钮,单片机内部开始计时,再按下“读取”按钮,可在显示屏读取当前的秒数,依次类推,再按可连续读取;
⒊按下“复位清零”按钮恢复初始值、初始模式,等待重新计时。
2、秒表的程序设计
1.ORG0000H
2.LJMPSTART
3.ORG0003H;外部中断0入口
4.LJMPTO_INT0
5.ORG000BH;定时器0中断入口
6.LJMPTO_T0
7.ORG0013H;外部中断1入口
8.LJMPTO_INT1
9.ORG0100H
10.START:
CLRTR0;定时器0启动控制位
11.MAIN:
CLR00H
12.CLR01H
13.CLR02H
14.CLRRS1;初始化,选择第0组工作寄存器
15.CLRRS0
16.MOVSP,#70H;堆栈入口
17.MOV30H,#0;赋值,秒表初始时间
18.MOV31H,#0
19.MOV32H,#0
20.MOV33H,#0
21.MOV34H,#0
22.MOV35H,#0
23.MOVTMOD,#00010001B;设置为16位定时器
24.MOVTH0,#0D8H;设初值,定时10MS(针对12MHz晶振)
25.MOVTL0,#0F0H
26.SETBIT0;设置边沿触发
27.SETBIT1
28.MOVIE,#10000111B;设置允许外部中断0、1,定时器0中断请求,
开总中断
29.MOVE_CLOCK:
MOVR1,#40H
30.MOVR2,#6
31.MOVR0,#30H
32.LOOP:
MOVA,@R0
33.MOVDPTR,#TAB
34.MOVCA,@A+DPTR;查段码,获取当前数值的共阴极码
35.CPLA;硬件有反相器,所以软件取反
36.MOV@R1,A
37.INCR0
38.INCR1
39.DJNZR2,LOOP
40.SAOMIAO:
MOVA,#00000001B;扫描,使数值显示在数码管上
41.MOVR1,#40H
42.MOVR2,#6
43.LOOP1:
MOVP1,A
44.MOVP0,@R1
45.LCALLDELAY
46.RLA
47.INCR1
48.DJNZR2,LOOP1
49.JNBP3.1,START;清零功能,键按下时,返回初始化
50.JNBP3.6,DUSHU;检查是否启动读数模式
51.JB01H,RETURN
52.JNB00H,SAOMIAO
53.CLR00H
54.LJMPMOVE_CLOCK
55.DUSHU:
SETB01H;读数模式标志位
56.CLRRS1;读数模式下选择第1组工作寄存器
57.SETBRS0
58.RETURN:
LJMPSAOMIAO
59.TO_T0:
CLRTR0
60.CLRRS1;读数模式启动后,内部计时依然使用第0组工作寄存器
61.CLRRS0
62.MOVTH0,#0D8H;设初值,定时10MS(针对12MHz晶振)
63.MOVTL0,#0F0H
64.SETBTR0
65.SETB00H;10MS时间到标志位
66.INC30H
67.MOVR3,30H
68.CJNER3,#10,TIME_10MS;进位比较
69.MOV30H,#0
70.INC31H
71.MOVR3,31H
72.CJNER3,#10,TIME_10MS
73.MOV31H,#0
74.INC32H
75.MOVR3,32H
76.CJNER3,#10,TIME_10MS
77.MOV32H,#0
78.INC33H
79.MOVR3,33H
80.CJNER3,#6,TIME_10MS
81.MOV33H,#0
82.INC34H
83.MOVR3,34H
84.CJNER3,#10,TIME_10MS
85.MOV34H,#0
86.INC35H
87.MOVR3,35H
88.CJNER3,#6,TIME_10MS
89.MOV35H,#0
90.TIME_10MS:
JNB01H,Y0;检查是否进入读数模式
91.SETB02H;标志位,去除不同模式下按钮的干扰
92.SETBRS0;若是,中断结束前,返回第1组工作寄存器
93.CLRRS1
94.Y0:
RETI
95.TO_INT0:
CPLTR0;通过取反,实现启动/暂停
96.RETI
97.TO_INT1:
JB02H,Y1
98.LJMPY2
99.Y1:
JNBTR0,Y2
100.CLRRS0;返回读取内部计时
101.CLRRS1
102.PUSHA;保护现场
103.MOVR1,#40H
104.MOVR2,#6
105.MOVR0,#30H
106.LOOP2:
MOVA,@R0
107.MOVDPTR,#TAB
108.MOVCA,@A+DPTR;查段码
109.CPLA;硬件有反相器,所以软件取反
110.MOV@R1,A
111.INCR0
112.INCR1
113.DJNZR2,LOOP2
114.POPA;恢复现场
115.Y2:
RETI
116.DELAY:
MOVR7,#100;延时子程序
117.D2:
MOVR6,#18
118.D1:
NOP
119.NOP
120.NOP
121.DJNZR6,D1
122.DJNZR7,D2
123.RET
124.TAB:
DB3FH,06H,5BH,4FH,66H;段码表
125.DB6DH,7DH,07H,7FH,6FH
126.RET
127.END
3、秒表工作原理及技术分析
关于秒表:
硬件上,该电路外部P3.1增设一“复位清零”按钮,外部中断
增设一“启动/暂停”按钮,
增设一“读取”按钮,P3.6增设一“读数模式”切换按钮。
软件上,Ⅰ清零功能:
通过将检测P3.1口是否动作的程序嵌入数码管扫描程序中,当检测到P3.1有动作时,跳转到程序START开始阶段,恢复初始值、初始模式;
Ⅱ启动/暂停:
通过外部中断0随时等待请求中断,初始定时器启动控制位TR0为0,当中断请求时,将定时器启动控制位置1,开始计时;再按一次,即将TR0取反置0,停止计时,可反复操作;
Ⅲ关于秒表计时,采用定时器0溢出中断,通过设置好计时溢出时间实现加10ms以及通过比较指令、标志位实现进位;
Ⅳ读数模式:
通过启用第1组工作寄存器,第0组工作寄存器仍用于内部定时器计时,从而使当前计数不显示在数码管上,再利用外部中断1,当“读取时间”按钮申请中断时,扫描30H-35H当前值,利用第0组工作寄存器中将当前值重新查询段码送至40H-45H,返回后即可显示所读取的秒数。
二、教学实例功能拓展
1、密码锁教学实例说明
在相关硬件基础下,通过检测P0八个口是否有键按下,与对应密码组合进行比较,正确则驱动P3.7相应电路使其灯亮,错误则对P1口赋值,使其报警灯亮起。
2、拟拓展功能描述
为更加贴近生活中电子密码锁的应用,拟拓展以下功能:
①在原有教学实例上,将3个实例功能整合;
即:
⑴按1亮1盏灯,按2亮2盏灯,……按8亮8盏灯
⑵可以再次输入密码
⑶报警灯闪烁
②密码只有三次的输入错误机会,三次一到,冻结按键;
③增设一“解除冻结”按钮,以模拟等待主人开锁。
3、硬件及软件修改方法
关于密码锁:
硬件上,该外部电路P3.0增设一“解除冻结”按钮,增添一7SEG-BCD数码管。
软件上,对应拟拓展功能:
①将输入密码传送至ACC累加器再与报警灯亮灯方案进行比较;
②在密码比较环节入口新增计数环节,每输错密码进入报警灯比较环节自动“减1”,剩余输入次数通过对应BCD码传送到P2口,使其数码管显示,当输入三次连续错误时,通过JBP3.0,$死循环使其等待解锁指令;
③通过P3.0口解除,正常工作下,按下P3.0也可复位。
1.ORG0000H
2.LJMPSTART
3.ORG0100H
4.START:
CLRP3.7;初始化,上锁
5.MOVP2,#00000011B;设置输入次数
6.MOVP1,#0FFH;初始化,灭灯
7.MOVR4,#0
8.MOVR5,#0
9.CLR00H
10.CLR01H
11.KEY:
MOVA,P0
12.CJNEA,#0FFH,KEYDOWN
13.JNBP3.0,START
14.JNB00H,KEY;无键按下,返回重新检测
15.JB01H,Y1
16.Y2:
LCALLDELAY;延时显示
17.MOVP1,#0FFH
18.LCALLDELAY
19.LCALLDELAY
20.MOVP1,R0
21.INCR4
22.CJNER4,#250,KEY;扫描新输入
23.MOVR4,#0
24.LJMPKEY
25.Y1:
INCR5
26.CJNER5,#03H,Y3;三次输入次数到
27.MOVP2,#00H
28.JBP3.0,$;冻结按键,等待P3.0口解除
29.LJMPSTART
30.Y3:
DECP2.0;输入错误,次数减1
31.CLR01H
32.LJMPY2
33.KEYDOWN:
LCALLDELAY;延时去抖动
34.MOVA,P0
35.CJNEA,#0FFH,KEY1
36.LJMPKEY;无键按下,返回重新检测
37.KEY1:
CJNEA,#11111011B,KEY2;与正确密码比较
38.SETBP3.7;密码正确,开锁
39.MOVP2,#00000011B
40.MOVP1,#11111111B
41.MOVR5,#0
42.CLR00H
43.LJMPCOMOUT
44.KEY2:
SETB01H;记录输入次数标志位
45.CJNEA,#11111110B,L1;以下为比较环节,找出所输错误密码
46.MOVR0,#11111110B;对应的亮灯
47.L1:
CJNEA,#11111101B,L2
48.MOVR0,#11111100B
49.L2:
CJNEA,#11111011B,L3
50.MOVR0,#11111000B
51.L3:
CJNEA,#11110111B,L4
52.MOVR0,#11110000B
53.L4:
CJNEA,#11101111B,L5
54.MOVR0,#11100000B
55.L5:
CJNEA,#11011111B,L6
56.MOVR0,#11000000B
57.L6:
CJNEA,#10111111B,L7
58.MOVR0,#10000000B
59.L7:
CJNEA,#01111111B,NEXT
60.MOVR0,#00000000B
61.NEXT:
MOVP1,R0
62.CLRP3.7
63.SETB00H;等待新密码密码标志位
64.COMOUT:
LJMPKEY
65.DELAY:
MOVR6,#64H;延时子程序
66.LOOP1:
MOVR7,#0F8H
67.NOP
68.LOOP2:
DJNZR7,LOOP2
69.DJNZR6,LOOP1
70.RET
71.END
4、调试过程及结果
调试过程中在显示延时上做了颇多调整,初步解决了按键失灵的故障,再经过调整标志位的合适位置,最终能到达自己拟拓展的相关功能。
3、课程学习总结
不知不觉,我学了单片机将近一个学期,感觉收益匪浅。
我现在对单片机的理解,要说一句最大的感受,那就是“单片机是一种集成度很高的微型计算机”。
就这学期所学的AT89C51芯片,它包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线这样一个完善的硬件设备;而对于单片机的程序控制,机器码、汇编语言,从我理解的角度,程序的本质是寄存器之间的数据传递。
程序是由两部分组成的:
首先是寄存器之间的数据传递,剩下的就是逻辑控制。
而在这一学期,通过经典流水灯,密码锁,数码管等不同控制要求的实例学习,从老师的一次又一次地耐心教导中逐渐领悟了逻辑程序的魅力。
要想开发自己的逻辑思维,就要多看别人的程序,找出别人程序中的“闪光点”,并且在自己以后的编程中加以运用。
而不是照着老师已编好的程序思路被“引”进去,这才是进步之道。
课程建议:
至于课程建议的话,个人倒是真的没有什么可采取性的建议。
叶老师讲得很好,思路清晰明朗。
学习关键还是学生本身,逻辑思维不多练,肯定写不成完整的程序;课本我觉得也很重要,书里详细的硬件、功能介绍看多了,自己编程时才会有更好的运用。
我们是大专生,电气自动化以贴近企业生产、工控学习为主。
就现在单片机在大量生产开发中的应用,课程若是能以C语言、汇编语言互辅教学那就更好啦~但又涉及大一学习C语言程序基础,所以没有什么采取性。