时钟程序基本走时功能加流水灯
五种编程方式实现流水灯的单片机C程序

五种编程方式实现流水灯的单片机C程序流水灯是一种常见的灯光效果,常用于装饰和展示。
实现流水灯的程序可以使用多种不同的编程方式,包括传统的顺序编程、状态机编程、中断编程、调度器编程和面向对象编程。
下面分别介绍这五种方式实现流水灯的程序。
1.顺序编程方式:顺序编程是最常见的编程方式,也是最直接的方式。
下面是使用顺序编程方式实现流水灯的C程序:```c#include <reg52.h>void delay(unsigned int t)while(t--)for(int i=0; i<50; i++);}void mainunsigned char led = 0x80; // 初始灯光状态while(1)P0 = led; // 输出灯光状态delay(500); // 延时一段时间led >>= 1; // 右移一位,实现流水灯效果if(led == 0) // 到达最右边后重新开始led = 0x80;}}```2.状态机编程方式:状态机编程是一种基于状态的编程方式,通过定义不同的状态和状态转换来实现流水灯效果。
下面是使用状态机编程方式实现流水灯的C程序:```c#include <reg52.h>typedef enumState1,State2,State3,State4,State5} State;void delay(unsigned int t)while(t--)for(int i=0; i<50; i++);}void mainState state = State1; // 初始状态为State1 while(1)switch(state)case State1:P0=0x80;delay(500);state = State2;break;case State2:P0=0x40;delay(500);state = State3;break;case State3:P0=0x20;delay(500);state = State4;break;case State4:P0=0x10;delay(500);state = State5;break;case State5:P0=0x08;delay(500);state = State1;break;}}```3.中断编程方式:中断编程方式是一种基于中断事件的编程方式,通过在特定的中断事件触发时改变灯光状态来实现流水灯效果。
流水灯实验原理

流水灯实验原理
流水灯实验是一种常见的电子原型实验,其原理是利用计时器和移位寄存器来控制一组LED灯的亮灭状态,实现灯光顺序
循环变化的效果。
在流水灯实验中,LED灯的亮灭状态是由移位寄存器控制的。
移位寄存器是一个存储二进制数据的器件,它具有将数据从一个位置移动到另一个位置的功能。
通过这种移位操作,可以实现LED灯的顺序变化。
将多个LED灯连接到移位寄存器的输出引脚上,然后将计时
器的时钟信号连接到移位寄存器的时钟输入引脚上。
计时器的时钟信号用于触发移位寄存器的移位操作。
当计时器的时钟信号输入时,移位寄存器会将存储在其中的数据向移位方向移动一位。
移动之后,每个LED灯的状态就发
生了变化,从而实现了灯光顺序的循环变化。
为了控制LED灯的亮灭状态,可以使用二进制计数器作为移
位寄存器的输入。
二进制计数器的输出可以连接到LED灯的
输入引脚上,根据计数器的计数值决定LED灯的亮灭状态。
通过调节计时器的时钟频率和移位寄存器的移位方式,可以实现不同的流水灯效果。
例如,可以设置较快的时钟频率和循环移位的方式,使LED灯的亮灭状态快速顺序变化;或者设置
较慢的时钟频率和单向移位的方式,使LED灯的亮灭状态缓
慢顺序变化。
通过流水灯实验,可以更好地理解计时器、移位寄存器和LED灯的工作原理,同时也能够培养学生的实验操作能力和创新思维。
流水灯程序

