当前位置:首页 » 节日大全 » 单片机怎么设置节日彩灯

单片机怎么设置节日彩灯

发布时间: 2023-04-19 04:47:33

1、单片机彩灯控制


一、C语言程序中存在的问题
1.“for(i=0;i<7;i=i+2)”是“左移4次”而不是“左移3次”,i=0,i=2,i=4,i=6,当i=8时结束for循环。
2.“LED=(LED<<2)|0x03;”的含义是:将LED左移2位后,将最低两位置1。
3.“LED=(LED>>2)|0xc0;”的含义是:将LED右移2位后,将最高两位置1。
4.两者结合,将“LED=(LED<<2)|0x03;”重复运行4次后,LED=0xff,其中不再存在值等于0的位。
之后无论“LED=(LED>>2)|0xc0;”还是“LED=(LED<<2)|0x03;”都不会再有值等于0的位产生。
看你的程序,发光二极管应该是低电平点亮,所以以后无论如何移位都不再有发光二极管点亮了。
5.解决方法:将“for(i=0;i<7;i=i+2)”改成“for(i=0;i<3;i++)”即可。
二、反汇编实际含义的问题
对“LED=(LED<<2)|0x03;”的反汇编:

;***********************************************************************    38:           LED=(LED<<2)|0x03; // 左.移2位,并设定最低两位元为11      
C:0x000D    E5B0     MOV      A,P1(0x90)
C:0x000F    25E0     ADD      A,ACC(0xE0)
C:0x0011    25E0     ADD      A,ACC(0xE0)
C:0x0013    4403     ORL      A,#0x03
C:0x0015    F5B0     MOV      P1(0x90),A
;***********************************************************************

1.C程序中有从LED取值的指令“=...LED...”,因为LED在宏定义中为P1口,所以其对应汇编指令为“MOV A,P1”。
2.在单片机实验中,P1口控制LED,常用灌电流直接驱动的方法。
在这样的电路下,即使引脚被内置置0,其对应外部引脚实腊历州际上还是被上拉成了高电平。
3.因此,读取P1口值时将得到0xff,故而“LED=(LED<<2)|0x03;”后LED将直接的到0xff,所以以后发光二极管都不会亮了。
4.解决办法:先对某个自定义寄存器进行移位处理,最后再将结构赋值给P1口。

 

修改后的程序:

