单片机学习之项目1-流水灯2定时器

合集下载

流水灯(定时器延时)

流水灯(定时器延时)
4
/********************** main******************************/ main() { unsigned char k,temp,temp1;//设置变量 P1= 0xff; TMOD = 0x01;//设置定时器方式为定时器方式 1 while (1) { temp = 0x01; //L1 到 L8 二极管顺序点亮 for(k=0;k<8;k++) { P1 = ~temp; delay(50); temp = temp<<1; } temp = 0x80; //L8 到 L1 二极管顺序点亮 for(k=0;k<8;k++) { P1 = ~temp; delay(50); temp = temp>>1; } temp = 0xfe;//L8L1 到 L7L2 到 L6L3 到 L5L4 顺序点亮 temp1 = 0x7f; for(k=0;k<8;k++) { P1 =(_cror_(temp,k))&(_crol_(temp1,k)); delay(50); } P1 = 0xFF; delay(200); temp = 0xFE; //L8 到 L1 二极管顺序点亮 for(k=0;k<8;k++) { P1 = temp; delay(50); temp = temp<<1; } temp = 0x7F; //L1 到 L8 二极管顺序熄灭 for(k=0;k<8;k++) { P1 = ~temp; delay(50); temp = temp>>1; } } }
/*********************************************************************************************/ /* 函 数 名: delay*****************************************************************************/ /* 功能描述: 延时*****************************************************************************/ /* 调用函数: 无 ******************************************************************************/ /* 入口参数: t*********************************************************************************/ /* 出口参数:无 ******************************************************************************/ /*********************************************************************************************/

单片机流水灯实验原理

单片机流水灯实验原理

单片机流水灯实验原理
单片机流水灯实验原理是通过使用单片机控制LED灯的亮灭
顺序,实现像水流一样顺序逐个灯泡点亮或熄灭的效果。

具体的原理是首先定义一个存储变量来表示灯泡的状态,将其初始化为一个特定的值,然后通过循环不断地改变存储变量的值,从而改变LED灯的状态。

在流水灯实验中,使用的通常是移位寄存器方法。

首先将存储变量的最低位设置为1,表示第一个灯泡亮起。

然后通过向左
移位的方法不断改变存储变量的值,使得下一个灯泡依次点亮。

当存储变量的最高位被移动到最低位时,循环重新开始,实现灯泡的循环点亮。

为了使灯泡的点亮和熄灭速度可见,可以在每次改变存储变量的值之后,添加一个延时函数,控制灯泡亮灭的间隔时间,从而形成一个流动的效果。

通过编程控制灯泡的亮灭顺序和时间间隔,可以实现不同的流水灯效果,如单方向流水灯、双向流水灯、交替流水灯等。

这些效果的产生都是通过改变存储变量的值和控制亮灭时间来实现的。

单片机流水灯实验原理

单片机流水灯实验原理

单片机流水灯实验原理
单片机流水灯实验原理:
流水灯是一种基本的电子实验,通过使用单片机控制多个
LED 灯的亮灭来实现灯光在各个灯珠之间流动的效果。

流水
灯实验原理如下:
1. 硬件连接:将多个 LED 灯和适当的电流限制电阻连接到单
片机的不同输出引脚上。

每个 LED 灯的阴极与电流限制电阻
连接到负极(GND),而阳极连接到单片机的 IO 引脚。

需要
注意的是,单片机的 IO 引脚的输出电压应该能够点亮 LED 灯。

2. 软件设计:使用单片机的 GPIO(通用输入输出)功能,设
置相应的输出引脚作为流水灯的控制引脚。

通过对这些引脚进行高低电平控制,实现不同 LED 灯的点亮和熄灭。

3. 流水灯效果:为了实现流水灯的效果,我们将需要在不同的时间间隔内控制不同的 LED 灯点亮。

可以使用一个循环来实
现这种效果,循环中通过更新和改变控制引脚的电平状态来控制流水灯的亮灭顺序。

4. 控制顺序:通过改变控制引脚的电平状态的顺序,可以改变流水灯的流动顺序。

可以通过在循环中使用延迟函数来控制灯的变换速度,或者使用计数器等其他方法来实现更复杂的流水灯效果。

通过以上原理,我们可以实现单片机流水灯实验并观察到灯光在不同的 LED 灯之间流动的效果。

定时器控制流水灯实验

定时器控制流水灯实验

实验二定时器控制流水灯实验一、实验目的1、熟练掌握实验箱的使用方法和注意事项。

2、了解简单单片机应用系统的设计方法。

3、掌握定时/计数器中断的编程方法。

4、掌握Keil C51集成开发环境在硬件仿真条件下各参数的设置。

二、实验内容利用实验板上的八个LED做显示,利用中断法编写定时程序,控制单片机定时器进行定时,所定时间为1S。

三、实验器材PC机一台, 仿真器一台, 实验箱一台, 导线若干。

四、实验说明当AT89C51的P1口有低电平输出时,相应的发光二极管就会点亮。

应用这一原理我们可以容易的点亮一个LED,例如令P1口输出0111 1111时D1就会点亮。

若再把0111 1111向右循环一位,利用P1口输出,就会点亮D2。

通过定时器来保证每个LED灯点亮时间大约为1秒。

五、实验原理图单片机的P1口为准双向口,每一位均可独立定义为输入或输出,若要将P1口的某一位所对应的灯熄灭,则需要向该端口写“0”。

电路图如下:图3-1 接线图六、实验步骤1.按照实验一中的建立工程的步骤,建立本实验内容相应的工程;2.单片机的P1口接8个发光二极管L0~L7;3.运用调试工具,调试软件,观察现象;4.软件定时:即让机器执行一个程序段,这段程序本身没有具体的执行目的,只是为了磨时间。

执行这段程序所需要的时间就是延时时间。

这种程序前面已设计过。

这种方法定时占用CPU执行时间,降低了CPU利用率。

此次实验使用的是MCS-51系列单片机七、参考程序#include<reg51.h>#include<intrins.h>#define uint unsigned int; #define uchar unsigned char; uchar temp=0x01,num=0;void T0Int() interrupt 1 {TH0=19455/256;TL0=19455%256;num++;if(num==20){num=0;P1=_crol_(temp,1);temp=P1;}}void main(){EA=1;ET0=1;TMOD=0X01;TH0=19455/256;TL0=19455%256;TR0=1;while(1);}八、实验现象通过实验观察可以发现,当烧入正确程序并全速运行后,8个LED灯从左到右一次点亮,并且每个LED灯点亮时间大约为1秒,循环往复直至断电或者复位。

单片机学习之项目1 流水灯2定时器

单片机学习之项目1 流水灯2定时器

可位寻址, 也可字节寻址
TF1 TR1 TF0 TR0 IE1 IP1 IE0 IP0
M1M0
00:方式0,13位计数寄存器 01:方式1 ,16位计数寄存器,用于定时 和计数 10:方式2 ,自动重装载8位计数寄存器 ,用于波特率发生器 11:方式3,2个8位计数寄存器
定时器使用步骤
1.设置TMOD,使之工作在需求状态;
时间间隔1s的双向流水灯;
方法2
50ms 初值=15536=0x3CB0 #include<reg52.h> void main() { unsigned int i,j,value; TMOD=0x01; TH0=0x3c; TL0=0xb0; TR0=1; //此位可位操作 while(1) { value=0x01; for(i=0;i<14;i++) { for(j=0;j<20;j++) { while(TF0!=1); TH0=0x3c; TL0=0xb0; TF0=0; } P1=~value; if(i<7) value=value<<1; else value=value>>1;
#include<reg52.h> void main() { unsigned int i,value,dec; TMOD=0x01; TH0=0x3c; TL0=0xb0; TR0=1; //此位可位操作 while(1) { value=254; dec=1; for(i=0;i<8;i++) { while(TF0!=1); TH0=0x3c; TL0=0xb0; P1=value; value=value-dec; dec=dec*2; } }

单片机学习之项目1流水灯

单片机学习之项目1流水灯

02
硬件组成与原理
主要硬件设备介绍
LED灯
多个LED灯串联或并联在一起, 用于实现流水灯效果。
电源
为整个系统提供电能,一般采用 直流电源。
01
单片机
本项目采用常见的51单片机,负 责控制整个流水灯系统的运行。
02
03
04
电阻
用于限制电流,保护LED灯不会 因为电流过大而损坏。
电路连接及工作原理
• P0 = 0x00; // 初始状态为全灭
关键代码段解析
01
}
02
```
03
主循环代码:在循环中不断改变LED灯的亮灭状态,实现流水 灯效果
关键代码段解析
init_led(); // 初始化LED灯
void main() {
```c
01
03 02
关键代码段解析
01
while (1) { // 主循环
问题诊断及优化建议
检查单片机的程序代码,查找可 能导致问题的原因,如逻辑错误 、时序问题等。
重新进行测试验证,确保问题得 到解决,流水灯功能正常实现。
01
分析测试结果中出现的问题,如 LED灯亮灭顺序错误、时间间隔 不准确等。
02
03
根据问题原因提出相应的优化建 议,如修改程序代码、调整硬件 电路等。
关键代码段解析
01 unsigned int i, j; 02 for (i = ms; i > 0; i--) {
03
for ( j = 110; j > 0; j--); // 大约延时1ms
关键代码段解析
01
}
02
}
03
```

用单片机实现流水灯的控制设计说明书

用单片机实现流水灯的控制设计说明书

用单片机实现流水灯的控制设计1.引言当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被智能控制系统所取代。

单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。

目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。

学习单片机的最有效方法就是理论与实践并重,本设计课题是流水灯的控制设计,流水灯是一串按一定的规律像流水一样连续闪亮。

流水灯控制是可编程控制器的一个应用,其控制思想在工业控制技术领域也同样适用。

2.硬件组成2.1 总体方案设计分析要求用8255的A口和B口做为输出,接16个发光二极管,从而实现16位流水灯的显示效果,基本的界限可如下图A所示,在C口的地两位接两个开关,实现两个扩展功能的控制。

i:基本流水灯显示电路A口和B口两个端口不能同时复制,从而在试验中可以用BX进行需要复制的数据的存储,因为BX可以分从BH BL两个部分进行独立的操作,在本次试验中用BH对A口进行赋值,用BL对B口进行赋值,通过演示一段时间再对BH BL进行移位和输出,实现流水灯的效果。

ii:正反方向选择把PC.0口接在开关上,编写程序对C端口的数据进行读取,并进行判断,使得当PC.0为高电平的时候则灯进行左移,同时B口与A口相反。

iii:快慢速度控制把PC.1口接在开关上,编写程序对C端口的数据进行读取,并进行判断,使得当PC.1为高电平的时候则延时的时间缩短,使得流水灯的流水速度加快,低电平的时候则进行延时的时间变长,使得流水灯的流水速度加快。

3硬件原理设计A该模块的WR.RD分别练到PC总线接口模块的XIOW和XIORB该模块的数据(AD0~AD7)、地址线(A0~A7)分别连到PC总线接口模块的数据(D0~D7)、地址线(A0~A7)C 8255模块选通线CA连到PC总线接口模块的IOY3D 8255的PA0~PA7连到发光二极管的L1~L8;8255的PB0~PB7连到发光二极管的L9~L16E 8255的PC0 PC1分别练到开关 K0 K1F 软件流程框图及程序清单按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。

单片机实验报告-流水灯-双机通信-交通灯-定时时钟

单片机实验报告-流水灯-双机通信-交通灯-定时时钟

实验一流水灯实验一、实验目的1)简单I/O引脚的输出2)掌握软件延时编程方法3)简单按键输入捕获判断二、实验实现的功能1)开机是点亮12发光二极管,闪烁三下2)按照顺时针循环依次点亮发光二极管3)通过按键将发光二极管的显示改为顺逆时针方式三、系统硬件设计流水灯原理图四、系统软件设计演示程序五、实验过程中遇到的问题及解决方法1)每次循环无论正转还是反转程序,总先是先执行P1口的8位led灯。

原因:在利用KEIL自带的库函数中的_crol_和_cror_时,在正转和反转程序中应该调换顺序的,开始没注意到。

改正后显示正常。

2)在开始实验的时候实行的是一直循环的方式,利用按键嵌套。

后来发现不理想,每次按键按到三次以上后进入死循环。

解决方案:利用一个按键,显示一次。

并加入按键释放,防止误动作。

指导老师签字:日期:实验一程序:/******************************************************************** **************工程说明:本工程主要完成了一下功能:1,复位后演示所有功能2,灯闪烁三次3,流水灯正转4,流水灯反转函数说明:yanshi():演示程序dengss():闪烁程序right():正转程序left():反转程序scankey():按键扫描********************************************************************* **************/#ifndef _led_h#define _led_h#define uint unsigned int#define uchar unsigned charuchar i,j,a,b,c,d;uchar flag=0;//亮灯判断标志uchar aa,bb,cc,dd,ss;sbit H1=P3^6;sbit key1=P0^5;sbit key2=P0^6;sbit key3=P0^7;void delay(uint); //1ms延时void yanshi(void);//演示所有亮灯方式void dengss(void);//闪烁三次void left(void); //左循环亮灯void right(void);//右循环亮灯void scankey(); //按键扫描#endif#include"stc10.h"#include<intrins.h>#include<led.h> //包含各种变量定义及函数声明main(){yanshi();delay(2000); //两秒后进入可控大循环while(1){scankey();if(flag==0)right();if(flag==1)left();if(flag==2)dengss();}}void delay(uint x){uint i,j;for(i=110;i>0;i--)for(j=x;j>0;j--);}void yanshi(){dengss();right();left();P2=0XFF;P3=0XFF;}void dengss(){for(ss=3;ss>0;ss--){P2=0;P3=0xc3;delay(1000);P2=0xff;P3=0xff;delay(1000);}flag+=3;//退出小循环,只亮一次,增大按键扫描频率}void right(){aa=0xfe;for(a=8;a>0;a--){P2=aa;aa=_crol_(aa,1);delay(500);}bb=0xfb;P2=0xff;//熄灭循环后亮着的for(b=4;b>0;b--){P3=bb;bb=_crol_(bb,1);delay(500);}//D12保留发亮flag+=3;//退出小循环,只亮一次,增大按键扫描频率}void left(){cc=0xdf;for(c=4;c>0;c--){P3=cc;cc=_cror_(cc,1);delay(500);}P3=0xff;//熄灭D9dd=0x7f;for(d=8;d>0;d--){P2=dd;dd=_cror_(dd,1);delay(500);}//D1保留发亮flag+=3;//退出小循环,只亮一次,增大按键扫描频率}void scankey(){H1=0;if(key1==0){delay(10);if(key1==0){flag=0;while(!key1);//等待按键释放}}if(key2==0){delay(10);if(key2==0){flag=1;while(!key2);//等待按键释放}}if(key3==0){delay(10);if(key3==0){flag=2;while(!key3);//等待按键释放}}}实验二定时器或实时时钟实验一、实验目的1)数码管动态显示技术2)定时器的应用3)按键功能定义二、实验实现的功能1)通过按键可以设定定时时间,启动定时器,定时时间到,让12个发光二极管闪烁,完成定时器功能。

单片机-流水灯的程序

单片机-流水灯的程序

单片机-流水灯的程序流水灯是学习单片机基础知识不可或缺的一个实验,通过流水灯的实现可以掌握单片机 I/O 口的使用、定时器中断的使用以及掌握基本的程序流程控制语句。

本文将介绍流水灯基本概念及实现步骤。

流水灯基本概念流水灯是由多个 LED 灯组成的,每个灯都有一个独立的控制信号,通过按照一定的模式控制信号的输出,就可以实现流水灯的效果。

在单片机中,可以通过将多个 I/O 口作为流水灯中的 LED 控制信号输入口,实现流水灯的效果。

流水灯程序实现步骤在单片机中实现流水灯的程序主要包括以下几个步骤:1.通过 I/O 口控制单片机的 GPIO 端口输出。

2.在控制 GPIO 端口输出时,需要注意端口的方向设置与输出方式的选择。

3.通过控制 GPIO 端口的输出,可以实现 LED 灯的亮灭控制。

4.在亮灭控制中,需要注意定时器中断的使用,以保证流水灯的优美效果。

5.在程序编写的同时,需要考虑到不同型号单片机 I/O 口和定时器的不同特性。

6.需要根据不同的实验要求和要达到的效果,编写相应的程序。

流水灯程序的实现步骤详解下面,将详细介绍流水灯程序的实现步骤:1.首先,需要定义 I/O 口与对应的 LED 灯的对应关系。

一般情况下,LED 灯是连接在单片机的某一 I/O 口上。

我们需要将 I/O 口与 LED 灯的对应关系进行定义,以便在编写程序时可以通过 I/O 口控制 LED 灯的亮灭。

2.接着,需要设置 I/O 口的方向和输出方式。

在单片机的 I/O 口中,默认输入方向,如果要将 I/O 口设置为输出方向,则需要通过软件设置 I/O 口相应的设置寄存器。

同时,需要设置输出方式为推挽输出或是开漏输出,并配置相应的电平。

3.设置定时器。

在流水灯程序中,需通过定时器中断控制 LED 灯的亮灭模式。

需要设置定时器的时钟源、预分频系数、计数值和比较值等参数,以实现不同的滚动速度和亮灭模式。

4.定义中断函数。

中断函数需要根据定时器的计时值进行 LED 灯亮灭的控制操作。

单片机流水灯c语言实现

单片机流水灯c语言实现
//使数字0--9循环显示
//------------------------------------------------
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE []=
red_a=1;yellow_a=1;green_a=0;
red_b=0;yellow_b=1;green_b=1;
delayMs(2000);
Operation_Type=2;
break;
case 2://东西向黄灯开始闪烁,绿灯关闭
delayMs(300);
yellow_a=!yellow_a; green_a=1;
while(x--)
{
for(i=0;i<120;i++);
}
}
//---------------------------------------------
//交通灯切换子程序
void Traffic_Light()
{
switch (Operation_Type)
{
case 1://东西向绿灯亮与南北向红灯亮
{
uchar i;
P2=0x01;//P2端口初始化
while(1)//死循环
{
for(i=0;i<7;i++)//i自加1,当i=7时执行第二个for语句
{
P2=_crol_(P2,1);//P2端口循环左移1位
delayMs(150);
}
for(i=0;i<7;i++)

单片机流水灯实验原理

单片机流水灯实验原理

单片机流水灯实验原理
单片机流水灯实验是学习单片机编程的入门实验之一,通过这个实验可以了解单片机的基本工作原理和编程方法。

流水灯实验是一种简单的实验,但是可以很好地帮助初学者理解单片机的工作原理和编程思想。

首先,我们需要了解一下单片机的基本原理。

单片机是一种集成了微处理器、存储器和输入/输出接口的微型计算机,它可以完成各种各样的控制任务。

在流水灯实验中,我们使用的是基于C语言的单片机编程。

接下来,我们来看一下流水灯实验的原理。

流水灯实验是通过控制多个LED 灯的亮灭顺序来实现灯的流水效果。

在单片机中,我们可以通过控制GPIO口的输出来控制LED的亮灭,从而实现流水灯的效果。

在编程中,我们可以通过循环和延时来控制LED的亮灭顺序和时间间隔,从而实现流水灯的效果。

在实际的流水灯实验中,我们需要先连接单片机和LED灯,然后编写相应的程序来控制LED的亮灭顺序和时间间隔。

在程序编写完成后,我们将程序下载到单片机中,然后启动单片机,就可以看到LED灯按照预定的顺序和时间间隔实现流水灯的效果了。

流水灯实验不仅可以帮助我们了解单片机的基本原理和编程方法,还可以锻炼我们的编程能力和动手能力。

通过这个实验,我们可以更加深入地理解单片机的工作原理和编程思想,为以后更复杂的单片机应用打下坚实的基础。

总之,单片机流水灯实验是一种简单而有趣的实验,通过这个实验可以很好地帮助我们了解单片机的基本原理和编程方法。

希望大家能够认真对待这个实验,加深对单片机的理解,为以后的学习打下良好的基础。

单片机流水灯闪烁实训报告

单片机流水灯闪烁实训报告

一、实验目的1. 熟悉单片机基本原理和组成,掌握单片机编程的基本方法。

2. 理解单片机I/O口控制LED灯的原理,实现流水灯闪烁功能。

3. 提高单片机实际应用能力,为以后从事相关领域工作打下基础。

二、实验原理1. 单片机简介:单片机(Microcontroller Unit,MCU)是一种将中央处理器(CPU)、存储器(RAM、ROM)、输入/输出接口(I/O)、定时器/计数器、串行通信接口等集成在一个芯片上的微型计算机。

2. LED灯简介:LED(Light Emitting Diode)是一种发光二极管,具有体积小、亮度高、寿命长、响应速度快等优点,广泛应用于各种显示、照明等领域。

3. 流水灯闪烁原理:通过单片机的I/O口控制LED灯的亮与灭,实现流水灯效果。

本实验中,采用定时器中断的方式,定时改变LED灯的状态,从而实现闪烁效果。

三、实验设备1. 单片机开发板:选用STC89C52单片机开发板。

2. LED灯:8个LED灯。

3. 电阻:8个220Ω电阻。

4. 连接线:若干。

5. 仿真软件:Proteus。

四、实验步骤1. 搭建电路:将8个LED灯依次连接到单片机的P1口,每个LED灯串联一个220Ω电阻,以保护LED灯。

2. 编写程序:使用C语言编写单片机程序,实现流水灯闪烁功能。

3. 编译程序:将编写好的程序编译成机器码。

4. 仿真测试:在Proteus中加载编译好的程序,观察LED灯的闪烁效果。

5. 实际测试:将程序烧录到单片机中,观察LED灯的闪烁效果。

五、程序设计1. 初始化:设置单片机的I/O口、定时器等。

2. 定时器中断:设置定时器中断,定时改变LED灯的状态。

3. 主循环:在主循环中不断读取定时器中断标志,根据标志改变LED灯的状态。

4. 代码示例:```c#include <reg51.h>#define LED P1void Timer0_Init(void) {TMOD = 0x01; // 设置定时器0为模式1TH0 = 0xFC; // 设置定时器0初始值TL0 = 0x66;ET0 = 1; // 开启定时器0中断EA = 1; // 开启全局中断TR0 = 1; // 启动定时器0}void main(void) {unsigned char i = 0;LED = 0xFF; // 初始化LED灯Timer0_Init(); // 初始化定时器while (1) {if (TF0) { // 定时器0溢出中断TF0 = 0; // 清除溢出标志TH0 = 0xFC; // 重新加载定时器0初始值TL0 = 0x66;for (i = 0; i < 8; i++) {LED = ~(1 << i); // 改变LED灯状态delay(1000); // 延时1秒}}}}void delay(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 120; j++);}```六、实验结果与分析1. 实验结果:LED灯按照预设的规律闪烁,实现了流水灯效果。