图1流水灯硬件原理图从原理图中可以看出,假如要让接在PLO 口的LEDI 亮起来,那么只要把 P1.0口的电平变为低电平就可以了;相反,假如要接在PLO 口的LEDl 熄灭,就 要把PLO 口的电平变为高电平洞理,接在P1.1~PL7 口的其他7个LED 的点 亮和熄灭的方法同LED1。
因此,要实现流水灯功能,我们只要将发光二极管 LED1-LED8依次点亮、熄灭,8只LED 灯便会一亮一暗的做流水灯了。
在此 我们还应留意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很 短,我们在掌握二极管亮灭的时候应当延时一段时间,否则我们就看不到“流水” 效果了。
3.软件编程单片机的应用系统由硬件和软件组成,上述硬件原理图搭建完成上电之后, 我们还不能看到流水灯循环点亮的现象,我们还需要告知单片机怎么来进行工PlO POO Pll POl PlJ POi PlJ P03 Pl* PO* P15 PO 5 Pl 3PO 4 P17 λ!SS>C51POT am PJO nττoPnP22 Il pn IO P” P25 I∑∖T> PY P27Xl X :XXD!XD KD ALEP TlPSHT∖n47Kx8VCCLEDl-M —LED)W LED)LED1 W * LEDS人KLEDj WLED7W-44LEDS-M作,即编写程序掌握单片机管脚电平的凹凸变化,来实现发光二极管的一亮一灭。
软件编程是单片机应用系统中的一个重要的组成部分,是单片机学习的重点和难点。
下面我们以最简洁的流水灯掌握功能即实现8个LED灯的循环点亮,来介绍实现流水灯掌握的几种软件编程方法。
3.1位控法这是一种比较笨但又最易理解的方法,采纳挨次程序结构,用位指令掌握Pl 口的每一个位输出凹凸电平,从而来掌握相应LED灯的亮灭。
程序如下:ORG OOOOH ;单片机上电后从0000H地址执行AJMPSTART ;跳转到主程序存放地址处ORG 0030H ;设置主程序开头地址START : MOV SP , #60H ;设置堆栈起始地址为60HCLRPl.0;PLO输出低电平,使LEDl点亮ACALL DELAY ;调用延时子程序SETB P1.0;P1.0输出高电平,使LEDl熄灭CLR Pl.l ;P1.1输出低电平,使LED2点亮ACALL DELAY ;调用延时子程序SETB Pl.l ;P1.1输出高电平,使LED2熄灭CLR P1.2;P1.2输出低电平,使LED3点亮ACALL DELAY ;调用延时子程序SETB P1.2;P1.2输出高电平,使LED3熄灭CLR P1.3 ;P1.3输出低电平,使LED4点亮ACALL DELAY ;调用延时子程序SETB P1.3;P1.3输出高电平,使LED4熄灭CLR Pl.4 ;P1.4输出低电平,使LED5点亮ACALL DELAY ;调用延时子程序SETB P1.4;P1.4输出高电平,使LED5熄灭CLR P1.5;P1.5输出低电平,使LED6点亮ACALL DELAY ;调用延时子程序SETB P1.5;P1.5输出高电平,使LED6熄灭CLR P1.6 ;P1.6输出低电平,使LED7点亮ACALL DELAY ;调用延时子程序CLR P1.7 ;P1.7输出低电平,使LED8点亮ACALL DELAY ;调用延时子程序SETB P1.7pl.7输出高电平,使LED8熄灭ACALL DELAY ;调用延时子程序START ;8个LED流了一遍后返回到标号START处再循环AJMPDELAY :;延时子程序MOV RO , #255 ;延时一段时间Dl : MOV Rl , #255DJNZRl , $DJNZ RO , DlRET ;子程序返回END ;程序结束3.2循环移位法在上个程序中我们是逐个掌握Pl端口的每个位来实现的,因此程序显得有点简单,下面我们采用循环移位指令,采纳循环程序结构进行编程。
流水灯时钟电路工作原理

