8051单片机二极管闪烁实验

实验原理:

送给二极管一个高电平(逻辑1)时,灯亮;当输入为低电平(逻辑0)时,灯灭。但是人眼能够分辨的亮光必须超过20ms,假使二极管灭的时间也为20ms,则频率为25Hz。

另:在51单片机中可以直接将一个立即数用mov指令由P1口送出。为了增加P1口的驱动,我们使用一片245的驱动芯片以增加P1口的驱动力。245有两种芯片:一种是74LS245,另一种是74HC245。一个是低功耗(LS)一个是高速(COMS)形的,即一个是TTL形的,一个是COMS型的。一般的规则都是能用LS坚决不用HC,因为HC这样的COMS电路尽管他高速,但是一般都会带来较高的噪声。

实验内容:

编写一程序,达到一下要求:(L0~L7均为发光二极管)

  • L0、L1闪烁5次,其余不闪烁,频率1Hz
  • L2、L3闪烁5次,其余不闪烁,频率1Hz
  • L4、L5闪烁5次,其余不闪烁,频率1Hz
  • L6、L7闪烁5次,其余不闪烁,频率1Hz
  • L0、L1、L2、L3闪烁5次,其余不闪烁,频率1Hz
  • L4、L5、L6、L7闪烁5次,其余不闪烁,频率1Hz
  • L0~L7全部闪烁5次,频率1Hz
  • 重复以上步骤

程序:

AST: DB 03H,0CH,30H,C0H,0FH,F0H,FFH ;建表
MAIN: MOV DPTR,#AST ;将表格的放入DPTR
MOV R4,#00H ;将R4作为指针
L1: MOV A,R4 ;将指针位置赋给累加器A
MOVX A,@A+DPTR ;将((A)+(DPTR))的值放到累加器A中
ACALL FLASH ;调用子函数FLASH
INC R4 ;R4指针指向下个数字
CJNE R4,#7,L1 ;若R4-7不为零,跳到L1
SJMP MAIN ;跳到主函数,实现循环
FLASH: MOV R0,#05H ;实现闪烁的次数
L2: MOV P1,A ;(A)->P1口输出,实现二极管亮一次
ACALL DELAY ;调用子延时函数DELAY
MOV P1,#00 ;00->P1口输出,实现二极管灭一次
ACALL DELAY ;调用子延时函数DELAY
DJNZ R0,LOOP ;如果R0不为零,跳到L2
RET ;跳出子函数
DELAY: MOV R1,#250 ;延时程序开始,机器周期1
DELAY0: MOV R2,#249 ;机器周期1
DELAY1: NOP ;机器周期1
NOP ;机器周期1
DJNZ R1,DELAY1 ;机器周期2
DJNZ R0,DELAY0 ;机器周期2
RET ;机器周期1

延时程序的机器周期为:

T=Tcy×[(1+1+2)×249+1+2]×250+1+1=499502μs≈0.5s

其中Tcy为每个机器周期的时间Tcy=12/fsoc(晶振周期)=2μs

您可能还喜欢...

3 条回复

  1. 2009/01/21

    Blogring for 闪烁噪声…

    Blogring for 闪烁噪声…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据