单片机跑马灯(流水灯)控制实验报告

单片机跑马灯(流水灯)控制实验报告

单片机实验报告姓名: 学号:一、 实验实现功能:1:计数器功能2:流水灯二、 具体操作:1、计数器功能数码管的动态显示。

每按一次K2键计数器加1通过数码管显示出来,计数器可以实现从0计数到9999。

2、流水灯当在计数器模式下的时候按下K3键时程序进入跑马灯模式,8个小灯轮流点亮每次只点亮一个,间隔时间为50ms 。

三、 程序流程图开始 定时器T0 设置初值,启动定时器,打开中断复位 Key2按下 中断关闭 计数器模式 计数器加1 Key3按下 流水灯模式 数码管显示数字加1 跑马灯点亮间隔50ms Key1按下中断打开四、程序#include <reg51.h>typedef unsigned char uint8;typedef unsigned int uint16; //类型定义sbit P2_1 = P2^1;sbit P2_2 = P2^2;sbit P2_3 = P2^3;sbit P2_4 = P2^4; //位声明四个数码管开关sbit Key2 = P3^2;sbit Key3 = P3^3; //位声明2个按键K2和K3sbit Ledk = P2^0 ; //LED 开关void delay(uint16 i); //延时函数声明void refresh (); // 数码管刷新函数声明void liushuideng(); //流水灯函数声明uint8 number[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数码管的真值表uint8 out[4] = {0}; // 数组变量uint16 counter=0; //用作计数器的变量uint16 Time_counter=0; //用作定时器的变量void main() //主函数{TMOD = 0x01; //定时器0,工作方式一TH0 = 0xFC;TL0 = 0x18; //定时器初值使每次循环为1msTR0 = 0; //定时器0开始作ET0 = 0; // 定时器中断关EA = 0; // 关中断while(1) //计数器模式{Ledk =1 ; //led开关关out[0]=number[counter%10]; //取个位out[1]=number[counter%100/10]; //十位out[2]=number[counter%1000/100]; //百位out[3]=number[counter/1000]; //千位if (!Key2) //计数器加1{++counter; //自加out[0]=number[counter%10]; //取个位out[1]=number[counter%100/10]; //十位out[2]=number[counter%1000/100]; //百位out[3]=number[counter/1000]; //千位while(!Key2) //等待键盘抬起refresh(); //刷新数码管}refresh(); //刷新数码管if (!Key3) // 进入跑马灯模式liushuideng();}} //主函数结束/*******************延时*************/void delay(uint16 i){uint8 j; // 定义局部变量for(i;i>0;i--) //循环i*240 次for(j=240;j>0;j--);}/************数码管刷新******************/void refresh (){uint8 j;for (j=0;j<4;j++) //四次循环刷新数码管{switch(j){case 0: P2_1=1;P2_2=1;P2_3=1;P2_4=0;break;case 1: P2_1=1;P2_2=1;P2_3=0;P2_4=1;break;case 2: P2_1=1;P2_2=0;P2_3=1;P2_4=1;break;case 3: P2_1=0;P2_2=1;P2_3=1;P2_4=1;break;//每次循环只选中一个数码管default:break;}P0 = out[j]; // 位选,给数码管送值delay (20); //延时消抖}}/*************定时器的中断服务函数**************/void Timer0_Overflow() interrupt 1 //定时器0溢出中断,这个语句1ms执行一次{TH0 = 0xFC;TL0 = 0x18; //每1ms重新赋定时器初值Time_counter++; //计数,看经过了几个1ms}/***********************流水灯子函数****************************/ void liushuideng(){uint8 j = 0 ; //定义局部变量P0 = 0xff; // 小灯全关TR0 = 1; //定时器1开始计时EA = 1; //中断开放ET0 = 1; //定时器0中断开while(1){Ledk = 0 ; //打开LED开关P2 = P2|0x1E; //关掉数码管if(50 == Time_counter) //50个毫秒{P0=~(1<<j++); //控制小灯Time_counter = 0; //清零开始下一次循环定时}if (8==j) //移完8次再重新移{j=0;}}}。