流水灯时钟电路工作原理
流水灯时钟电路主要由以下部分组成:时钟电源、电子时钟芯片、驱动电路、LED灯珠。
1. 时钟电源:提供所需的电源电压和电流,通常使用交流电源转换为恒流恒压的直流电源。
2. 电子时钟芯片:控制时钟的运行和显示,一般采用数字时钟芯片。
它可以接收外部的时间信号,将时间信息转化为特定的电信号发送给驱动电路。
3. 驱动电路:接收电子时钟芯片发送的时间信号,根据信号的不同控制LED灯进行点亮和熄灭。
通常采用二进制计数的方式,通过控制特定的输出端口来控制对应的LED灯珠。
4. LED灯珠:通过驱动电路的控制,实现灯珠的点亮和熄灭。
通常使用共阳极的LED灯珠,每个LED灯代表一个数字或符号。
工作原理如下:
电子时钟芯片接收外部的时间信号,将时间信息转化为特定的二进制信号,通过输出端口发送给驱动电路。
驱动电路根据接收到的信号对应控制LED灯珠的点亮和熄灭,从而显示出当
前的时间。
同时,驱动电路还需要保证时间信息的持续更新,以使流水灯时钟能够实现时间的连续显示。
具体来说,驱动电路中,将得到的二进制信号转换为对应的电
平信号,通过开关控制LED灯珠的通断,实现LED的点亮和熄灭。
根据时间的变化,LED灯珠依次点亮和熄灭,形成流水灯效果。
通过适当的控制和驱动,可以实现对年、月、日、小时、分钟等时间信息的显示。
微机原理流水灯

微机原理流水灯流水灯是一种常见的电子产品,它可以通过不同的灯光组合展示出各种图案和文字。
在微机原理中,流水灯也是一个经典的实验项目,通过学习和掌握流水灯的原理和实现方法,可以帮助我们更好地理解微机原理的相关知识。
首先,我们需要了解流水灯的工作原理。
流水灯通常由多个LED灯组成,这些LED灯按照一定的顺序依次亮起,然后熄灭,再依次亮起,如此循环往复。
这种效果可以通过微机原理中的计时器和计数器来实现。
计时器用来控制LED灯的亮起时间,而计数器则用来控制LED灯的顺序。
通过合理地设计计时器和计数器的工作模式,我们就可以实现流水灯的效果。
接下来,我们来介绍一种常见的流水灯实现方法。
首先,我们需要准备一块开发板,例如51单片机开发板。
然后,我们需要连接数个LED灯到开发板的GPIO口上,并且通过电阻限流,以防止LED 灯烧坏。
接着,我们需要编写相应的程序,通过控制计时器和计数器的工作模式,来实现LED灯的流水灯效果。
最后,将程序下载到开发板上,即可看到LED灯按照预定的顺序依次亮起和熄灭,实现流水灯的效果。
除了这种基于单片机的实现方法,我们还可以利用FPGA来实现流水灯。
FPGA是一种可编程逻辑器件,可以根据我们的设计需求来实现各种逻辑功能。
通过使用FPGA,我们可以更加灵活地设计流水灯的工作模式,实现更加丰富多彩的流水灯效果。
当然,相比于基于单片机的实现方法,利用FPGA来实现流水灯可能需要更多的硬件资源和编程知识,但是它可以实现更加复杂和高级的流水灯效果。
总的来说,微机原理中的流水灯实验项目不仅可以帮助我们更好地理解计时器和计数器的工作原理,还可以培养我们的动手能力和创造力。
通过不断地实践和探索,我们可以设计出各种各样的流水灯效果,甚至可以将其应用到实际的电子产品中。
希望大家在学习微机原理的过程中能够加深对流水灯的理解,同时也能够在实践中不断提升自己的能力。
最后,希望大家能够在微机原理的学习中取得更大的进步,为将来的发展打下坚实的基础。
流水灯及正计时的实现

