基于89C51的闪烁LED小灯设计

来源:互联网 发布:大乐透缩水软件 编辑:程序博客网 时间:2024/06/05 23:53
C51的闪烁LED设计
    本设计采用通俗易懂的语言组织,看好了,在进行以下主要内容之前,先话痨话痨,学习这些单片机设计啊,真的得有兴趣,所谓兴趣,就是你懂了它,理解了它,自然而然就对它产生了兴趣了,换句话说,你他么一点都不懂,你来跟我说兴趣,你个龟儿,鬼都不信,墙都不服舅扶你。话不多说,想玩这个,总得知道入口吧,你是通过什么方式知道玩这个单片机呢,有人专业课就是这个,有人网上知乎听水友唠唠知道,千奇百怪的方式,而我呢,确实是专业课所需的,没办法,写这篇博客,我正在读大三呢,哈哈,一起加油吧!
   我写的这个LED闪烁小灯,是采用AT89C51的,是采用汇编语言来写程序的,主要使小灯轮流点亮,逐点点亮,间隔点亮。下图(1)是闪烁小灯电路原理图,其中P1口作LED灯控制输出端口,P3.0~P3.2分别为三个闪烁功能开关控制端口,P3.3端口做备用,限流电阻10k,采用12MHz晶振。
  
                                                  图(1)
                                                 系统程序设计
一.主要程序
    扫描P3.0~P3.2口,看一看有没有按键按下,然后呢,在20内存单元中的低三位全部置1,进而确定所执行的闪烁功能,来看看,20H.0为1时,LED灯轮流点亮,20H.1为1时,LED灯逐点点亮;20H.2为1时,LED灯间隔点亮;然后呢,注意要先对20H低三位的位值判断是否为1,会转入相应的闪烁控制程序,上电要初始化的,要先对20H.0进行置1,系统首先进入轮流点亮功能。主程序流程图如图(2)
二.键扫描子程序
    采用直接端口扫描键开关,要用软件延时消抖确认后呢,要对20H内存单元相应的位进行置1,其余位置零。
三.闪烁控制程序
    这个程序用来控制P1口的发光变化方式的,其中如下:
   功能程序0(FUN0)的P1口输出变化为:11111110 延时 11111101 延时 11111011 延时 11110111 延时 11101111 延时 11011111 延时 10111111 延时 01111111 延时 结束 转去执行主程序
   功能程序1(FUN1)的P1口输出变化为:11111110 延时 11111100 延时 11111000 延时 11110000 延时 11100000 延时 11000000 延时1000000 延时 00000000 延时 结束转去执行主程序
  功能程序2(FUN2) 的P1口输出变化为:10101010 延时 01010101 延时 结束转去执行主程序。
四.延时子程序
  延时子程序有10ms和0.5s两个,用作键扫描消抖及LED闪烁延时,LED的闪烁快慢由R4寄存器内的初值进行改变。
            汇编程序清单
RG 0000H  ;程序执行开始地址LJMP START ;转去START执行ORG 0003H ;外中断0中断入口地址RETI ;中断返回(不开中断)ORG 000BH ;定时器T0中断入口地址RETI ;不开中断ORG 0013H ;外中断1中断入口地址RETI ;不开中断ORG 001BH ;定时器T1中断入口地址RETI ;不开中断ORG 0023H ;串行口中断入口地址RETI ;不开中断CLEAR:MOV 20H,#00H ;20H单元内容清零(闪烁标志清零)      SETB 00H ;20H.0位置置1  RET ;子程序返回  START:ACALL CLEAR ;调用初始化子程序  MAIN:LCALL KEYWORK ;调用键扫描子程序       JB 00H,FUN0 ;20H.0位为1时转去执行FUN0   JB 01H,FUN1 ;20H.1位为1时转去执行FUN1   JB 02H,FUN2 ;20H.2位为1时转去执行FUN2   JB 03H,MAIN ;备用   AJMP MAIN ;返回主程序MAIN   FUN0:MOV A,#0FEH ;累加器赋初值   FUN00:MOV P1,A ;累加器值送入P1口          LCALL DL05S ;调用延时05s子程序          JNB ACC.7,MAIN  RL A  AJMP FUN00 ;转去执行FUN00  FUN1:MOV A,#0FEH ;累加器赋初值  FUN11:MOV P1,A ;累加器值送入P1口          LCALL DL05S ;调用延时05s子程序  JZ MAIN ; 累加器为0转去执行主程序MAIN  RL A ;累加器中数据循环左移1位  ANL A,P1 ;A中值与P1值相与  AJMP FUN11 ;转去执行FUN11  FUN2:MOV A,#0AAH ;累加器赋初值  FUN22:MOV P1,A ;累加器值送入P1口          LCALL DL05S ;调用延时05s子程序  CPL A ;A中各位取反  MOV P1,A ;再把累加器值送入P1口  LCALL DL05S ;调用05s子程序  AJMP MAIN ;转去执行主程序MAIN  KEYWORK:MOV P3,#0FFH           JNB P3.0,KEY0   JNB P3.1,KEY1   JNB P3.2,KEY2   JNB P3.3,KEY3  RET  KEY0:LCALL DL10MS       JB P3.0,OUT0   SETB 00H   CLR 01H   CLR 02H   CLR 03H   OUT0:RET   KEY1:LCALL DL10MS       JB P3.1,OUT1   SETB 01H   CLR 00H   CLR 02H   CLR 03H   OUT1:RET   KEY2:LCALL DL10MS       JB P3.2,OUT2   SETB 02H   CLR 00H   CLR 01H   CLR 03H   OUT2:RET   KEY3:LCALL DL10MS        JB P3.3,OUT3SETB 03HCLR 00HCLR 01HCLR 02HOUT3:RETDL512:MOV R2,#0FFHLOOP1:DJNZ R2,LOOP1            RETDL10MS:MOV R3,#14HLOOP2:LCALL DL512       DJNZ R3,LOOP2  RET  DL05S:MOV R4,#0FH  LOOP3:LCALL DL25MS        DJNZ R4,LOOP3        RETDL25MS:MOV R5,#0FFHLOOP4:LCALL KEYWORK      DJNZ R5,LOOP4  RETEND   


原创粉丝点击