基于PLC做的三种流水灯

基于PLC做的三种流水灯

三种流水灯设计实践报告学院:机械与电子工程学院班别:09电子信息工程3班课程:西门子PLC与工业网络技术指导老师:孙亚飞老师组员:罗龙标2号陈淼珊43号蒋家涛46号梁康祥51号一、第一种流水灯(脉冲定时器(SP))脉冲定时器方框图线圈图-(SP)-(1)脉冲定时器的时序功能图(2)脉冲定时器(SP)的工作原理由时序图可得,脉冲定时器的特点是在任何情况下只要起动输入端S有上升沿信号,定时器就被触发,并从TV预设时间值处重新开始定时,且定时器常开触点闭合,Q端输出1;在定时期间内,如果S端保持高电平1不变,则定时器运行到定时时间值结束,此时定时器常开触点释放,Q端由1变为0;如果定时期间,S端断开(由1变为0),则定时器停止运行,常开触点也随即释放,Q端输出为0。

从时序图看,定时器的运行在S端控制下呈现脉冲状,故称为脉冲定时器。

不论S端处于何种状态,只要复位端R的状态由0变为1,则定时器就被复位,Q端输出变为0,定时器常开触点断开。

(3)、流水灯的程序图(4)第一种流水灯仿真图(5)流水灯的工作原理当开关I0.0闭合的时候,脉冲定时器T0开始计时,在T0计时时间中,灯Q0.0开始工作,之后T0定时结束定时器常开触点释放,Q0.0停止工作,所以Q0.0常闭触点同时给T1一个上升沿,T1就开始计时,灯Q0.1开始工作、、、、、一直到Q0.3停止工作,Q0.3同时又给一个上升沿给T0,脉冲定时器T0又开始计时、、、、、以此循环,就可实现从Q0.0 到Q0.3 循环,再加上另外的灯,工作原理相同二、第二种流水灯(扩展脉冲定时器(SE))脉冲定时器方框图线圈图-(SE)- (1)扩展脉冲定时器的时序功能图(2)扩展脉冲定时器(SP)的工作原理由时序图可得,当起动输入端S有上升沿信号,定时器开始定时,定时期间定时器常开触点闭合,Q端输出高电平1,且保持到定时结束,之后变为0,常开触点断开;在定时期间内,即使S端变为0,定时器继续定时;如果在定时期间,S端重新触发定时器(即在定时期间S端又来一个上升沿信号),则定时器被重新起动,并从预设值开始定时。

