利用硬件定时实现流水灯

80C51有2个16位定时/计数器:
• T0、T1
80C52有3个16位定时/计数器:
• T0、T1、T2
定时/计数器(Timer/Counter,简称T/C)
定时器:来一个机器脉冲计数器的值加1 。当计数器值溢出(全1)时回0,定时时间 到,中断标志TF置1.
1个机器周期=12*1/振荡频率
任务三 利用硬件 定时实现流水灯
LOGO
常用延时方法
非精确延时
• For(i=0;i<100;i++); • i=0;while(i--);
精确延时
• 利用库函数_nop_ ( ) ; //延时一个机器周期
(需要include<intrins.h>)
• 利用定时器进行定时
定时/计数器(Timer/Counter,简称T/C)
LOGO
M1和M0:T0和T1工作方式控制位。定时/计数器的工作方 式有M1M0两位状态决定,这两位有四种编码方式,对应
于四种工作方式。四种方式定义如表所示:
M1M0 00 01 10 11
方式 方式0 方式1 方式2
方式3
说明
TL的低5位和TH的8位构成13位计数器
TL的8位和TH的8位构成16位的计数器
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时,计数器
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; }
dec=1;
for(i=0;i<8;i++)
{
while(TF0!=1);
TH0=0x3c; TL0=0xb0;
TF0=0;
P1=value;
value=value-dec;
dec=dec*2; }
}
时间间隔1s=20*50ms的流水灯; 书上方法
#include<reg52.h>50ms 初值=15536=0x3CB0
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;
void main()
LOGO
单片机定时器/计数器结构图
LOGO
定时器的工作原理: 定时器/计数器是一个加“1”计数器,来一个脉冲
即进行加1计数,直至计数器的各位全为“1”,再来一 个脉冲,计数器回0(即溢出),且使TF0(定时器0)或 TF1(定时器1)置1,表示时间到,计数值乘以脉冲周期 就是定时时间。
输入的脉冲来源有2个:一个是单片机晶体振荡器经 12分频;另一个是T0/T1端的外部输入脉冲。作定时器用 时,应采用晶体振荡器经12分频的脉冲。
具有自动重装功能的8位计数器 T0分成两个独立的计数器,T1可工作
在方式0~方式2
LOGO
TCON
可位寻址, 也可字节寻址
TF1 TR1 TF0 TR0 IE1 IP1 IE0 IP0
M1M0
00:方式0,13位计数寄存器 01:方式1 ,16位计数寄存器,用于定时
和计数 10:方式2 ,自动重装载8位计数寄存器
LOGO
定时器功能
两个寄存器:TMOD和TCON 4个计数寄存器:TH0,TL0;TH1,TL1
方式1: 定时时间=(65536-初值)*12/振荡频率
初值=65536-定时时间*振荡频率/12
例如定时1ms:
初值=65536-1s*12*103Hz/12 =65536-1000 =64536 =0xFC18
启动开始工作;为0时,计数器停止工作。 当GATE=1时,计数器的启动要由外部中断信号和TR0、和 TR1共同控制。只有当外部中断引脚为高电平,TR0/TR1
置1时才能启动计数器工作。
LOGO
C /T :功能选择位。当=0时选择定时功能,计数脉冲由 内部提供,计数周期等于机器周期。当=1时选择为计数 功能,计数脉冲为外部引脚T0、T1引入的外部脉冲信号。
{
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; }
}
}
复习
定时器定时功能的使用
• 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; }
value=value-dec; dec=dec*2; } }
操作练习1
请用定时器0实现:
• 时间间隔50ms的流水灯; • 时间间隔1s的流水灯;
操作练习2
请用硬件定时器实现:
任选三个LED灯,分别作为红、黄、绿交 通灯,实现绿灯亮1s,然后黄灯快闪3次,再 红灯亮2s,黄灯快闪3次,绿灯亮1s,……
计数器:在机器周期内采样T0(或T1) 脉冲的下降沿,来一个下降沿计数器的 值加1。当计数器值溢出(全1)时回0,中 断标志TF置1.
1。定时器知识 (1)定时器/计数器的内部结构及工作原理
单片机内部设有2个16位的可编程的定时器/计数器。 简称为定时器0(T0)、定时器1(T1)。可编程是指其 功能(如工作模式、定时时间等)均可通过指令来确定 或改变。
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;
TMOD=0x01;
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;
TR0=1;
//此位可位操作
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; }
定时1ms 初值=65536-1000=0xFC18
#include<reg52.h>
sbit P1_0=P1^0;
void main()
{
TMOD=0x01;
TH0=0xfc; TL0=0x18;
TR0=1;
//此位可位操作
while(1)
{ if(1==TF0)
{TH0=0xfc; T
4.检测定时器溢出(TF==1),溢出时:复位TF, 计数寄存器赋初值,定时到触发的动作。
if(1==TF0) {TH0=0xff; TL0=0x00; TF0=0; P1_0=~P1_0; }
或if(1==TF1) {TH1=0xfc; TL1=0x18;
TF1=0; P1_0=~P1_0; }
{ 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;
,用于波特率发生器 11:方式3,2个8位计数寄存器
合集下载

流水灯(定时器延时)

流水灯(定时器延时)
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*********************************************************************************/ /* 出口参数:无 ******************************************************************************/ /*********************************************************************************************/

定时器控制流水灯实验

定时器控制流水灯实验

实验二定时器控制流水灯实验一、实验目的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秒,循环往复直至断电或者复位。

五种编程方式实现流水灯的单片机C程序

五种编程方式实现流水灯的单片机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.中断编程方式:中断编程方式是一种基于中断事件的编程方式,通过在特定的中断事件触发时改变灯光状态来实现流水灯效果。

实验三流水灯实验(io口和定时器实验)

实验三流水灯实验(io口和定时器实验)

实验三流水灯实验(I/O口和定时器实验)一、实验目的1.学会单片机I/O口的使用方法和定时器的使用方法;2.掌握延时子程序的编程方法、内部中断服务子程序的编程方法;3.学会使用I/O口控制LED灯的应用程序设计。

二、实验内容1.控制单片机P1口输出,使LED1~LED8右循环轮流点亮(即右流水),间隔时间为100毫秒。

2.控制单片机P1口输出,使LED1~LED8左循环轮流点亮(即左流水),间隔时间为100毫秒。

3.使用K1开关控制上面LED灯的两种循环状态交替进行;4. 用定时器使P1口输出周期为100ms的方波,使LED闪烁。

5.使用定时器定时,使LED灯的两种循环状态自动交替,每一种状态持续1.6秒钟(选作)。

三、实验方法和步骤1.硬件电路设计使用实验仪上的E1、E5和E7模块电路,把E1区的JP1(单片机的P1口)和E5区的8针接口L1~L8(LED的驱动芯片74HC245的输入端)连接起来,P1口就可以控制LED 灯了。

当P1口上输出低电平“0”时,LED灯亮,反之,LED灯灭。

E7区的K1开关可以接单片机P3.0口,用P3.0口读取K1开关的控制信号,根据K1开关的状态(置“1”还是置“0”),来决定LED进行左流水还是右流水。

综上,画出实验电路原理图。

2.程序设计实验1和实验2程序流程图如图3-1实验3程序流程图如图3-2所示。

图3-1 实验1,2程序流程图图3-2 实验3程序流程图实验4程序流程图如图3-3,3-4所示。

实验5程序流程图如图3-5,3-6所示。

图3-5 实验5主程序流程图图3-6 定时器中断服务子程序流程图图3-4 定时器中断服务子程序流程图图3-3 实验4主程序流程图编程要点:(1)Pl,P3口为准双向口,每一位都可独立地定义为输入或输出,在作输入线使用前,必须向锁存器相应位写入“1”,该位才能作为输入。

例如:MOV P1,A; P1口做输出MOV P1,#0FFHMOV A,P1;P1口做输入SETB P3.0MOV C,P3.1;从P3.1口读入数据(2)每个端口对应着一个寄存器,例:P1→90H(P1寄存器地址);P3→B0H(P3寄存器地址);寄存器的每一位对应着一个引脚,例:B0H.0→P3.0(3)对寄存器写入“0”、“1”,对应的外部引脚则输出“低电平”、“高电平”。

LINUX驱动程序LED+定时器实现流水灯,TQ2440上试验通过

LINUX驱动程序LED+定时器实现流水灯,TQ2440上试验通过

LINUX驱动程序LED+定时器实现流水灯,TQ2440上试验通过驱动程序代码如下:#include#include#include#include#include#include#include#include#include#include#include#include#define LED_MAJOR 244#define GPBCON_CFG_V AL ( (1<<10) | (1<<12) | (1<<14) | (1<<16) ) //GPB5,6,7,8 output mode#define LED1 1#define LED2 2#define LED3 3#define LED4 4#define ON 1#define OFF 0static unsigned long led_major = LED_MAJOR;struct led_dev{struct cdev cdev;struct timer_list s_timer;atomic_t led_no;atomic_t sec_counter;};struct led_dev *led_devp;volatile unsigned int *GPBCON=NULL;volatile unsigned int *GPBDAT=NULL;static void sec_timer_handler(unsigned long arg){int num;mod_timer(&led_devp->s_timer,jiffies+HZ);atomic_inc(&led_devp->sec_counter);num = atomic_read(&led_devp->led_no);if(num == 4){atomic_set(&led_devp->led_no,1);}else{atomic_inc(&led_devp->led_no);}}static int led_open(struct inode *inode,struct file *filp) { struct timer_list *timer;timer = &led_devp->s_timer;init_timer(timer);timer->function = sec_timer_handler;timer->expires = jiffies+HZ;add_timer(timer);atomic_set(&led_devp->sec_counter,0);atomic_set(&led_devp->led_no,0);return 0;}static int led_release(struct inode *inode, struct file *filp) {del_timer(&led_devp->s_timer);return 0;}static ssize_t led_read(struct file *filp, char __user *buf,size_t size, loff_t *ppos){int count,led_no;int result;count = atomic_read(&led_devp->sec_counter);led_no = atomic_read(&led_devp->led_no);result = (count<<3)+led_no;if(put_user(result,(int*)buf)){return -EFAULT;}else{return sizeof(int);}}static int led_ioctl(struct inode* inode, struct file* filp, unsigned int cmd, unsigned long arg){if( (arg > 4) || (arg < 1) ){printk(KERN_NOTICE "Led No. Error!\n");}switch(cmd){case OFF: *GPBDAT |= 1<<(arg+4);break;case ON: *GPBDAT &= ~(1<<(arg+4));break;default: printk(KERN_NOTICE "cmd error!\n");}return 0;}static const struct file_operations led_fops ={.owner = THIS_MODULE,.read = led_read,.open = led_open,.ioctl = led_ioctl,.release = led_release,};static void led_setup_cdev(struct led_dev *dev, int index) {int err,devno = MKDEV(led_major,index);cdev_init(&dev->cdev,&led_fops);dev->cdev.owner = THIS_MODULE;err = cdev_add(&dev->cdev,devno,1);if(err){printk(KERN_NOTICE "Error %d adding %d\n",err,index); }}static int led_init(void)int result;dev_t devno = MKDEV(led_major,0);if(led_major)result = register_chrdev_region(devno,1,"led");else{result = alloc_chrdev_region(&devno,0,1,"led");led_major = MAJOR(devno);}if(result<0){printk("register failed!");return result;}/*涓鸿澶囨弿杩扮粨鏋勫垎閰嶅唴瀛?/led_devp =(struct led_dev*)kmalloc(sizeof(struct led_dev),GFP_KERNEL);if(!led_devp){result = -ENOMEM;unregister_chrdev_region(devno,1);}memset(led_devp, 0 ,sizeof(struct led_dev));led_setup_cdev(led_devp,0);GPBCON = (volatile unsigned int*)ioremap(0x56000010,16);GPBDAT = GPBCON+1;*GPBCON = GPBCON_CFG_V AL;*GPBDAT |= 0xf<<5;return 0;static void led_exit(void){cdev_del(&led_devp->cdev);kfree(led_devp);unregister_chrdev_region(MKDEV(led_major,0),1); }MODULE_LICENSE("GPL");MODULE_AUTHOR("Vanbreaker");module_init(led_init);module_exit(led_exit);测试程序代码如下:#include#include#include#include#include#define ON 1#define OFF 0int main(){int fd;int led_no,count = 0,old_count = 0;int ret;fd = open("/dev/led_timer",O_RDWR);if(fd != -1){while(1){read(fd,&ret,sizeof(int));led_no = ret&0x07;count = ret>>3;if(count != old_count){if(led_no!=1){ioctl(fd,OFF,led_no-1);}else{ioctl(fd,OFF,4);}ioctl(fd,ON,led_no);printf("Led NO:%d sec:%d\n",led_no,count); old_count = count;}}}else{printf("Cannot Open File");}}。

嵌入式系统流水灯按键定时器实验报告范文

嵌入式系统流水灯按键定时器实验报告范文

嵌入式系统流水灯按键定时器实验报告范文实验报告姓名:学号:学院:专业:班级:指导教师:实验1、流水灯实验1.1实验要求编程控制实验板上LED灯轮流点亮、熄灭,中间间隔一定时间。

1.2原理分析实验主要考察对STM32F10某系列单片机GPIO的输出操作。

参阅数据手册可知,通过软件编程,GPIO可以配置成以下几种模式:◇输入浮空◇输入上拉◇输入下拉◇模拟输入◇开漏输出◇推挽式输出◇推挽式复用功能◇开漏式复用功能根据实验要求,应该首先将GPIO配置为推挽输出模式。

由原理图可知,单片机GPIO输出信号经过74HC244缓冲器,连接LED灯。

由于74HC244的OE1和OE2都接地,为相同电平,故A端电平与Y端电平相同且LED灯共阳,所以,如果要点亮LED,GPIO应输出低电平。

反之,LED灯熄灭。

1.3程序分析软件方面,在程序启动时,调用SytemInit()函数(见附录1),对系统时钟等关键部分进行初始化,然后再对GPIO进行配置。

GPIO配置函数为SZ_STM32_LEDInit()(见附录2),函数中首先使能GPIO时钟:RCC_APB2PeriphClockCmd(GPIO_CLK[Led],ENABLE);然后配置GPIO输入输出模式:GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;再配置GPIO端口翻转速度:GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;最后将配置好的参数写入寄存器,初始化完成:GPIO_Init(GPIO_PORT[Led],&GPIO_InitStructure)。

初始化完成后,程序循环点亮一个LED并熄灭其他LED,中间通过Delay()函数进行延时,达到流水灯的效果(程序完整代码见附录3)。

实验程序流程图如下:硬件方面,根据实验指南,将实验板做如下连接:1.3实验结果实验二、按键实验2.1实验要求利用STM32读取外部按键状态,按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯亮起。

简易流水灯设计实验报告

简易流水灯设计实验报告1. 引言流水灯是一种常见的电子设计,通过控制LED灯的亮灭顺序,可以呈现出一种像水流一样的效果。

本实验旨在通过使用开发板和少量的电子元件,设计一个简易的流水灯电路。

本报告将介绍实验的设计过程、实验所用材料和电路连接方式,以及实验结果和分析。

2. 实验材料和器件- Arduino开发板- 电阻(220Ω)- LED灯(6个)- 面包板- 连接线3. 实验原理本实验的原理非常简单,即通过控制每个LED的亮灭状态和时间间隔,实现流水灯的效果。

具体实现的方法是使用Arduino开发板的IO引脚来驱动LED灯,通过改变每个LED的亮灭顺序和时间间隔,可以实现流水灯效果。

4. 实验步骤4.1 硬件连接首先,将Arduino开发板插入面包板,并确保连接稳定和可靠。

然后按照以下方式连接LED灯和电阻:- 将电阻的一个端口连接到Arduino开发板的数字IO引脚(如D2-D7)。

- 将电阻的另一个端口连接到负极(即地GND)。

将LED灯的长脚(阳极)连接到电阻与Arduino引脚的连接点,将短脚(阴极)连接到GND。

4.2 硬件设置在Arduino开发板上设置电阻连接的引脚为输出模式,以便控制LED灯的亮灭状态。

具体的引脚设置可以在Arduino开发环境的代码中完成。

4.3 软件编写使用Arduino开发环境,编写相应的代码实现流水灯的效果。

代码示例如下:cvoid setup() {设置引脚为输出模式for (int i = 2; i <= 7; i++) {pinMode(i, OUTPUT);}}void loop() {顺序点亮和熄灭LED灯for (int i = 2; i <= 7; i++) {digitalWrite(i, HIGH);delay(250);digitalWrite(i, LOW);delay(250);}逆序点亮和熄灭LED灯for (int i = 7; i >= 2; i) {digitalWrite(i, HIGH);delay(250);digitalWrite(i, LOW);delay(250);}}4.4 上传和运行将编写好的程序上传到Arduino开发板,并通过开发环境的串口监视器进行编译和调试。

任务五 定时控制流水灯


C1
22pF
X1 R1
1k 12MHz
U1
19 XTAL1 P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17
#include <reg51.h> Void main() { unsigned char i; TMOD=0x10; //设置Timer 1工作在方式1下定时模式 for (i=0; i<50; i++) //重复定时计数器,定时50次 { TH1=(65536-20000)/256; //往TH1中载入计数初值高8位 TL1=(65536-20000)%256; //往TL1中载入计数初值低8位定时20ms TR1=1; //启动Timer 1 while (!TF1) ; //检测Timer1溢出标志,当TF1=1,跳出 TR1=0; //关闭Timer 1 TF1=0; //将TF1清0 } }
//设置Timer 1工作在方式1下定时模式 //重复定时计数器,定时50次 //往TL1和TH1中载入计数的初始值B1E0H //定时20ms //启动Timer 1 //检测Timer1溢出标志,当TF1=1,跳出 //关闭Timer 1 //将TF1清0

0305 定时器控制流水灯程序设计


THANK YOU!
定时器控制流水灯程序设计
PLC执行[>= T0 K20]指令和[< T0 K30] 指令,判断T0的经过值 是否在2~3秒时间段,如果T0的经 过值在此时段内,则PLC执行[MOV K4 K2Y000]指令,Y2线圈得电, 第3盏彩灯点亮。
任务实施
› (2)采用当前值比较方式编写程序
PLC执行[>= T0 K30]指令和[< T0 K40] 指令,判断T0的经过值是否在3~4 秒时间段,如果T0的经过值在此时段内,则PLC执行[MOV K8 K2Y000]指令 ,Y3线圈得电,第4盏彩灯点亮。 PLC执行[>= T0 K40]指令和[< T0 K50] 指令,判断T0的经过值是否在4~5 秒时间段,如果T0的经过值在此时段内,则PLC执行[MOV K16 K2Y000]指令 ,Y4线圈得电,第5盏彩灯点亮。
知识储备
定时器 时钟脉冲周期 编号范围(共256个) 定时范围
通用 定时器
100ms 10ms
T0~T199,共200个 0.1~3276.7s T200~T245,共46个 0.01~327.67s
积算 定时器
1ms 100ms
T246~T249,共4个 0.001~32.767s T250~T255,共6个 0.1~3276.7s
知识储备
› 1)通用定时器
在任意时刻,如果定时 器T0被断电或者是驱 动输入X000被断开, 定时器T0将被立即复 位,累计值清零、输出 触点复位。
当T0累计值等于设 定值K50时,定时 器T0的输出触点动 作,Y000得电。
X000接通,T0开 始对100ms的时钟 脉冲进行累计。
知识储备ቤተ መጻሕፍቲ ባይዱ

使用定时器1实现1秒定时,控制流水灯流水点亮。中断方式(PR=9)

使⽤定时器1实现1秒定时,控制流⽔灯流⽔点亮。

中断⽅式(PR=9)/***************************************************************************** ⽂件名:main.c* 功能:使⽤定时器0实现1秒定时,控制蜂鸣器蜂鸣。

(中断⽅式)* 说明:短接蜂鸣器跳线JP7。

断开CF卡跳线JP13、GPIO接⼝J17。

****************************************************************************/#include "config.h"#define LED1 1<<16 // P1.16#define LED2 1<<17 // P1.17#define LED3 1<<18 // P1.18#define LED4 1<<19 // P1.19#define LED5 1<<20 // P1.20#define LED6 1<<21 // P1.21#define LED7 1<<22 // P1.22#define LED8 1<<23 // P1.23#define LEDCON 0x00ff0000const uint32 DISP_TAB[8] = { 0xff01ffff, 0xff02ffff, 0xff04ffff, 0xff08ffff,0xff10ffff, 0xff20ffff, 0xff40ffff, 0xff80ffff};/***************************************************************************** 名称:IRQ_Time0()* 功能:定时器0中断服务程序,取反BEEPCON控制⼝。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档