51单片机流水灯
《单片机原理及应用》基于51单片机实验箱的流水灯设计
《单片机原理及应用》基于51单片机实验箱的流水灯设计一、实验目的和要求1.掌握单片机基本资源使用。
2.掌握单片机电路原理图。
3.掌握单片机C语言软件开发以及试验箱使用。
二、实验内容和原理实验内容:1.绘制程序流程图并编写C语言程序2.在实验箱中进行测试,最后提交实验报告三、主要仪器设备Keil4软件、C51单片机实验箱。
四、操作方法与实验步骤4.1 题目要求使用单片机实验箱实现流水灯功能。
4.2 系统设计思路主程序中实现流水灯功能,时间单位采用500ms信号,作为实现流水灯的发光二极管和单片机的P1相连。
4.2 C程序编制(包含详细的文字和程序流程图)#include<intrins.h>#include<reg52.h>#define uchar unsiged char#define uint unsigned intvoid mDelay(uint Delay){int i;for(;Delay>0;Delay--)for(i=0;i<110;i++);}void main(){unsigned char a,i;While(1){a=0x01;for(i=0;i<8;i++){a=-crol-(a,1)P2=amDelay(500);}}4.3 测试分析(包含文字和图像叙述)在KeilC51软件软件中编写好程序并调试好后,连接单片机实验箱,实验结果如下:实验箱上连接的八个灯,每个灯间隔500ms的时间一个接一个的循环闪烁。
五、讨论和心得(不少于100字)通过此次实验,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,试验过程还是比较繁琐,但是还是完成了这次试验,使我对于理解单片机的基本原理更加深刻,将所学知识运用到实践中,在实践中发现问题,强化理论知识。
课程名称:单片机原理及应用实验项目名称(二):定时计数器的应用—按钮控制LED灯四、实验目的和要求1.掌握单片机基本资源使用。
51单片机流水灯程序
1.第一个发光管以间隔200ms闪烁。
2.8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms。
3.8个发光管来回流动,第个管亮100ms。
4。
用8个发光管演示出8位二进制数累加过程。
5。
8个发光管间隔200ms由上至下,再由下至上,再重复一次,然后全部熄灭再以300ms间隔全部闪烁5次。
重复此过程。
6.间隔300ms第一次一个管亮流动一次,第二次两个管亮流动,依次到8个管亮,然后重复整个过程。
7。
间隔300ms先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;8个全部闪烁3次;关闭发光管,程序停止。
1#include<reg52。
h〉#define uint unsigned intsbit led1=P1^0;void delay();void main(){while(1){led1=0;delay();led1=1;delay();}}void delay(){uint x,y;for(x=200;x>0;x—-)for(y=100;y〉0;y-—);}2#include<reg52。
h>#include〈intrins。
h〉#define uint unsigned intuchar a;void delay();void main(){a=0xfe;P1=a;while(1){a=_crol_(a,1);delay();P1=a;delay();}}void delay(){uint b;for(b=55000;b>0;b—-);}3#include<reg52。
h〉#include <intrins。
h>#define uint unsigned int #define uchar unsigned char void delay(){uint x,y;for(x=100;x〉0;x--)for(y=110;y>0;y—-);}void main(){uchar a,i;while(1){a=0xfe;for(i=0;i〈8;i++){P1=a;delay(100);a=_crol_(a,1);for(i=0;i〈8;i++){P1=a;delay(100);a=_cror_(a,1);}}}4#include<reg52.h>#include 〈intrins。
实验二.51单片机点亮流水灯
硬件连接
• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •
#include<reg52.h> sbit A0=P1^0;//位地址声明 sbit A1=P1^1; sbit A2=P1^2; sbit A3=P1^3; sbit ENLED=P1^4; unsigned char LED[8]={0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7};//定义无符号字符型一维数组LED的8个初值 void main() { ENLED=0; A3=1; unsigned int i=0;//无符号整形I,并赋初值0 while(1) { P1=LED[0]; for(i=0;i<30000;i++); P1=LED[1]; for(i=0;i<30000;i++); P1=LED[2]; for(i=0;i<30000;i++); P1=LED[3]; for(i=0;i<30000;i++); P1=LED[4]; for(i=0;i<30000;i++); P1=LED[5]; for(i=0;i<30000;i++); P1=LED[6]; for(i=0;i<30000;i++); P1=LED[7]; for(i=0;i<30000;i++); } }
• 表达式1首先执行一次且只执行一次;然后 执行表达式2,通常都是一个判断条件的表 达式,如果表达式2成立,就执行(要执行 的语句);然后再执行表达式3。。。。一 直到表达式2不成立时,跳出循环继续执行 循环语句。
基于51单片机的流水灯
基于51单片机的流水灯利用51单片机P0口实现8个LED(发光二极管)的流水灯控制。
可以使用Proteus软件进行仿真调试。
1 硬件设计利用单片机的PO口控制8个LED,其电路如下图所示。
在桌面上双击图标,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。
单击菜单命令“文件”→“新建设计”,选择DEFAULT模板,保存文件名为“LSD.DSN”。
在器件选择按钮中单击“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表所示都可以不画,它们都是默认的。
在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER和GROUND放置电源和地。
放置好元件后,布好线。
左键双击各元件,设置相应元件参数,完成电路图的设计。
2 软件设计流水灯又称为跑马灯,在函数中可以将P0口的八种不同状态做成一维数组,循环执行即可,如下所示。
当然也可以采用其它函授来实现,如左移一位<<1(或右移一位>>1),循环左移函授_crol_(或循环右移函授_cror_)等。
/****************************************************************** 流水灯*******************************************************************/ #include "reg51.h"const tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};void delayms(unsigned int x) //延时{unsigned int j;unsigned char k;for(j=0;j<x;j++){for(k=0;k<120;k++);}}void main(){unsigned char k;while(1){for(k=1;k<8;k++){P0=tab[k];delayms(500);}}}打开Keil程序(本人使用的是Keil8.05中文版),执行菜单命令“工程”→“新建工程”创建“流水灯”项目,并选择单片机型号为AT89C51。
51单片机爱心流水灯原理及制作
电路原理图:原件清单:1、51单片机x1、40Pin 座x12、LED x32(建议用5mm 七彩的)3、电阻470Ωx334、晶振12MHz x15、10uf 电解电容x1、谐振瓷片电容30pf x26·其他的可以看自己的爱好去加7、其实也可以不用那么多的电阻,用几个排阻就OK了。
~效果展示:作品程序:#include<>#define uchar unsigned char;uchar flag=200;///////////////////////////////////////////////////////////////////////uchar code Tab1[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xFF};//暗中左移向下uchar code Tab2[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF};//暗中右移向上uchar code Tab3[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00};//亮中左移向下uchar code Tab4[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x00};//亮中右移向上uchar code Tab11[]={0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0xff};//暗中左移向下uchar code Tab22[]={0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,0xff};////////////////////////////////////////////////////////////////////uchar code Tab33[]={0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF};;uchar code Tab44[]={0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};uchar code Tab55[]={0x08,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff};uchar code Tab5[]={0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xff};uchar code Tab6[]={0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xff}; uchar code Tab7[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; uchar code Tab8[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};////////////////////////////////////////////////////////////////void shansuo();void xl();///////////////////////////////////////////////////////////////}void delay(void){unsigned char m,n;for(m=0;m<flag;m++)for(n=0;n<250;n++);}///////////////////////////////////void hy1(void) //点亮状态逆时针旋转90度(一个一个灭){.unsigned char i;for(i=0;i<8;i++){P0=Tab11[i];P1=Tab22[i];P2=Tab11[i];P3=Tab22[i];delay();}for(i=0;i<8;i++){P0=Tab44[i];P1=Tab55[i];!P2=Tab44[i];P3=Tab55[i];delay();}}///////////////////////////////////////////void hy2(void) //暗中逆时针转360。
51单片机经典流水灯程序
mov r3,#20 ;最外层循环二十次
ACALL DELAY
CLR P1.5
ACALL DELAY
CLR P1.5
ACALL DELAY
CLR P1.0
ACALL DELAY
SETB P1.0
ACALL DELAY
CLR P1.1
ACALL DELAY
SETB P1.1
ACALL DELAY
CLR P1.2
ACALL DELAY
SETB P1.2
DJNZ R7,D1 ;D1循环执行R7次
RET ;返回主程序
END ;结束程序
开关控制的单片机流水灯 汇编
在单片机控制下,用一个拨动开关K1,控制8个发光二极管L1-L8,发光的时间间隔为0.5秒。
具体要求:
当拨动开关K1发出低电平(K1=0)时,L1-L8从两头向中间逐个点亮,当L1-L8全部点亮后延时2秒钟全部熄灭,如此往复循环。
ACALL DELAY
CLR P1.4
ACALL DELAY
SETB P1.4
ACALL DELAY
CLR P1.5
ACALL DELAY
SETB P1.5
ACALL DELAY
CLR P1.6
ACALL DELAY
CLR P1.6
ACALL DELAY
CLR P1.0
ACALL DELAY
SETB P1.0
ACALL DELAY
CLR P1.2
ACALL DELAY
CLR P1.2
ACALL DELAY
CLR P1.0
ACALL DELAY
SETB P1.0
ACALL DELAY
51单片机-流水灯
51单片机-流水灯
1.概述
在51单片机的P2口接上8个发光二极管,通过汇编语言使其产生流水灯的移动效果。
2.功能
八个灯产生左移(右移)效果。
3.器件
51单片机(1个)、LED灯(9个)、CRYSTAL晶振(1个)、电容(3个)、电阻(10个)、开关(1个)、导线若干。
4.原理图及实物图
焊接图(背面)
图中参数:
12345678220R R R R R R R R ========Ω
9220R =Ω
1010R K =Ω
1230C C pF ==
310C F
μ=
5.主程序
ORG 0 ;程序从0地址开始START:
MOV A,#0FEH ;让ACC的内容为11111110 LOOP: MOV P2,A ;让P2口输出ACC的内容
RR A ;让ACC的内容右移
CALL DELAY ;调用延时子程序
LJMP LOOP ;跳到LOOP处执行
;0.1秒延时子程序(12MHz晶振)DELAY: MOV R7,#200 ;R7寄存器加载200次数
D1: MOV R6,#250 ;R6寄存器加载250次数
DJNZ R6,$ ;本行执行R6次
DJNZ R7,D1 ;D1循环执行R7次
RET ;返回主程序
END ;结束程序。
51单片机项目教程项目 4 流水灯实验
4.3 项目实施
4.3.1 流水灯开发实战环节
注意:J1接上才能开始做流水灯模块实验
图4- 6流水灯实物结果
实现延时通常有两种方法:一种是硬件延时,要用到定时器 /计数器,这种方法可以 提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用 循环体进行。
2、编写精确的延时函数 1)使用定时器/计数器实现精确延时
2)软件延时与时间计算
在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延 时。下面介绍几种软件延时的方法。 2.1 短暂延时 2.2 在C51中嵌套汇编程序段实现延时 2.3 使用示波器确定延时时间 2.4 使用反汇编工具计算延时时间
(216-初值)×振荡周期×12
例如:若晶振频率为12MHz,则最长的定时时间为(2160)×(1/12)×12us=65.536ms
4.2 技术准备
3. 方式2 THx作为常数缓冲器,当TLx计数溢出时,在置“1”溢出标志TFx 的同时,还自动的将THx中的初值送至TLx,使TLx从初值开始重新计 数。 其定时时间为:
例如:机器时钟频率为12MHZ,机器周期为1μs 时,
若工作在模式0,则最大定时值为:213×1μs =8.192ms 若工作在模式1,则最大定时值为: 216×1μs =65.536ms (2)置定时/计数器初值,直接将初值写入寄存器的TH0、TL0或TH1、TL1;
(3)对TCON寄存器中的TR0或TR1置位,启动定时/计数器,置位以后,计数器 即按规定的工作模式和初值进行计数或开始定时。
4.2 技术准备
4.2.7定时器编程步骤 MCS-51单片机的定时器/计数器是可编程的,具体步骤如下: (1)对TMOD赋值,以确定定时器的工作模式; 初值计算: 设计数器的最大值为M,则置入的初值X为: 计数方式:X=M-计数值 定时方式:由(M-X)T=定时值,得X=M-定时值/T T为计数周期,是单片机的机器周期。 (模式0: M为213=8192 ,模式1: M为216=65536,模式2和3: M为28=256)
51单片机爱心流水灯原理及制作
uchar flag=200;
///////////////////////////////////////////////////////////////////////
uchar code Tab1[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xFF};//暗中左移向下
电路原理图:
原件清单:
1、51单片机x1、40Pin座x1
2、LED x32(建议用5mm七彩的)
3、电阻470Ωx33
4、晶振12MHz x1
5、10uf电解电容x1、谐振瓷片电容30pf x2
6·其他的可以看自己的爱好去加
7、其实也可以不用那么多的电阻,用几个排阻就OK了。
效果展示:
作品程序:
#include<reg52.h>
void delay(void)
{
unsigned char m,n;
for(m=0;m<flag;m++)
for(n=0;n<250;n++)
;
}
///////////////////////////////////
void hy1(void) //点亮状态逆时针旋转90度(一个一个灭)
{
unsigned char i;
void hy3(void) //点亮中逆时针转360°(一个一个灭)
{
unsigned char i;
flag=50;
P0=0x00;P1=0x00;P2=0x00;P3=0x00;
for(i=0;i<8;i++)
51单片机最小系统流水灯
51单片机最小系统流水灯按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。
AT89C51单片机是美国ATMEL公司生产的低电压、高性能CMOS 8位单片机,具有丰富的内部资源:4kB闪存、128BRAM、32根I/O口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.25~5.50V的电压工作范围和0~24MHz 工作频率,使用AT89C51单片机时无须外扩存储器。
因此,本流水灯实际上就是一个带有八个发光二极管的单片机最小应用系统,即为由发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。
其具体硬件组成如图1所示。
图1 流水灯硬件原理图从原理图中可以看出,如果要让接在P1.0口的LED1亮起来,那么只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平;同理,接在P1.1~P1.7口的其他7个LED的点亮和熄灭的方法同LED1。
因此,要实现流水灯功能,我们只要将发光二极管LED1~LED8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。
在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。
光控电子开关,它的“开”和“关”是靠可控硅的导通和阻断来实现的,而可控硅的导通和阻断又是受自然光的亮度(或人为亮度)的大小所控制的。
该装置适合作为街道、宿舍走廊或其它公共场所照明灯,起到日熄夜亮的控制作用,以节约用电。
工作原理电路如上图所示,220V交流电通过灯泡H及整流全桥后,变成直流脉动电压,作为正向偏压,加在可控硅VS及R支路上。
白天,亮度大于一定程度时,光敏二极管D呈现底阻状态≤1KΩ,使三极管V截止,其发射极无电流输出,单向可控硅VS因无触发电流而阻断。
此时流过灯泡H的电流≤2.2mA,灯泡H不能发光。
51单片机经典流水灯程序
单片机流水灯汇编程序设计开发板上的8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。
程序A:;用最直接的方式实现流水灯ORG 0000HSTART:MOV P1,#B ;最下面的LED点亮LCALL DELAY;延时1秒MOV P1,#B ;最下面第二个的LED点亮LCALL DELAY;延时1秒MOV P1,#B ;最下面第三个的LED点亮(以下省略)LCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#B ;完成第一次循环点亮,延时约0.25秒AJMP START ;反复循环;延时子程序,12M晶振延时约250毫秒DELAY:MOV R4,#2L3: MOV R2 ,#250L1: MOV R3 ,#250L2: DJNZ R3 ,L2DJNZ R2 ,L1DJNZ R4 ,L3RETEND程序B:;用移位方式实现流水灯ajmp main ;跳转到主程序org 0030h ;主程序起始地址main:mov a,#0feh ;给A赋值成loop:mov p1,a ;将A送到P1口,发光二极管低电平点亮lcall delay ;调用延时子程序rl a ;累加器A循环左移一位ajmp loop ;重新送P1显示delay:mov r3,#20 ;最外层循环二十次d1:mov r4,#80 ;次外层循环八十次d2:mov r5,#250 ;最内层循环250次djnz r5,$ ;总共延时2us*250*80*20=0.8Sdjnz r4,d2djnz r3,d1retend51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。
ORG 0;程序从0地址开始START: MOV A,#0FEH ;让ACC的内容为LOOP: MOV P2,A ;让P2口输出ACC的内容RR A;让ACC的内容左移CALL DELAY ;调用延时子程序LJMP LOOP ;跳到LOOP处执行;0.1秒延时子程序(12MHz晶振)===================DELAY: MOV R7,#200 ;R7寄存器加载200次数D1: MOV R6,#250 ;R6寄存器加载250次数DJNZ R6,$ ;本行执RET;返回主程序END;结束程序开关控制的单片机流水灯汇编在单片机控制下,用一个拨动开关K1,控制8个发光二极管L1-L8,发光的时间间隔为0.5秒。
51单片机控制流水灯和数码管【精选】
流水灯的操作
2013.03.22
• 点亮第一个灯; • 让第一个灯闪烁; • 从第一个灯依次点亮至最后一个灯;Fra bibliotek动态显示
动态显示的特点是将所有位数码管的段选线并 联在一起,由位选线控制是哪一位数码管有效。选 亮数码管采用动态扫描显示。所谓动态扫描显示即 轮流向各位数码管送出字形码和相应的位选,利用 发光管的余辉和人眼视觉暂留作用,使人的感觉好 像各位数码管同时都在显示。动态显示的亮度比静 态显示要差一些,所以在选择限流电阻时应略小于 静态显示电路中的。
C语言中的<<和>>
• 每执行一次<<操作,被操作数高位数丢失, 低位补零;
C语言中的<<和>>
• 每执行一次<<操作,被操作数低位数丢失, 高位补零;
任务
• 第一次一个管亮流动一次,第二次两个管 亮流动,依次到8个管亮,然后重复整个过 程。
• 先奇数亮再偶数亮,循环三次;一个灯上 下循环三次;两个分别从两边往中间流动 三次;再从中间往两边流动三次;8个全部 闪烁3次;关闭发光管,程序停止。
• 用8个发光管演示出8位二进制数累加过程。
呼吸灯的操作
• 灯光在微电脑控制之下完成由亮到暗的逐 渐变化,感觉像是在呼吸。
• 实现灯不同亮度的两种方法: 1 调节灯的保护电阻, 2 使用PWM。
数码管的操作
• 数码管的介绍 • 数码管的操作
g f GNDa b a
a
b
51单片机常见的五种流水灯编写方式
For personal use only in study and research; not for commercial use51单片机常见的五种流水灯编写方式通过改变赋值实现流水灯void main(){while(1){P2=0xfe;delay1ms(500);P2=0xfd;delay1ms(500);P2=0xfb;delay1ms(500);P2=0xf7;delay1ms(500);P2=0xef;delay1ms(500);P2=0xdf;delay1ms(500);P2=0xbf;delay1ms(500);P2=0x7f;delay1ms(500);}}通过公式运算实现流水灯void main(){while(1){uint a,b=1;P2=0xfe;delayms(500);for(a=0;a<7;a++){P2-=b; // P2=P2-bdelayms(500);b=b*2; //都化为同一类型进制运算}}}通过操作符<<与“|”实现流水灯(通过移位实现流水灯)void main(){uchar a,i;while(1){a=0xfe; //点亮第一位LED灯for(i=0;i<8;i++){P2=a;a=a<<1; //左移一位a=a|0x01; //左移一位后与0x01相或,保证左移后最低位为1 delay_ms(500);}}}通过库函数_crol_(字符左移)实现流水灯void main(){uint a;a=0xfe;while(1){P2=a;a=_crol_(a,1);delay_ms(500);}}采用数组实现流水灯uchar code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};void main(void){uchar i;while (1){for(i=0;i<8;i++) //循环点亮8只LED灯{P2=table[i];delay_ms(500); //延时500毫秒}}}For personal use only in study and research; not for commercial use.Nur für den persönlichen für Studien, Forschung, zu kommerziellen Zwecken verwendet werden.Pour l 'étude et la recherche uniquement à des fins personnelles; pas à des fins commerciales.толькодля людей, которые используются для обучения, исследований и не должны использоваться в коммерческих целях.以下无正文For personal use only in study and research; not for commercial use.Nur für den persönlichen für Studien, Forschung, zu kommerziellen Zwecken verwendet werden.Pour l 'étude et la recherche uniquement à des fins personnelles; pas à des fins commerciales.толькодля людей, которые используются для обучения, исследований и не должны использоваться в коммерческих целях.以下无正文。
51单片机 流水灯 中断
//51单片机控制8个LED灯,左右循环移动,当外部中断0引脚的按键,第一次按下时,停在当前位置;第二次按下时,继续向下执行//***************************************************************************** *****************************************//注释:当主函数中在执行左右流水点亮LED灯的时候,按键按下(这是第一次按下,即奇数次),CPU暂时//中断当前点亮灯的工作,转去处理中断程序(c=1),处理完后,再返回原来中断的地方继续原来的工作,//因为这时候C为1,while(c);为真,为死循环状态,即是LED亮的状态停在当前位置;当按键按下(这是第二次按下,即偶数次)//CPU中断当前状态,转去处理中断程序(c=0),处理完后,再返回原来中断的地方继续原来的工作,//这时候C为0,while(c);为假,则程序继续向下执行。
//***************************************************************************** ******************************************#include<reg51.h>#include<intrins.h>//控制左右移的头文件void delay(int);//声明延时函数unsigned char i=0,a=0,b=0,c=0;//a为判断按键按下时奇数次还是偶数次void main(){P2=0xfe;IT0=0;// 低电平有效EX0=1;//开外部中断0EA=1; //开总中断while(1){for(i=0;i<7;i++)//左循环{b=1;while(c);//C为0时,顺序向下执行,为1时停在当前状态,P2=_crol_(P2,1);delay(500);}for(i=0;i<7;i++)//右循环{b=1;while(c);//C为0时,顺序向下执行,为1时停在当前状态,P2=_cror_(P2,1);delay(500);}}while(1);//等待中断}void int0_int(void) interrupt 0 //中断服务函数{delay(40);//延时一段时间,消除抖动if(b==1){b=0;a+=1;//按键为奇数次时,停在当前的状态;偶数次时,接着原来的状态继续往下执行if(a%2)c=1;elsec=0;}}void delay(int n)//延时函数{unsigned int i,j;for(i=0;i<n;i++)for(j=0;j<50;j++);}。
基于51单片机的心形流水灯
基于51单片机的心形流水灯视频地址/v_show/id_XNDgzNDI4NjQ4.html新手焊接、技术有限。
振荡电路藏于单片机下。
30个led灯并联未加电阻。
供电采用移动电源内置的锂电池从生日蜡烛上拆下来的电路。
共用一个开关。
附源程序:C语言#include<reg52.h>unsigned int x,y;void delayms(unsigned int z) //延时程序{unsigned int i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}/*----------------------------------------------------------*/ void Offall() //开启所有灯{P0=0x00;P1=0x00;P2=0x00;P3=0x00;}/*----------------------------------------------------------*/void Onall()//关闭所有灯{P0=0xff;P1=0xff;P2=0xff;P3=0xff;}/*----------------------------------------------------------*/ void ls()//等时流水灯{P0=0x00;P0=0x01;delayms(50);P0=0x02;delayms(50);P0=0x04;delayms(50) ;P0=0x08;delayms(50) ;P0=0x10;delayms(50) ;P0=0x20;P0=0x40; delayms(50) ;P0=0x80; delayms(50);P0=0x00;P2=0x00;P2=0x80; delayms(50) ; P2=0x40; delayms(50);P2=0x20; delayms(50) ; P2=0x10; delayms(50) ; P2=0x08; delayms(50) ; P2=0x04; delayms(50);P2=0x02; delayms(50) ;P2=0x01;P2=0x00;P3=0x00;P3=0x80; delayms(50) ; P3=0x40; delayms(50); P3=0x20; delayms(50) ; P3=0x10; delayms(50) ; P3=0x08; delayms(50) ; P3=0x04; delayms(50);P3=0x02; delayms(50) ;P3=0x01; delayms(50);P3=0x00;P1=0x00;P1=0x80;delayms(50) ;P1=0x40;delayms(50);P1=0x20;delayms(50) ;P1=0x10;delayms(50) ;P1=0x08;delayms(50) ;P1=0x04;delayms(50);P1=0x02;delayms(50) ;P1=0x01;delayms(50);P1=0x00;P0=0x01;delayms(50);P0=0x00;}/*----------------------------------------------------------*/ void fxls()//反向等时流水灯{P0=0x00;P0=0x01;delayms(50);P0=0x00;P1=0x00;P1=0x01;delayms(50);P1=0x02;delayms(50);P1=0x04;delayms(50);P1=0x08;delayms(50);P1=0x10;delayms(50);P1=0x20;delayms(50);P1=0x40;delayms(50);P1=0x80;delayms(50);P1=0x00; P3=0x00;P3=0x01;delayms(50);P3=0x02;delayms(50);P3=0x04;delayms(50);P3=0x08;delayms(50);P3=0x10;delayms(50);P3=0x20;delayms(50);P3=0x40;delayms(50);P3=0x80;delayms(50);P3=0x00;P2=0x00;P2=0x01;delayms(50);P2=0x02;delayms(50);P2=0x04;delayms(50);P2=0x08;delayms(50);P2=0x10;delayms(50);P2=0x20;delayms(50);P2=0x40;delayms(50);P2=0x80;delayms(50);P2=0x00;P0=0x00;P0=0x80;delayms(50);P0=0x40;delayms(50);P0=0x20;delayms(50);P0=0x10;delayms(50);P0=0x08;delayms(50);P0=0x04;delayms(50);P0=0x02;delayms(50);P0=0x01;delayms(50);P0=0x00;}/*----------------------------------------------------------*/void bsb()//半双边流水由上至下{Offall();P0=0x01;delayms(50);P0=0x02;P1=0x01;delayms(50);P0=0x04;P1=0x02;delayms(50);P0=0x08;P1=0x04;delayms(50);P0=0x10;P1=0x08;delayms(50);P0=0x20;P1=0x10;delayms(50);P0=0x40;P1=0x20;delayms(50);P0=0x80;P1=0x40;delayms(50);P0=0x00; P2=0x80;P1=0x80;delayms(50);P1=0x00; P2=0x40;P3=0x01;delayms(50);P2=0x20;P3=0x02;delayms(50);P2=0x10;P3=0x04;delayms(50);P2=0x08;P3=0x08;delayms(50);P2=0x04;P3=0x10;delayms(50);P2=0x02;P3=0x20;delayms(50);P2=0x01;P3=0x40;delayms(50);Offall(); P3=0x80;delayms(50);Offall();}/*----------------------------------------------------------*/ void fbsb() //半双边流水由下至上{Offall();P3=0x80;delayms(50);P2=0x01;P3=0x40;delayms(50);P2=0x02;P3=0x20;delayms(50);P2=0x04;P3=0x10;delayms(50);P2=0x08;P3=0x08;delayms(50);P2=0x10;P3=0x04;delayms(50);P2=0x20;P3=0x02;delayms(50);P2=0x40;P3=0x01;delayms(50);Offall();P2=0x80;P1=80;delayms(50);Offall();P0=0x80;P1=0x40;delayms(50);P0=0x40;P1=0x20;delayms(50);P0=0x20;P1=0x10;delayms(50);P0=0x10;P1=0x08;delayms(50);P0=0x08;P1=0x04;delayms(50);P0=0x04;P1=0x02;delayms(50);P0=0x02;P1=0x01;delayms(50);Offall();P0=0x01;Offall();}void zxsz() //正向生长{Offall();P0=0x01;delayms(50);P0=0x03;delayms(50);P0=0x07;delayms(50);P0=0x0f;delayms(50);P0=0x1f;delayms(50);P0=0x3f;delayms(50);P0=0x7f;delayms(50);P0=0xff;delayms(50);P2=0x80;delayms(50);P2=0xc0;delayms(50);P2=0xe0;delayms(50);P2=0xf0;delayms(50);P2=0xf8;delayms(50);P2=0xfc;delayms(50);P2=0xfe;delayms(50);P2=0xff;delayms(50);P3=0x80;delayms(50);P3=0xc0;delayms(50);P3=0xe0;delayms(50);P3=0xf8;delayms(50);P3=0xfc;delayms(50);P3=0xfe;delayms(50);P3=0xff;delayms(50);P1=0x80;delayms(50);P1=0xc0;delayms(50);P1=0xe0;delayms(50);P1=0xf0;delayms(50);P1=0xf8;delayms(50);P1=0xfc;delayms(50);P1=0xfe;delayms(50);P1=0xff;delayms(50);}/*----------------------------------------------------------*/void fxsz() //反向生长{Offall();P0=0x01;delayms(50);P1=0x01;delayms(50);P1=0x07;delayms(50); P1=0x0f;delayms(50); P1=0x1f;delayms(50); P1=0x3f;delayms(50); P1=0x7f;delayms(50); P1=0xff;delayms(50); P3=0x01;delayms(50); P3=0x03;delayms(50); P3=0x07;delayms(50); P3=0x0f;delayms(50); P3=0x1f;delayms(50); P3=0x3f;delayms(50); P3=0x7f;delayms(50); P3=0xff;delayms(50); P2=0x01;delayms(50); P2=0x03;delayms(50); P2=0x07;delayms(50); P2=0x0f;delayms(50); P2=0x1f;delayms(50); P2=0x3f;delayms(50); P2=0x7f;delayms(50);P0=0x81;delayms(50);P0=0xc1;delayms(50);P0=0xe1;delayms(50);P0=0xf1;delayms(50);P0=0xf9;delayms(50);P0=0xfd;delayms(50);P0=0xff;delayms(50);}/*----------------------------------------------------------*/ void zxsw() //正向死亡{Onall();P0=0xfd;delayms(50);P0=0xf9;delayms(50);P0=0xf1;delayms(50);P0=0xf0;delayms(50);P0=0xe1;delayms(50);P0=0xc1;delayms(50);P0=0x01;delayms(50); P2=0x7f;delayms(50); P2=0x3f;delayms(50); P2=0x1f;delayms(50); P2=0x0f;delayms(50); P2=0x07;delayms(50); P2=0x03;delayms(50); P2=0x01;delayms(50); P2=0x00;delayms(50); P3=0x7f;delayms(50); P3=0x3f;delayms(50); P3=0x1f;delayms(50); P3=0x0f;delayms(50); P3=0x07;delayms(50); P3=0x03;delayms(50); P3=0x01;delayms(50); P3=0x00;delayms(50); P1=0x7f;delayms(50); P1=0x3f;delayms(50); P1=0x1f;delayms(50); P1=0x0f;delayms(50);P1=0x03;delayms(50);P1=0x01;delayms(50);P1=0x00;delayms(50);P0=0x00;delayms(50);}/*----------------------------------------------------------*/void fxsw() //反向死亡{Onall();P1=0xfe;delayms(50);P1=0xfc;delayms(50);P1=0xf8;delayms(50);P1=0xf0;delayms(50);P1=0xe0;delayms(50);P1=0xc0;delayms(50);P1=0x80;delayms(50);P3=0xfe;delayms(50); P3=0xfc;delayms(50); P3=0xf8;delayms(50); P3=0xf0;delayms(50); P3=0xe0;delayms(50); P3=0xc0;delayms(50); P3=0x80;delayms(50); P3=0x00;delayms(50); P2=0xfe;delayms(50); P2=0xfc;delayms(50); P2=0xf8;delayms(50); P2=0xf0;delayms(50); P2=0xe0;delayms(50); P2=0xc0;delayms(50); P2=0x80;delayms(50); P2=0x00;delayms(50); P0=0x7f;delayms(50); P0=0x3f;delayms(50); P0=0x1f;delayms(50); P0=0x0f;delayms(50); P0=0x07;delayms(50);P0=0x01;delayms(50);P0=0x00;delayms(50);}/*----------------------------------------------------------*/void bbs()//半边交替闪{Offall();P0=0x00;P2=0xff;P3=0x80;delayms(200);Offall(); P0=0xfe;P1=0xff;P3=0xff;delayms(200);}/*----------------------------------------------------------*/void sxs()//上下交替闪{Offall();P1=0xff;P0=0x00;P2=0x80;delayms(200);Offall();P2=0x7f;P3=0xff;delayms(200);}void cx() //出现一点点{Offall();delayms(1000);P0=0x00;P2=0x00;P1=0x40;P3=0x00;delayms(1000); P0=0x20;P2=0x40;P1=0x40;P3=0x00;delayms(1000); P0=0x24;P2=0x42;P1=0x40;P3=0x04;delayms(1000); P0=0xa6;P2=0x5a;P1=0x52;P3=0x65;delayms(1000); P0=0xee;P2=0xdf;P1=0xdb;P3=0xef; delayms(1000); P0=0xff;P2=0xff;P1=0xff;P3=0xff;delayms(1000); }void xs() //一点点消失{Onall();delayms(1000);P0=0xee;P2=0xdf;P1=0xdb;P3=0xef; delayms(1000);P0=0xa6;P2=0x5a;P1=0x52;P3=0x65;delayms(1000);P0=0x24;P2=0x42;P1=0x40;P3=0x04;delayms(1000);P0=0x20;P2=0x40;P1=0x40;P3=0x00;delayms(1000);P0=0x00;P2=0x00;P1=0x40;P3=0x00;delayms(1000);Offal l();delayms(1000);}void main(){Onall();delayms(1000);Offall();delayms(1000);cx();//一点点出现xs();zxsw();/* 正向死亡*/ls(); /* 正向流水*/zxsz();/* 正向生长*/zxsw(); /* 正向死亡*/fxsz();/* 反向生长*/fxsw(); /* 反向死亡*/fxls(); /* 反向流水*/bsb(); /* 半双边流水由上至下*/ fbsb();/* 半双边流水由下至上*/ sxs();bbs();}版权所有:山东科技大学信息与电气工程学院电气信息类2012级14班ssk。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
班级:100712
姓名:全建冲
学号:10071047
一、
用51单片机设计一个流水灯的控制方案,要求采用定时器定时,利用中断法控制流水灯的亮灭,画出电路图和程序流程图,写出程序代码以及代码注释。
二、
原理图分析:
本原理图采用STC89S52单片机控制8个LED灯,其中8个LED灯的负极接单片机的P1端口,正极通过1KΩ排阻连接到电源上。原理图中还给出了晶振与复位端,以保证控制器的稳定工作。
三、
N
Y
N
Y
四、
1.
#include<reg52.h>
#include<intrins.h>//包含了_crol_函数的头文件
#define ucharunsigned char
#define uint unsigned int
uint i=0;
uchar a=0xfe;
void main()
{
TMOD=0x01;//设置工作方式为定时器0,16位手动重装初值
if(i==10)//500毫秒定时
{
i=0;
P1=a;//P1端口赋值
aቤተ መጻሕፍቲ ባይዱ_crol_(a,1);//循环左移
}
TF=0;//清除定时器溢出标志
}
}
}
程序分析:本程序采用非中断定时器法控制流水灯,核心语句在于读取标志位TF位,TF为定时器溢出标志位,溢出时硬件自动置一,所以循环读取标志位以判断定时器是否溢出,而每次溢出需要手动清零,否则定时器无法再次溢出,利用标志i读取10次即可达到500毫秒的定时。另外需要注意的是单片机晶振为11.0592MHz,所以计时一个数的时间为12/11.0592=1.085us,故定时50毫秒的计数为50000/1.085=46080。
TH0=(65536-46080)/256;//50毫秒定时赋初值
TL0=(65536-46080)%256;
TR0=1;//启动定时器0
while(1)
{
If(TF==1)//读溢出标志位
{
TH0=(65536-46080)/256;//重新赋初值
TL0=(65536-46080)%256;
i++;