单片机实验报告流水灯

单片机实验报告流水灯

单片机实验报告流水灯单片机实验报告:流水灯引言:单片机是现代电子技术中非常重要的一部分,它广泛应用于各个领域,如家电、汽车、通信等。

单片机实验是学习单片机的基础,通过实际操作来理解单片机的原理和应用。

本报告将介绍一个常见的单片机实验项目——流水灯实验。

一、实验目的流水灯实验旨在通过控制单片机的IO口,实现多个LED灯按照顺序依次点亮和熄灭的效果。

通过这个实验,可以加深对单片机IO口的控制和编程的理解。

二、实验器材1. 单片机开发板:我们使用的是STC89C52开发板,它是一种基于8051内核的单片机开发板。

2. LED灯:我们使用了8个LED灯,分别连接到单片机开发板的8个IO口上。

3. 连接线:用于连接单片机开发板和LED灯。

三、实验原理流水灯实验的原理很简单,通过控制单片机的IO口输出高低电平来控制LED灯的亮灭。

当某个IO口输出高电平时,对应的LED灯点亮;当IO口输出低电平时,对应的LED灯熄灭。

四、实验步骤1. 连接电路:将8个LED灯分别连接到单片机开发板的8个IO口上,确保连接正确。

2. 编写程序:使用C语言编写单片机程序,控制IO口的高低电平变化。