程序:变量定义
#include<reg52.h> //52单片机头文件 #include <intrins.h> //包含有左右循环移位子函数的库 sbit beep=P0^6; //定义蜂鸣器 sbit key=P3^2; //定义公共端口 bit SecFlag; //中断标志 bit sign; //事先暂停和再次计时功能的标志 bit KeyDownFlg; //按键按下的标志 unsigned char KeyBuff; //扫描按键 unsigned char Count4ms; unsigned char disp_buff[2]; unsigned char disp_cnt; //通过加1扫描数码管 unsigned char P2_buff; //蜂鸣器 unsigned char Beep_cnt; //蜂鸣器鸣响时间计数 unsigned char sec; //定义秒变量 code unsigned char Tab[2]={0xfe,0xfd};//选位 code unsigned char Tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//;数码 管显示字型表
3、LED从中间向两边依次点亮
for(j=0;j<3;j++) //从中间往两边流 { P1=0xe7; //点亮小灯 delay500ms(); //延时500毫秒 P1=0xdb; delay500ms(); //延时500毫秒 P1=0xbd; //点亮小灯 delay500ms(); //延时500毫秒 P1=0x7e; delay500ms(); //延时500毫秒 } P1=0xff;
[详细]Proteus实现纯逻辑数字时钟+流水灯混合电路(无单片机)
![[详细]Proteus实现纯逻辑数字时钟+流水灯混合电路(无单片机)](https://img.taocdn.com/s3/m/22ca2254998fcc22bdd10da3.png)
电工创新设计性实验电子数字时钟一、设计任务与要求1. 信号源电路:利用直流电源和555 定时器设计1Hz 的振荡电路。
需要理解555 定时器的结构与原理。
2. 时钟电路:使用计时器、与门、非门实现60进制和24 进制,并设计调时电路和归零电路。
需要深刻理解计时器和逻辑门的功能。
3. 流水灯电路:利用计时器的38 译码器实现流水灯随时间流动。
需要掌握计时器和38 译码器的原理。
、方案设计与论证(一)方案设计方案一、单片机编程时钟电路方案二、纯逻辑时钟电路(二)方案论证选择方案一、单片机编程时钟电路优点:网络资源多,学习成本低,电路设计简单缺点:需要 C 语言基础方案二、纯逻辑时钟电路优点:成就感高,锻炼主动学习能力缺点:网络资源根本没有,学习时间成本高,电路设计复杂最终选择“方案二”三、单元电路设计、参数计算、元器件的选择信号源电路:振荡电路是数字钟的核心部分,它的频率和稳定性直接关系到表的精度。
因此选择555 定时器构成的多谐振荡器,其中电容C1为47 微法,C2为0.01微法,两个电阻R1=R2=10K欧姆。
此时在电路的输出端就得到了一个周期性的矩形波,其振荡频率为:f=1.43/ [(R1+2R2)C]由公式代入R1,R2和C的值得,f=1Hz。
即其输出频率为1Hz 的矩形波信号。
核心元件:555 定时器,电容,电阻时钟电路:信号源电路提供稳定的频率,使第一个计数器 1 秒加一,并通过一个与门和两个非门连接Q1Q3和MR实现累计10 归零,(用两个非门的目的是为了单向传输,避免电位冲突),通过一个与门连接Q0Q3 和下一个计数器相连实现十进制,同样的道理做出了累计6归零,整体实现60 进制,这样秒钟就做好了,相同的方法做出了分钟,由于小时是24进制,所以累计24 归零需要更改复杂,比较费劲。
归零电路要保证每条连接MR 的线路都是要用非门实现单向信号传输,而不能用二极管。
核心元件:计数器(CLK接受高电平后计数,MR接受高电平后重置计数,Q0-3输出 4 位二进制)38译码器(ABC输入3位二进制,Y0-7对应脚输出低电平,其他输出高电平)非门(输出相反电平)流水灯电路:信号源电路提供稳定的频率,使计数器1秒加一,并通过连接Q3和MR实现累计8 归零,Q0-3连接38 译码器使流水灯与秒钟联动。
几种流水灯程序

几种流水灯程序1. 基础流水灯程序:用来控制1个led灯,使其呈现流水灯的效果,代码如下: int led = 13; // 让led连接到电路的13号引脚void setup(){pinMode(led, OUTPUT); // 设置13号引脚的模式为输出}void loop(){digitalWrite(led, HIGH); // 让led灯亮起来delay(1000); // 等待1秒digitalWrite(led, LOW); // 让led灯熄灭int led1 = 13;int led2 = 12;int led3= 11;int led4 = 10;void setup (){pinMode (led1, OUTPUT);pinMode (led2, OUTPUT);pinMode (led3, OUTPUT);pinMode (led4, OUTPUT);}void loop (){digitalWrite (led1, HIGH);delay (500);digitalWrite (led1, LOW);digitalWrite (led2, HIGH);delay (500);digitalWrite (led2, LOW);digitalWrite (led3, HIGH);delay (500);digitalWrite (led3, LOW);digitalWrite (led4, HIGH);delay (500);digitalWrite (led4, LOW);delay (1000);}3.调节速度的流水灯程序:将第一个流水灯程序增加一个模拟变量,使得可以即时调节灯泡亮度以及闪烁速度,以及可以控制单个led灯或多个led灯,其代码如下:4.设置模式的流水灯程序:将流水灯程序改进,使得应用于不同的场景,可以调节闪烁模式,如快速,慢速,长亮等,其代码如下:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<reg52.h>#include<stdio.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar a;uchar XPOS,YPOS;sbit RS = P2^5; //Pin4sbit RW = P2^6; //Pin5sbit E = P2^7; //Pin6sbit CLK=P3^6; //txdsbit DA TA=P3^5; //RXDsbit SH_LD=P3^7; //sbit buz=P3^4;#define Data P0 //数据端口uchartime,shi,fen,miao,shi11,shi12,fen11,fen12,miao11,miao12,miao1,fen1,shi1,y ue1,r1,nian11,nian12,nian13,nian14,yue,yue11,yue12,r,r11,r12;uchar Time1[]={'0','1','2','3','4','5','6','7','8','9'};uint nian,nian1;/************************************************************* *****//* 函数声明*//************************************************************* *****//******************************************************* ********/void DelayUs(unsigned char us)//delay us{unsigned char uscnt;uscnt=us>>1;/* Crystal frequency in 12MHz*/while(--uscnt);}/******************************************************************/void DelayMs(unsigned char ms)//delay Ms{while(--ms){DelayUs(250);DelayUs(250);DelayUs(250);DelayUs(250);}}void WriteCommand(unsigned char c){DelayMs(5);//short delay before operationE=0;RS=0;RW=0;_nop_();E=1;Data=c;E=0;}/************************************************************* ***/void WriteData(unsigned char c){DelayMs(5); //short delay before operationE=0;RS=1;RW=0;_nop_();E=1;Data=c;E=0;RS=0;}/************************************************************* ********/void ShowChar(unsigned char pos,unsigned char c){unsigned char p;//p=pos+0x80; //是第二行则命令代码高4位为0x8 p=pos;WriteCommand (p);//write commandWriteData (c); //write data}void Writer_zfc(uchar cspos,uchar*s){WriteCommand (cspos);while(*s!='\0'){WriteData (*s);s++;}}void InitLcd(){DelayMs(15);WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x0f); //display mode WriteCommand(0x06); //显示光标移动位置WriteCommand(0x0c); //显示开及光标设置WriteCommand(0x01); //显示清屏}void Wenzi_yiwei(int z){int i;for(i=0;i<z;i++){DelayMs(1000);WriteCommand(0x18);}}void Liushui_d(){P1=_crol_(P1,1);DelayMs(1000);}void initiatejs0(void){time=0;//全局变量随计数器而加一TMOD=0X01;//js0工作于方式一下16位的,外部中断不起作用TH0=0x4b;TL0=0xff;ET0=1;//ET0源允许EA=1;//EA总允许TR0=1;//启动js0}void sufas(uchar shi0)//得到时分秒,各位{shi11=shi0/10;shi12=shi0%10;}void sufaf(uchar fen0){fen11=fen0/10;fen12=fen0%10;}void sufam(uchar miao0){miao11=miao0/10;miao12=miao0%10;}void sufan(uint nian0){nian11=nian0/1000;nian12=(nian0%1000)/100;nian13=((nian0%1000)%100)/10;nian14=((nian0%1000)%100)%10;}void sufay(uchar yue0){yue11=yue0/10;yue12=yue0%10;}void sufar(uchar r0){r11=r0/10;r12=r0%10;}void SJ_intial(){nian=2013;sufan(nian);yue=1;sufay(yue);r=7;sufar(r);shi=23;sufas(shi);fen=59;sufaf(fen);miao=40;sufam(miao);Writer_zfc(0x80,"TIME : : ");Writer_zfc(0xC0,"DA TE >-__-< ");ShowChar(0xc5,Time1[nian11]);ShowChar(0xc6,Time1[nian12]);ShowChar(0xc7,Time1[nian13]);ShowChar(0xc8,Time1[nian14]);ShowChar(0xca,Time1[yue11]);ShowChar(0xcb,Time1[yue12]);ShowChar(0xcd,Time1[r11]);ShowChar(0xce,Time1[r12]);ShowChar(0x86,Time1[shi11]);ShowChar(0x87,Time1[shi12]);ShowChar(0x89,Time1[fen11]);ShowChar(0x8a,Time1[fen12]);ShowChar(0x8c,Time1[miao11]);ShowChar(0x8d,Time1[miao12]);}void SJ_xianshi(uchar shi,uchar fen,uchar miao) {if(miao!=miao1){sufam(miao);ShowChar(0x8c,Time1[miao11]);ShowChar(0x8d,Time1[miao12]);miao1=miao;}if(fen!=fen1){sufaf(fen);ShowChar(0x89,Time1[fen11]);ShowChar(0x8a,Time1[fen12]);fen1=fen;}if(shi!=shi1){sufas(shi);ShowChar(0x86,Time1[shi11]);ShowChar(0x87,Time1[shi12]);shi1=shi;}if(r!=r1){sufar(r);ShowChar(0xcd,Time1[r11]);ShowChar(0xce,Time1[r12]);r1=r;}if(yue!=yue1){sufay(yue);ShowChar(0xca,Time1[yue11]);ShowChar(0xcb,Time1[yue12]);yue1=yue;}if(nian!=nian1){sufan(nian);ShowChar(0xc5,Time1[nian11]);ShowChar(0xc6,Time1[nian12]);ShowChar(0xc7,Time1[nian13]);ShowChar(0xc8,Time1[nian14]);nian1=nian;}}void SJ_xz(){if(miao==60){fen++;miao=0;if(fen==60){shi++;fen=0;if(shi==24){r++;shi=0;if((yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)&&r> 31){r=1;yue++;if(yue>12){nian++;yue=1;}}else{if((yue==4||yue==6||yue==9||yue==11)&&r>30){r=1;yue++;}else{if((yue==2||nian%100==0)&&r>29&&nian%400==0){yue++;r=1;}else{if((yue==2||nian%100==0)&&(nian%400!=0)&&(r>28)){yue++;r=1;}else{if((yue==2||nian%100!=0)&&(nian%4==0)&&r>29){yue++;r=1;}}}}}}}}}void FM_baoshi(){if(fen==0&&(miao==1||miao==2||miao==3||miao==4||miao==5)){buz=~buz;DelayMs(500);}buz=1;}void main(){InitLcd();WriteCommand(0x01);SJ_intial();initiatejs0();P1=0XEE;while(1){FM_baoshi();SJ_xz();SJ_xianshi(shi,fen,miao);//Wenzi_yiwei(1);Liushui_d();}}void js0(void) interrupt 1{TH0=0x4b;//一次中断50毫秒TL0=0xff;time++;if(time==20){//P1=0Xfe;time=0;miao++;}}。