/*主要是想让灯两个两个的亮,可是程序不知道为什么只执行一遍*/
/* ch03-3-3.c 轮蔽- 霹雳灯实验程序  */
/*
一、C语言程序中存在的问题
1.“for(i=0;i<7;i=i+2)”是“左移4次”而不是“左移3次”,i=0,i=2,i=4,i=6,当i=8时结束for循环。
2.“LED=(LED<<2)|0x03;”的含义是:将LED左移2位后,将最低两位置1。
3.“LED=(LED>>2)|0xc0;”的含义是:将LED右移2位后,将最高两位置1。
4.两者结合,将“LED=(LED<<2)|0x03;”重复运行4次后,LED=0xff,其中不再存在值等于0的位。
之后无论“LED=(LED>>2)|0xc0;”还是“LED=(LED<<2)|0x03;”都不会再有值等于0的位产生。
看你的程序,发光二极管应该是低电平点亮,所以以后无论如何移位都不再有发光二极管点亮了。
5.解决方法:将“for(i=0;i<7;i=i+2)”改成“for(i=0;i<3;i++)”即可。
二、反汇编实际含义的问题
对“LED=(LED<<2)|0x03;”的反汇编:
;**********************************************************************************
    38:                         LED=(LED<<2)|0x03; // 左.移2位,并设定最低两位元为11      
C:0x000D    E5B0     MOV      A,P1(0x90)
C:0x000F    25E0     ADD      A,ACC(0xE0)
C:0x0011    25E0     ADD      A,ACC(0xE0)
C:0x0013    4403     ORL      A,#0x03
C:0x0015    F5B0     MOV      P1(0x90),A
;**********************************************************************************
1.C程序中有从LED取烂迅值的指令“=...LED...”,因为LED在宏定义中为P1口,所以其对应汇编指令为“MOV A,P1”。
2.在单片机实验中,P1口控制LED,常用灌电流直接驱动的方法。
在这样的电路下,即使引脚被内置置0,其对应外部引脚实际上还是被上拉成了高电平。
3.因此,读取P1口值时将得到0xff,故而“LED=(LED<<2)|0x03;”后LED将直接的到0xff,所以以后发光二极管都不会亮了。
4.解决办法:先对某个自定义寄存器进行移位处理,最后再将结构赋值给P1口。
*/
//==声明区============================================
#include <reg51.h>   // 定义8051暂存器之标头档,P2-17~19 
#define LED P1   // 定义LED接至Port 1
//==子程序=============================================
/* 延迟函数,延迟约x 5ms */
//void delay(int x)  // 延迟函数开始  
void delay(unsigned char x)  // 延迟函数开始 

 int i,j;   // 声明整数变数i,j 
 for (i=0;i<x;i++) // 计数x次,延迟x 5ms   
 for (j=0;j<600;j++);// 计数600次,延迟5ms 
}      // 延迟函数结束
//==主程序============================================
main()     // 主程序开始

 unsigned char i;   // 声明无号数字元变数i(占1Bytes)   
 unsigned char temp=0x03; 
 //(舍去)LED=0xfc;   // 初值=1111 1100,只有最右1灯亮  
 while(1)     /// 无穷循环,程序一直跑  
 { 
  for(i=0;i<3;i++)// 左移3次   
  { 
   delay(100); // 延迟100 5m=0.5s    
   //(舍去)LED=(LED<<2)|0x03; // 左.移2位,并设定最低两位元为11  
   temp=temp<<2;
   LED=~temp;
  }    // 左移结束,只有最左1灯亮   
  for(i=0;i<3;i++)// 右移3次  
  { 
   delay(100); // 延迟100 5m=0.5s   
   //(舍去)LED=(LED>>2)|0xc0; // 右移2位,并设定最高位元为11 
   temp=temp>>2;
   LED=~temp;
  }    // 结束右移,只有最右1灯亮 
 }     // while循环结束
}      // 主程序结束

2、《单片机的原理与应用》节日彩灯的设计

程序如下,P0口改为P1、P2或P3口可以省略电路图中的上拉电阻。

注意:无论选择哪组I/O,每亏伏漏个LED都要串联一个220Ω或470Ω的电阻。

#include "reg51.h"

#define uint unsigned int

#define uchar 厅察unsigned char

uchar code tab[]={0xfa,0xf5,0xaf,0x5f,0xaa,0x55,0x00,0xff};//分别为1和3亮、2和4亮、5和7亮、6和销烂8亮、奇数位亮、偶数位亮、全亮、全灭

uchar t,num;

void InitUART(void)

{

TMOD=0x01; //定时器0 工作方式1即16位定时

TH0=0x3c; //装入初值,定时50ms

TL0=0xb0;

TR0=1;

ET0=1; 

EA= 1;//打开总中断

}

main()

{

InitUART();

P0=tab[num]; //先让等处于第一种状态

while(1)

{;}

}

Timer0() interrupt 1

{

TH0=0x3c; //手动重装初值,定时50ms

TL0=0xb0;

t++;

if(t==20)

{

t=0;//够20次,即计数时间为20*50ms=1s。计时次数清零,准备下一秒的计时

num++;//num指向下一种状态

if(num==8) num=0;

P0=tab[num];//则切换至相应的状态

}

}


纯手打,望采纳···

3、用单片机设计七彩循环装饰灯控制器

