单片机电风扇汇编.docx
《单片机电风扇汇编.docx》由会员分享,可在线阅读,更多相关《单片机电风扇汇编.docx(14页珍藏版)》请在冰豆网上搜索。
单片机电风扇汇编
东南大学自动化学院
实验报告
课程名称:
MCU(微控制器)综合课程设计
实验名称:
综合课程设计
院(系):
自动化学院专业:
自动化专业
姓名:
学号:
实验室:
测控技术实验室实验组别:
同组人员:
实验时间:
2011年6月10日
评定成绩:
审阅教师:
一.实验目的和要求……………………………………………………3
二.实验原理……………………………………………………………3
三.实验方案与实验步骤………………………………………………4
四.实验设备与器材配置………………………………………………7
五.实验记录……………………………………………………………7
六.实验总结……………………………………………………………7
七.思考题………………………………………………………………7
八.汇编语言源代码……………………………………………………7
一.课程设计目的和要求
1、课程设计题目:
家用电器模拟:
电风扇
2、模拟设计要求:
(1)初始加电程序运行,电风扇无速度,只有按下风速选择的任一按键,电风扇开始工作。
此时,只要进行新的速度选择也不按下停止键,电风扇就将按设计的风速持续运行。
(2)开启摇头开关后,模拟风扇摇头,并且在摇头状态中也可进行风扇的调速。
(3)利用LED流水灯的间隔时间模拟风速,程序运行后呈现较长的间隔时间以模拟风扇上电但未运行。
按键盘上的键选择速度,并用数码管显示速度选择的数字。
拨码开关为摇头开关,开关打开后,流水灯反向表示摇头。
二.实验原理
1、:
使用硬件设备
数码管、发光二极管、键盘、拨码开关。
实验不需要接线。
2、设计思想
(1)整体设计的主要程序使用定时器定时中断实现。
(2)实验要求二极管的流水灯按照按键的不同以不同的间隔时间依次点亮,则将按键的键码作为流水灯的间隔时间,设置一定的中断时间,中断每运行一次则INCR1,再将R1与A作比较(再次之前已经经过键盘扫描,将键盘的键码赋值给了A),若一致则运行流水灯,若不一致则再次运行中断,由此,按不同的键有不同的键码,则中断运行次数不同,流水的时间间隔自然不同。
(3)为保证在按键后能够及时的改变风速,则每次中断时扫描一次键盘,并计算键码显示在数码管上。
(4)每次中断扫描拨码开关状态,以便能够及时的判断是否要处于摇头状态。
(5)数码管显示风速选择的数字,并实时刷新。
三.实验步骤与实验方案
1、程序流程图
(1)主程序
(2)中断服务程序:
2、实验步骤:
(1)在Medwin中完成项目的创建;
(2)添加自己编写的.asm源文件并编译/汇编;
(3)生成代码并下载到仿真器上;
(4)程序运行。
返回监控后可查看寄存器和存储器的值。
(5)按键盘选择风速,波动拨码开关选择摇头。
四.实验设备与器材配置
PC机;
EEEC-030型单片机/ISP综合设计实验装置
五.实验分析与总结
1、此次实验中加深了对中断程序的理解。
最开始的程序流水灯的部分用的是软件延时来实现,但是在调试过程中发现,利用延时会让程序一直处于第一个延时的循环中,在这种情况下无法进行按键的二次选择,拨码开关也只能够选择一次,除了关闭程序以外也没有按预想的实现风扇的停止状态。
在这种情况下,我开始在程序里加入中断,以实现能够每次都进行键盘的扫描。
加入中断的开始阶段,风速仍然是使用软件延时的流水灯在中断外部以调用子程序的方式来实现的,但是调试过程中发现,中断的调用不理想,延时不能按预想的所实现,常常会出现所有的发光二极管一起亮起的状态,出现问题之后请教了同学使用了现在以中断的最大等待时间作为流水灯间隔时间的方式。
INCR1;时间加1
MOVA,R5
XRLA,R1;最大等待时间到?
JNZEE1;没到,转到EE1
R5为储存的输入键码,以不同的R5实现延时,从而模拟不同的风速变化。
在之后的调节中还出现过虽然按了键码但是流水灯速度不变的情况,经过查看寄存器发现是R1在流水灯运行、按键重新选择时没有进行清零,从而时的R1的数值一直处于同一个状态。
2、在调试中由于中断程序无法进行单步调试,全速运行时无法观察寄存器的变化,则设置断点,全速运行程序停止,在断点处单步运行观察寄存器。
而在软件中还有“执行到…”的选择,只要选择认为需要调试的程序部分的地址或者标号,就可以执行到此处,然后就可以单步跟踪程序的运行了。
3、由于自己的能力有限,所以此次设计只是进行了简单的模拟,实现了相对简单的功能。
作为程序的改进,还可以加上时间的设置,可在初始化寄存器事设定一定的初值,当在一定风速时,不同的拨码开关波动后,R1与此初值比较,当R1与设置的初值相等,风扇回复按键“0”状态,以实现电风扇的定时。
六.附上源代码
ORG0000H
LJMPMAIN
ORG000BH
AJMPIINT0
MAIN:
NOP
NOP
ACALLLED1
MOVR1,#00H
MOVR6,#00H
MOVR3,#00H
MOVR5,#00H
MOVIE,#00H;关中断
MOVTMOD,#01H;设置定时器定时方式
MOVTH0,#0E0H
MOVTL0,#0E0H;初值
SETBTR0
SETBEA
SETBET0;开中断,启动定时
HERE:
ACALLSHOW1;数码管刷新,等待中断
JMPHERE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;中断服务程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IINT0:
ACALLKS;键盘全局检测
JNZLK1;有键闭合,转移
AJMPDO
LK1:
ACALLCHECK
DO:
MOVDPTR,#0F500H
MOVXA,@DPTR
CJNEA,#00H,YURE;判断开关是否正确拨动
INCR1;时间加1
MOVA,R5
XRLA,R1;最大等待时间到?
JNZEE1;没到,转到EE1
MOVA,R7
RRA
MOVR7,A
MOVDPTR,#0F600H
MOVX@DPTR,A
MOVR1,#00H
AJMPEE1
YURE:
INCR1;时间加1
MOVA,R5
XRLA,R1;最大等待时间到?
JNZEE1;没到,转到EE1
MOVA,R7
RLA
MOVR7,A
MOVDPTR,#0F600H
MOVX@DPTR,A
MOVR1,#00H
EE1:
MOVTH0,#0E0H
MOVTL0,#0E0H
SETBTR0;重设初值,启动中断
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;LED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LED1:
ANLA,#07H;模8
MOVR0,A
CJNER0,#00H,L1
MOVA,#80H
AJMPLL
L1:
CJNER0,#01H,L2
MOVA,#01H
AJMPLL
L2:
CJNER0,#02H,L3
MOVA,#02H
AJMPLL
L3:
CJNER0,#03H,L4
MOVA,#04H
AJMPLL
L4:
CJNER0,#04H,L5
MOVA,#08H
AJMPLL
L5:
CJNER0,#05H,L6
MOVA,#10H
AJMPLL
L6:
CJNER0,#06H,L7
MOVA,#20H
AJMPLL
L7:
MOVA,#40H
LL:
CPLA;取反输出
MOVR7,A;R7存LED的值
MOVDPTR,#0F600H
MOVX@DPTR,A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;键盘扫描;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CHECK:
MOVR2,#0FEH;低4位为要选通的行线值
MOVR4,#00H;行号
CHECK1:
MOVA,R2
MOVDPTR,#0F700H
MOVX@DPTR,A
MOVXA,@DPTR;读入,高4位为列线状态
ANLA,#0F0H;屏蔽无效的低4位行线状态
JBACC.4,LONE;检测第一列,没按下跳转至下一列
MOVA,#0CH;该列第一个键码值为0CH
AJMPLKP
LONE:
JBACC.5,LTWO;检测第二列
MOVA,#08H
AJMPLKP
LTWO:
JBACC.6,LTHR;检测第三列
MOVA,#04H
AJMPLKP
LTHR:
JBACC.7,NEXT;检测第四列
MOVA,#00H
LKP:
ADDA,R4;计算键码
MOVR5,A
ACALLSHOW1;数码管显示最大等待时间
AJMPTC;键码存在R5中
NEXT:
MOVA,R2
JNBACC.3,CHECK;4行都已扫描一遍,转回重新从第一行开始
RLA
MOVR2,A;选通值选中下一行
INCR4
AJMPCHECK1
TC:
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;软件延时子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY:
MOVR2,#0C8H
LOOP:
NOP
NOP
NOP
DJNZR2,LOOP
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;数码管刷新;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SHOW1:
PUSHACC
MOVR0,#00H
QQ1:
MOVA,#0FBH
MOVDPTR,#0F400H
MOVX@DPTR,A;输出位码
MOVA,R6;R6存分数
MOVB,#0AH;B存10,做除法时用
DIVAB;除法后,A存十位数字,B存个位数字
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVDPTR,#0F300H
MOVX@DPTR,A;十位输出
ACALLDELAY;调延时
MOVA,#0FDH
MOVDPTR,#0F400H
MOVX@DPTR,A;输出位码
MOVA,B
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVDPTR,#0F300H
MOVX@DPTR,A;个位输出
ACALLDELAY;调延时
MOVA,#0FEH
MOVDPTR,#0F400H
MOVX@DPTR,A;输出位码
MOVA,R5;R5存最大设定时间(键盘)
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVDPTR,#0F300H
MOVX@DPTR,A;输出键盘值
ACALLDELAY;调延时
CJNER0,#3AH,QQ
AJMPQQ2
QQ:
INCR0
AJMPQQ1
QQ2:
POPACC
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;全局键盘检测;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KS:
MOVDPTR,#0F700H
MOVA,#0F0H;4行全选中
MOVX@DPTR,A
MOVXA,@DPTR
CPLA;A取反,若无键按下,高四位就全为0
ANLA,#0F0H;屏蔽无效的低4位行线状态
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;段码表;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TAB:
DB0C0H
DB0F9H
DB0A4H
DB0B0H
DB99H
DB92H
DB82H
DB0F8H
DB80H
DB90H
DB88H
DB83H
DB0C6H
DB0A1H
DB86H
DB8EH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END