程序的主要逻辑是通过一个循环,依次将某个IO口输出高电平,然后延时一段时间,再将该IO口输出低电平,再延时一段时间,以此循环实现流水灯的效果。

3. 烧录程序:将编写好的程序烧录到单片机开发板中,确保程序能够正确运行。

4. 调试实验:将单片机开发板连接到电源,观察LED灯是否按照预期的顺序点亮和熄灭。

如果有问题,可以通过调试程序或检查电路连接来解决。

五、实验结果经过调试和实验,我们成功地实现了流水灯的效果。

8个LED灯按照顺序依次点亮和熄灭,形成了一个流动的灯光效果。

这个实验不仅让我们学习了单片机的IO口控制,还提高了我们的动手能力和解决问题的能力。

六、实验总结通过这个实验,我们深入了解了单片机的原理和应用。

单片机作为一种微型计算机,具有体积小、功耗低、成本低等优点,广泛应用于各个领域。

单片机学习编程之流水灯篇OK

单片机学习编程之流水灯篇OK

第一章单片机的基础学习第一个实验 LED发光二极管的左移右移(D1到D8依次)点亮二极管点亮的原理图如下。

实际上是接在P1口。

原理图说明:发光二极管阴极接单片机,让电流流入单片机,因为单片机输出电流小,点不亮发光二极管。