该灯电路设计新颖,结构简单,成本低廉,趣味性强,可用在宾馆、酒楼作广告灯,也适用作节日彩灯。该彩灯是根据三基色原理,以红、绿、蓝三种基色组成一个可变色彩单元。将三种基色灯装入磨砂玻璃罩内,通过灯罩的混色作用(混色原理是:红色+绿色=黄色,蓝色+红色=紫色,绿色+蓝色=青色,红色+蓝色+绿色=白色)对外循环显示七种颜色,即红、蓝、绿、紫、青、黄、白。工作原理:七彩装饰灯的电路如图派禅肆所示:
220V交流电经C1降压、DW稳压、VD整流、C2滤波后输出12V直流电压供控制电路工作。IC1时基集成电路NE555和R1、RP、C3组成一个可调节器的时钟脉冲发生器,为后级电路提供所需的时钟脉冲信号。IC2为C180,它是一块具有同步加法计数功能的COMS集成电路,在它的复位端(R)连接C5、R2,使电路每次连通电源瞬间自动清零复位。CP是时钟脉冲输入端,Q1~Q4为输出端,其输出逻辑状态见真值表。从表中可以看出,当从C180的CP端输入第一个时钟脉冲时,其Q1端输出为高电平,三极管V1导通,触发双向可控硅SCR1导通,第一个基色灯泡H1点亮,灯罩显示红色;当第二个时袭裂钟脉冲触发C180时,其Q2端输出为高电平,V2、SCR2导通,第二个基色灯泡H2点亮,灯罩显示绿色,当第三个时钟脉冲触发C180时,Q1、Q2端同时输出高电平,V1、V2、SCR1、SCR2均导通,H1、H2同时点亮,根据混色原理,灯罩显示黄色;当第四个时钟脉冲触发C180时,Q3端输出高电平,第三个基色灯泡H3点亮,灯尘轿罩显示蓝色。依此类推,C180的Q1、Q2、Q3端输出组成7种逻辑状态,可使三基色灯H1、H2、H3的混色有7种颜色,因而灯罩可以显示出7种彩色灯光。当第8个时钟脉冲触发C180时,Q4输出高电平,C180复位,电路又开始循环上述过程。S为定色开关,若需要固定哪种颜色时,断开开关S即可。
输出
时钟
Q4
Q3
Q2
Q1
1
0
0
0
1
2
0
0
1
0
3
0
0
1
1
4
0
1
0
0
5
0
1
0
1
6
0
1
1
0
7
0
1
1
1
8
1
0
0
0
C180真值表元件选择与安装:RP选择470K电位器,它可调节该灯色彩循环速率。C1选用耐压值400V金属膜纸介质无极性电容器。DW用12V的稳压二极管。三只双向可控硅CSR选用耐压400V。其它元件均按图中标注选择。安装时,彩灯H1~H3固定在灯罩内,其它元件安装在一个小塑料盒内。将RP电位器和定色开关S固定在小塑料盒的面板上,以便调控。另外在焊接CMOS集成电路C180时,电烙铁要可靠接地,以防损坏集成块。

4、C51单片机 节日彩灯的程序设计 用汇编语言编制

ORG 0000H
AJMP MAIN
MAIN:
MOV P1,#05H
CALL DELAY
MOV P1,#0AH
CALL DELAY
MOV P1,#50H
CALL DELAY
MOV P1,#55H
CALL DELAY
MOV P1,#0AAH
CALL DELAY
MOV P1,#0FFH
CALL DELAY
MOV P1,#00H
CALL DELAY
AJMP MAIN

DELAY:
MOV R3,#1000
BC: MOV R2,#995
DEC R2
DJNZ R2,$
DJNZ R3,BC
RET

END
;说悔指辩明:该程碧缺序逗州采用P1口作为发光二极管的控制,阳极接P1口,阴极接地即可

5、以单片机为核心,设计一个节日彩灯控制器,要求如下:

你可以参考《吴鉴鹰单片机项目实战精讲》里面的资料,我也在学吴鉴鹰51单片机开发板

热点内容
新泰特产 发布:2020-09-14 19:00:13 浏览:505
适合开业的音乐 发布:2020-09-17 11:28:55 浏览:503
送男生十字绣 发布:2020-09-16 16:05:07 浏览:503
神秘商店皮肤赠送 发布:2020-09-16 15:38:37 浏览:503
手绘圣诞贺卡 发布:2020-09-16 14:48:57 浏览:503
青岛初中升学率 发布:2020-09-16 09:55:57 浏览:503
送妈妈的生日蛋糕图片 发布:2020-09-16 09:10:18 浏览:503
梦生日 发布:2020-09-16 18:24:33 浏览:502
纸礼物盒 发布:2020-09-16 15:55:47 浏览:502
wow角色定制 发布:2020-09-16 14:46:32 浏览:502