1.
A,学习汇编语言编程
B,学习使用编程软件和下载器在单片机上编程
C,学习学习嵌入式的方法
2. 任务要求
用汇编语言编程实现LED灯闪烁
3. 实验器材
单片机PIC16F886一片、LED灯一只、电阻任选、下载器(及相关的线)一个
4. 实验方案
图
图
5. 调试过程
先使LED灯亮,再写延时程序,最后实现闪灯。最后的结果是可以实现闪灯,但是闪灯的频率和亮灭时间比例还不能精确控制。
6. 实验现象分析
奇怪的现象:(还没有解决)
1,只写让LED灯亮的程序,即
LIST
INCLUDE
ORG
BANKSEL
CLRF
CLRF
MOVLW
MOVWF
END
时,在PICKIT
2,如果采用延时、翻转如此循环,即循环部分分别为
A.loop
comf
goto
B.loop
call
call
call
call
comf
goto
C.loop
call
call
call
call
call
call
call
call
call
comf
goto
时,测到的实际频率都在0.48Hz左右(采用的时候总周期是默认的4MHz),然而一个循环中delay调用次数越多,灯亮的时间越短,灭的时间越长。当时钟频率选择127kHz时,调用3个delay时就已经不会亮了。
3,如果采用清零、延时、置位、延时的循环,发现LED每次亮灭的时间基本相同,但是,每亮灭五次后,会有一次灯灭的时间稍微长一点。改变时钟频率后也是这样。猜测是delay函数写得有问题。
这三个现象计划的解决方法是单步调试和仿真。
(写完这份报告时,杜航同学提醒说我在delay中用到了decfsz函数,而decfsz函数的操作范围只有0~127,而我设置的却是0ffh,已超出该范围。)
之前曹航用127kHz的时钟,假设四个时钟周期是一个指令周期,假设按照之前以为的2^8*2^8*2*2,周期在8s左右,实验出来的结果却在2s左右。按照杜航的说法,实际的一个周期内指令一共2^7*2^7*2*2,则计算得到灯的周期为2.06秒,实验时计算到的现象是亮灯周期2s左右,比较符合。但是具体是不是这样还要进一步验证。
额,刚刚把delay中的0ffh改成07fh发现灯明显闪烁快了。所以之前的假设不成立。
附:
INCLUDE
org
nop
BANKSEL
BCF
BCF
BSF
BANKSEL
movlw
movwf
BANKSEL
movlw
movwf
loop
CALL
BSF
CALL
BCF
goto
;-------------------------廷时子程序----------------------------
delay
lp0
lp1
return
end