发光二极管点亮电流为5 mA至20mA。

编程说明:(1)做一个LED的左移右移,有硬件电路可知,输出“0”才能使LED亮。

开始时P1.0亮,——P1.1亮——P1.2亮….——P1.7亮——P1.0亮,重复循环点亮LED。

(2)延时时间的设计:石英晶体为12MHz,1个机器周期为1微秒,采用单片机每走一步指令需要的时间来延时。

✧延时时间子程序(10.002毫秒)Delay: MOV R4,#20 ;2个机器周期,2微秒D1: MOV R5,#248 ;2个机器周期,2微秒DJNZ R5,$ ;2个机器周期,2*248微秒DJNZ R4,D1 ;2个机器周期,2*20微秒RET这个延时子程序:20*(498+2)+2=10002个机器周期=10.002毫秒。

✧延时时间子程序(200毫秒)Delay: MOV R3,#20 ; 200微秒D1:MOV R4,#20 ;10微秒D2: MOV R5,#248DJNZ R5,$DJNZ R4,D2DJNZ R3,D1RET(3)汇编程序源代码注意:向电脑上编辑程序时注意标点符号要在英文的格式下输入。

ORG 00HMAIN: MOV A,#0FFHCLR CMOV R2,#08H;左移点亮发光二极管LOOP: RLC A ;带进位左移一位MOV P1,A;点亮LED发光二极管CALL DELAY;调用延时子程序DJNZ R2,LOOP;左移、轮流点亮发;光二极管;左移点亮发光二极管后,再右移点亮发光二极管MOV R2,#07HLOOP1: RRC A ;带进位右移一位MOV P1,A;点亮LED发光二极管CALL DELAY;调用延时子程序DJNZ R2,LOOP1JMP MAIN; 返回到初始位置;设置延时时间DELAY: MOV R3,#20D1: MOV R4,#20D2: MOV R5,#248DJNZ R5,$DJNZ R4,D2DJNZ R3,D1RETEND(4)C程序源代码#include <reg51.h>void Delay()//延时子程序{ int i,j;for(i=0;i<=255;i++)for(j=0;j<=255;j++);}void main(){unsigned int i;unsigned int temp;P1=0xff;while(1){temp=0x01;for(i=0;i<8;i++){P1=~temp;逐位取反Delay();temp=temp<<1;}}}(4)实验结果图(注意学习板上的JJ_P1连接器连上)第二个实验采用定时器来设置延时时间(方式0)说明:(1)开始时p1.0亮,延时0.2秒后左移至p1.1亮,如此左移7次后至,再延时0.2秒右移至p1.6亮,如此右移7次后至p1.0亮;(2)延时时间0.2秒,使用定时器0在方式0下工作;采用查询的方式(3)程序源代码ORG 00HMOV TMOD,#00H /***设置定时器的工作方式***/START: CLR CMOV A,#0FFHMOV R2,#08 /***设置循环次数***/LOOP: RLC A /***带进位左循环累加器,点亮发光二极管***/ MOV P1,A /***设置定时器定时时间***/MOV R3,#100CALL DELAYDJNZ R2,LOOP /***点亮了八个发光二极管吗,没有继续***/MOV R2,#07LOOP1: RRC AMOV P2,AMOV R3,#100CALL DELAYDJNZ R2,LOOP1JMP START/***通过单片机内部的定时器设置定时时间***/DELAY: SETB TR0 /***启动定时器***/AGAIN: MOV TL0,#(8192-2000) MOD 32MOV TH0,#(8192-2000) / 32LOOP2: JBC TF0,LOOP3 ;通过查询的方式来判断时间定时器的计时JMP LOOP2LOOP3: DJNZ R3,AGAINCLR TR0RET;非中断END(4)实验结果图第三个实验采用定时器来设置延时时间(方式1)(1)开始时p1.0亮,延时0.2秒后左移至p2.1亮,如此左移7次后至,再延时0.2秒右移至p1.7亮,如此右移7次后至p1.0亮;(2)延时时间0.2秒,使用定时器0在方式1下工作;采用查询的方式(3)源程序代码ORG 00HMOV TMOD,#01HSTART: CLR CMOV A,#0FFHMOV R2,#08LOOP: RLC AMOV P1,AMOV R3,#20CALL DELAYDJNZ R2,LOOPMOV R2,#07LOOP1: RRC AMOV P1,AMOV R3,#20CALL DELAYDJNZ R2,LOOP1JMP STARTDELAY: SETB TR0AGAIN: MOV TL0,#0F0HMOV TH0,#0D8HLOOP2: JBC TF0,LOOP3JMP LOOP2LOOP3: DJNZ R3,AGAINCLR TR0RETEND附录资料:红外发射器的原理图AT89S52下载器的原理图。

