专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

pic单片机闪灯实验(Hello World)实验报告

作者:佚名   来源:互联网   点击数:  更新时间:2014年08月14日   【字体:

1.  实验目的

A,学习汇编语言编程

B,学习使用编程软件和下载器在单片机上编程

C,学习学习嵌入式的方法

2.  任务要求

用汇编语言编程实现LED灯闪烁

3.  实验器材

单片机PIC16F886一片、LED灯一只、电阻任选、下载器(及相关的线)一个

4.  实验方案

 

 

 

图 1 硬件设计图

 

 

图 2 软件流程图

5.  调试过程

先使LED灯亮,再写延时程序,最后实现闪灯。最后的结果是可以实现闪灯,但是闪灯的频率和亮灭时间比例还不能精确控制。

6.  实验现象分析

奇怪的现象:(还没有解决)

1,只写让LED灯亮的程序,即

LIST p=16f886

INCLUDE p16f886.inc

ORG 0x00

BANKSEL TRISC

CLRF TRISC

CLRF STATUS

MOVLW B'00001111'

MOVWF PORTC

END

时,在PICKIT 2中选择5V on ,测得Vdd=4.2V,万用表直流电压档测得PIN RC3 2.7V ,示波器测时发现RC3引脚是频率是50Hz,幅值是2.7V的正方波。LED可以一直亮,但是不是预期的一直置位。还没有找到原因。

2,如果采用延时、翻转如此循环,即循环部分分别为

A.loop call delay

comf portc,1

goto loop

B.loop call delay

call delay

call delay

call delay

call delay

comf portc,1

goto loop

C.loop call delay

call delay

call delay

call delay

call delay

call delay

call delay

call delay

call delay

call delay

 

comf portc,1

goto loop

时,测到的实际频率都在0.48Hz左右(采用的时候总周期是默认的4MHz),然而一个循环中delay调用次数越多,灯亮的时间越短,灭的时间越长。当时钟频率选择127kHz,调用3delay时就已经不会亮了。

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 P16F886.INC
org   000h      
nop             
BANKSEL OSCCON
BCF OSCCON,4
BCF OSCCON,5
BSF OSCCON,6
BANKSEL TRISC
movlw   00h       
movwf   TRISC    
BANKSEL PORTC   
movlw  000h       
movwf  PORTC   
  
loop 
CALL delay
BSF PORTC,3
CALL delay
BCF PORTC,3
goto loop

;-------------------------廷时子程序----------------------------
delay                       ;子程序名,也是子程序入口地址
       movlw   0ffh          ;将外层循环参数值FFH经过W
       movwf   20h          ;送入用作外循环变量的20H单元
lp0    movlw   0ffh          ;将内层循环参数值FFH经过W
       movwf   21h           ;送入用作内循环变量的21H单元
lp1    decfsz   21h,1         ;变量21H内容递减,若为0跳跃
           goto     lp1           ;跳转到LP1处
       decfsz    20h,1         ;变量20H内容递减,若为0跳跃
       goto     lp0           ;跳跃到LP0处
return

end

关闭窗口