单片机学习之项目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个发光二极管闪烁,完成定时器功能。

  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++)
相关文档
最新文档