C51单片机实验报告流水灯交通灯定时器双机交互时钟

C51单片机实验报告流水灯交通灯定时器双机交互时钟

C51单片机实验报告流水灯交通灯定时器双机交互时钟C51单片机实验报告流水灯交通灯定时器双机交互时钟学号:班级:自动化10 班姓名:张指导老师:胡2019.12单片机核心板实验要求一、流水灯实验、实验目的:) 简单I/O 引脚的输出2 ) 掌握软件延时编程方法3 ) 简单按键输入捕获判断 2 、完成功能要求) 开机是点亮12 发光二极管,闪烁三下2 ) 按照顺时针循环依次点亮发光二极管3 ) 通过按键将发光二极管的显示改为顺逆时针方式二、定时器或实时时钟实验、实验目的) 数码管动态显示技术2 ) 定时器的应用3 ) 按键功能定义 2 、完成功能要求) 通过按键可以设定定时时间,启动定时器,定时时间到,让12 个发光二极管闪烁,完成定时器功能。

) 实时时钟,可以设定当前时间,完成钟表功能(四位数码管分别显示分钟和秒)。

上述二个功能至少完成一种功能。

三、双机通信实验1 、实验目的UART 串行通信接口技术应用2 、完成功能要求用两片核心板之间实现串行通信,将按键信息互发到对方数码管显示。

四、交通灯实验1 、实验目的1 )按键、数码管、发光二极管综合应用编程技术2 )数据存储于EEPRO的技术(也可以不使用)3 )定时中断技术4 )按键中断技术2 、完成功能要求)对每个路口(主干道、次干道)的绿灯时间,及黄灯时间的设定。

)设定参数掉电后不丢失(如果不使用EEPRO,此功能可以不实现)。

)紧急按键功能,当按下该键时,所有路口变成红灯,相当于交警指挥特殊车辆通过。

再按该键,恢复正常显示。

实验一流水灯实验一、实验目的1 )简单I/O 引脚的输出2 )掌握软件延时编程方法 3 )简单按键输入捕获判断二、实验实现的功能 1 )开机是点亮12发光二极管,闪烁三下 2 )按照顺时针循环依次点亮发光二极管 3 )通过按键将发光二极管的显示改为顺逆时针方式三、系统硬件设计1 )如单片机核心板所示的硬件电路。

四、系统软件设计设计思路:1 )定义数组使得调用数组可以使led 灯能够顺时针和逆时针显示;2 )将按键的输入端全部置零,做单独按键使用;3 )利用“ while ”循环使得数码管可以闪烁三下;)利用“ for ”循环使得小灯能够依次点亮一个周期;5 )将以上思想汇总,编程,实现功能。

单片机的应用(1)流水灯

单片机的应用(1)流水灯
;模式1,GATE=1 MOV A,#00H ;T0、T1赋计数初值00H, ; 定时最长时间为0000 ~ 65536 MOV TL0,A MOV TH0,A MOV TL1,A
MOV TH1,A
TEST0: JB P32,TEST0 ;检测是否到a点 SETB TR0 ;到a点,TR0 = 1,做好取计时值准备。
T1计数 1
INT 1
解:
复习GATE的用法: GATE = 0时,TRi = 1,即可启动Ti定时 / 计数 GATE = 1时,TRi = 1,且 INTi =1,才启动定时 / 计数。
ORG 0000H
LJMP MAIN ORG 2000H
MAIN:MOV TMOD,#99H ;T0、T1均工作在定时,
ORG 0000H LJMP MAIN
ORG 000BH LJMP INSE1 ORG 1000H MAIN: MOV SP,#60H MOV TL0,#0CH MOV TH0,#0F0H MOV TMOD,#00H
SETB TR0
SETB ET0 SETB EA
SJMP $
………
INSE1: MOV TL0,#0CH MOV TH0,#0F0H CPL P10 RETI
小结:1、MCS-51单片机内有几个定时计数器?
如何计数? 2、T0、T1有几种工作方式? 3、编程应用前要事先确定的参数有几个?
定时 / 计数器的应用
复习:
TMOD TCON
GATE C/ T TF1 TR1 M1 TF0 M0 TR0 GATE C / T IE1 IT1 M1 IE0 M0 IT0
T0定时/计数,而T1停止计数,但可作波特率发生器。T0分成两独立定时/计数 器TL0和TH0。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

TH0=0x3c; TL0=0xb0;
TMOD=0x01;
TH0=0x3c; TL0=0xb0;
TR0=1; //此位可位操作
while(1)
{
value=0x01;
for(i=0;i<8;i++)
{ while(TF0!=1);
TH0=0x3c; TL0=0xb0;
TF0=0;
P1=~value;
value=value<<1; }
}
}
}
}
复习
定时器定时功能的使用
TMOD:选择T0还是T1 TCON:选择方式1 设置初值放置于TH0,TL0或TH1,TL1中
方式1: 定时时间=(65536-初值)*机器周期 初值=65536-定时时间/机器周期
时间间隔0.5s=10*50ms的流水灯; 书上程序
#include<reg52.h>50ms 初值=15536=0x3CB0
{ while(TF0!=1); TH0=0x3c; TL0=0xb0; TF0=0; }
P1=value; value=value-dec; dec=dec*2; } }
时间间隔1s的双向流水灯;
书上方法
#include<reg52.h>
void main()
{ unsigned char i,j,value,dec;
P1=~value; if(i<7) value=value<<1; else value=value>>1;
时间间隔50ms的流水灯;
方法3
50ms 初值=15536=0x3CB0
#include<reg52.h>
void main()
{
unsigned int value=0x01;
TMቤተ መጻሕፍቲ ባይዱD=0x01;
void main()
{
unsigned int counter;
TMOD=0x01;
TH0=0xb1; TL0=0xe0;
TR0=1; //此位可位操作
while(1)
{ if(1==TF0)
{TH0=0xb1;
TL0=0xe0;
TF0=0;
counter++;}
if(50==counter)
{counter=0; P1_0=~P1_0; }
LOGO

定时器功能
两个寄存器:TMOD和TCON 4个计数寄存器:TH0,TL0;TH1,TL1
方式1: 定时时间=(65536-初值)*12/振荡频率
初值=65536-定时时间*振荡频率/12
例如定时1ms:
初值=65536-1s*12*103Hz/12 =65536-1000 =64536 =0xFC18
常用延时方法
非精确延时
For(i=0;i<100;i++); i=0;while(i--);
精确延时
利用库函数_nop_ ( ) ; //延时一个机器周期
(需要include<intrins.h>)
利用定时器进行定时
定时/计数器(Timer/Counter,简称T/C)
80C51有2个16位定时/计数器:
TL的8位和TH的8位构成16位的计数器
具有自动重装功能的8位计数器 T0分成两个独立的计数器,T1可工作
在方式0~方式2
LOGO

TCON
可位寻址, 也可字节寻址
TF1 TR1 TF0 TR0 IE1 IP1 IE0 IP0
M1M0
00:方式0,13位计数寄存器 01:方式1 ,16位计数寄存器,用于定时
void main() { unsigned int i,j,value,dec; TMOD=0x01; TH0=0x3c; TL0=0xb0; TR0=1; //此位可位操作 while(1) { value=254;
dec=1; for(i=0;i<8;i++) { for(j=0;j<20;j++) //20次*50ms/次
TR0=1;
//此位可位操作
while(1)
{ if(1==TF0)
{ //TH0=0; TL0=0;
TF0=0;
//此位可位操作
P1_0=~P1_0; //此位可位操作
}
}
}
定时1s =50*20ms
#include<reg52.h> 20ms 初值=45536=0xB1E0
sbit P1_0=P1^0;
{TH0=0xfc; TL0=0x18;
TF0=0;
//此位可位操作
P1_0=~P1_0; //此位可位操作
}
}
}
定时时间=(65536-初值)*12/振荡频率≤65536μs
#include<reg52.h>
sbit P1_0=P1^0;
void main()
{
TMOD=0x01;
TH0=0; TL0=0;
TMOD寄存器 不可位寻址
控制T1
控制T0
GATE C/T M1 M0 GATE C/T M1 M0
GATE:
0:软件控制 定时器工作
1:外部中断 控制定时器 工作
C/T 0:定时器 1:计数器
M1M0: 00:方式0 01:方式1 10:方式2 11:方式3
GATE:门控位,控制计数器的启动/停止操作方式。 当GATE=0时,外部中断信号不参与控制,计数器只有TR0 和TR1位软件控制启动和停止。TR1、TR0为1时,计数器
启动开始工作;为0时,计数器停止工作。 当GATE=1时,计数器的启动要由外部中断信号和TR0、和 TR1共同控制。只有当外部中断引脚为高电平,TR0/TR1
置1时才能启动计数器工作。
LOGO

C /T :功能选择位。当=0时选择定时功能,计数脉冲由 内部提供,计数周期等于机器周期。当=1时选择为计数 功能,计数脉冲为外部引脚T0、T1引入的外部脉冲信号。
value=0x01;
for(i=0;i<8;i++)
{
for(j=0;j<20;j++)
//20次*50ms/次
{ while(TF0!=1);
TH0=0x3c; TL0=0xb0; TF0=0; }
P1=~value;
value=value<<1;
}
时间间隔1s的双向流水灯;
方法2
#include<reg52.h>50ms 初值=15536=0x3CB0
LOGO

定时器的工作原理: 定时器/计数器是一个加“1”计数器,来一个脉冲
即进行加1计数,直至计数器的各位全为“1”,再来一 个脉冲,计数器回0(即溢出),且使TF0(定时器0)或 TF1(定时器1)置1,表示时间到,计数值乘以脉冲周期 就是定时时间。
输入的脉冲来源有2个:一个是单片机晶体振荡器经 12分频;另一个是T0/T1端的外部输入脉冲。作定时器用 时,应采用晶体振荡器经12分频的脉冲。
P1=value;
if(i<7)
{ value=value-dec; dec=dec*2;}
else
{dec=dec/2; value=value+dec; }
}
时间间隔50ms的流水灯;
方法2
50ms 初值=15536=0x3CB0
#include<reg52.h>
void main()
{ unsigned int i,value;
TMOD=0x01;
TH0=0x3c; TL0=0xb0; TR0=1; //此位可位操作
while(1)
{ value=254;
dec=1;
for(i=0;i<14;i++)
{ for(j=0;j<20;j++) //20次*50ms/次
{ while(TF0!=1);
TH0=0x3c; TL0=0xb0; TF0=0; }
时间间隔50ms的流水灯;
书上方法
50ms 初值=15536=0x3CB0
#include<reg52.h>
void main()
{ unsigned int i,value,dec;
TMOD=0x01;
TH0=0x3c; TL0=0xb0;
TR0=1; //此位可位操作
while(1)
{ value=254;
void main() { unsigned int i,j,value,dec; TMOD=0x01; TH0=0x3c; TL0=0xb0; TR0=1; //此位可位操作 while(1) { value=254;
dec=1; for(i=0;i<8;i++) {P1=value; for(j=0;j<10;j++) //10次*50ms/次
T0、T1
80C52有3个16位定时/计数器:
T0、T1、T2
定时/计数器(Timer/Counter,简称T/C)
定时器:来一个机器脉冲计数器的值加1 。当计数器值溢出(全1)时回0,定时时间 到,中断标志TF置1.
1个机器周期=12*1/振荡频率
计数器:在机器周期内采样T0(或T1) 脉冲的下降沿,来一个下降沿计数器的 值加1。当计数器值溢出(全1)时回0,中 断标志TF置1.
dec=1;
for(i=0;i<8;i++)
相关文档
最新文档