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

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

#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit jiak=P2^3;sbit youyik=P2^2;sbit zuoyik=P2^1;sbit jiank=P2^0;sbit int1k=P3^3;sbit FMQ=P1^1;sbit CLK=P3^5;//1302时钟信号线sbit IO=P3^6;//1302的I/O数据线sbit RST=P3^7;//1302的RST复位线void InputByte(uchar);//输入1Byteuchar OutputByte(uchar);//输出1Bytevoid W1302(uchar,uchar);uchar R1302(uchar);uchar tab[6];void key();void display();void init();uchar a,c,i,b;//c表示中断次数a表示数码管移位次数uint temp;uchar miao,fen,shi;uchar tab1[7]={0x40,0x59,0x11,0x11,0x02,0x06,0x06};uchar code tab2[10]={0x88,0Xbe,0Xc4,0X94,0Xb2,0X91,0X81,0Xbc,0X80,0X90}; sbit zy=P2^1;sbit yy=P2^2;bit flagg;uchar zz,time;uchar code tabp0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff}; uchar code tabp2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef};//延时1msvoid delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//往1302写入1Byte d为写入的数据入口参数void InputByte(uchar date){uchar i;ACC=date;for(i=8;i>0;i--){IO=ACC0;//相当于汇编中的RRCCLK=1;CLK=0;ACC=ACC>>1;}}//从1302读取1Byte数据返回值ACCuchar OutputByte(void){uchar i;for(i=8;i>0;i--){ACC=ACC>>1;ACC7=IO;CLK=1;CLK=0;}return(ACC);}//往1302写入数据先写地址后写数据ucADD ucDA是入口参数void W1302(uchar addr,uchar date){RST=0;CLK=0;RST=1;InputByte(addr);//写地址InputByte(date);//写1Byte数据CLK=1;RST=0;}//读取1302某地址的数据先写地址后读数据ucAddr入口地址ucDa是返回值uchar R1302(uchar addr){uchar date;RST=0;CLK=0;RST=1;InputByte(addr);//写地址date=OutputByte();//读1Byte数据CLK=1;RST=0;return(date);}//初始化设置初始值void init(){uchar i1;uchar addr=0x80;W1302(0x8e,0x00);//控制命令字节WP=0 写操作for(i1=0;i1<7;i1++){W1302(addr,tab1[i1]);//秒分时日月星期年addr+=2;}W1302(0x90,0xa6);W1302(0x8e,0x80);//控制命令字节WP=1写保?}void display(){uchar Curtime[7];uchar i,i2;uchar addr=0x81;for(i2=0;i2<7;i2++){Curtime[i2]=R1302(addr);//格式秒分时日月星期年addr+=2;}miao=Curtime[0];if(time!=miao){ time=miao;flagg=1;}fen=Curtime[1];shi=Curtime[2];tab[5]=miao%16;tab[4]=miao/16;tab[3]=fen%16;tab[2]=fen/16;tab[1]=shi%16;tab[0]=shi/16;for(i=0;i<6;i++){SBUF=tab2[tab[i]];while(!TI);TI=0;}delay(20);if(flagg==1){flagg=0;P0=tabp0[zz];P2=tabp2[zz];zz++;if(zz==12)zz=0;FMQ=0;delay(20);FMQ=1;}}//主函数void main(){display();if(shi==0x00&&fen==0x00&&miao==0x80)init();EA=1;EX1=1;IT1=1;while(1){if(c!=1)display();if(fen==0x00&&miao<=5)FMQ=0;}}//外部中断1void int1() interrupt 2{while(1){if(int1k==0) //扫描p3{delay(20);if(int1k==0){while(!int1k);W1302(0x8e,0x00);a=1;c++;if(c==2)c=0;}}if(c==1){if(youyik==0) //扫描键盘{delay(20);if(youyik==0){while(!youyik);a+=2;if( a==7) a=1;}}if(zuoyik==0){delay(20);if(zuoyik==0){while(!zuoyik);if( a==1)a=7;a-=2;}}for(i=0;i<6;i++) //这个循环是个关键{if( a==i){b=a;SBUF=0xff;}else SBUF=tab2[tab[i]];while(!TI);TI=0;}delay(100);if(b==a){if(jiak==0){delay(20);if(jiak==0){while(!jiak);switch(b){case 1: tab[1]++;if(tab[1]==10){ tab[1]=0;tab[0]++;}if(tab[0]==2&&tab[1]==4){tab[0]=0;tab[1]=0;}shi=tab[0]*10+tab[1];W1302(0x84,(shi/10)*16+shi%10);break;case 3: tab[3]++;if(tab[3]==10){ tab[3]=0;tab[2]++;}if(tab[2]==6&&tab[3]==0){tab[2]=0;tab[3]=0;}fen=tab[2]*10+tab[3];W1302(0x82,(fen/10)*16+fen%10);break;case 5: tab[5]++;if(tab[5]==10){ tab[5]=0;tab[4]++;}if(tab[4]==6&&tab[5]==0){tab[4]=0;tab[5]=0;}miao=tab[4]*10+tab[5];W1302(0x80,(miao/10)*16+miao%10);break;}}}if(jiank==0){delay(20);if(jiank==0){while(!jiank);switch(b){case 1: if(tab[0]==0&&tab[1]==0){ tab[0]=2;tab[1]=4;}if(tab[1]==0){ tab[1]=10;tab[0]--;}tab[1]--;shi=tab[0]*10+tab[1];W1302(0x84,(shi/10)*16+shi%10);break;case 3: if(tab[2]==0&&tab[3]==0){ tab[2]=6;tab[3]=0;}if(tab[3]==0){ tab[3]=10;tab[2]--;}tab[3]--;fen=tab[2]*10+tab[3];W1302(0x82,(fen/10)*16+fen%10);break;case 5: if(tab[4]==0&&tab[5]==0){ tab[4]=6;tab[5]=0;}if(tab[5]==0){ tab[5]=10;tab[4]--;}tab[5]--;miao=tab[4]*10+tab[5];W1302(0x80,(miao/10)*16+miao%10);break;}}}}for(i=0;i<6;i++){SBUF=tab2[tab[i]];while(!TI);TI=0;}delay(100);}if(c==0)break;}}#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit jiak=P2^3;sbit youyik=P2^2;sbit zuoyik=P2^1;sbit jiank=P2^0;sbit int1k=P3^3;sbit FMQ=P1^1;sbit CLK=P3^5;//1302时钟信号线sbit IO=P3^6;//1302的I/O数据线sbit RST=P3^7;//1302的RST复位线void InputByte(uchar);//输入1Byteuchar OutputByte(uchar);//输出1Bytevoid W1302(uchar,uchar);uchar R1302(uchar);uchar tab[6];void key();void display();void init();uchar a,c,i,b;//c表示中断次数a表示数码管移位次数uint temp;uchar miao,fen,shi;uchar tab1[7]={0x40,0x59,0x11,0x11,0x02,0x06,0x06};uchar code tab2[10]={0x88,0Xbe,0Xc4,0X94,0Xb2,0X91,0X81,0Xbc,0X80,0X90}; sbit zy=P2^1;sbit yy=P2^2;bit flagg;uchar zz,time;uchar code tabp0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff}; uchar code tabp2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef};//延时1msvoid delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//往1302写入1Byte d为写入的数据入口参数void InputByte(uchar date){uchar i;ACC=date;for(i=8;i>0;i--){IO=ACC0;//相当于汇编中的RRCCLK=1;CLK=0;ACC=ACC>>1;}}//从1302读取1Byte数据返回值ACCuchar OutputByte(void){uchar i;for(i=8;i>0;i--){ACC=ACC>>1;ACC7=IO;CLK=1;CLK=0;}return(ACC);}//往1302写入数据先写地址后写数据ucADD ucDA是入口参数void W1302(uchar addr,uchar date){RST=0;CLK=0;RST=1;InputByte(addr);//写地址InputByte(date);//写1Byte数据CLK=1;RST=0;}//读取1302某地址的数据先写地址后读数据ucAddr入口地址ucDa是返回值uchar R1302(uchar addr){uchar date;RST=0;CLK=0;RST=1;InputByte(addr);//写地址date=OutputByte();//读1Byte数据CLK=1;RST=0;return(date);}//初始化设置初始值void init(){uchar i1;uchar addr=0x80;W1302(0x8e,0x00);//控制命令字节WP=0 写操作for(i1=0;i1<7;i1++){W1302(addr,tab1[i1]);//秒分时日月星期年addr+=2;}W1302(0x90,0xa6);W1302(0x8e,0x80);//控制命令字节WP=1写保?}void display(){uchar Curtime[7];uchar i,i2;uchar addr=0x81;for(i2=0;i2<7;i2++){Curtime[i2]=R1302(addr);//格式秒分时日月星期年addr+=2;}miao=Curtime[0];if(time!=miao){ time=miao;flagg=1;}fen=Curtime[1];shi=Curtime[2];tab[5]=miao%16;tab[4]=miao/16;tab[3]=fen%16;tab[2]=fen/16;tab[1]=shi%16;tab[0]=shi/16;for(i=0;i<6;i++){SBUF=tab2[tab[i]];while(!TI);TI=0;}delay(20);if(flagg==1){flagg=0;P0=tabp0[zz];P2=tabp2[zz];zz++;if(zz==12)zz=0;FMQ=0;delay(20);FMQ=1;}}//主函数void main(){display();if(shi==0x00&&fen==0x00&&miao==0x80)init();EA=1;EX1=1;IT1=1;while(1){if(c!=1)display();if(fen==0x00&&miao<=5)FMQ=0;}}//外部中断1void int1() interrupt 2{while(1){if(int1k==0) //扫描p3{delay(20);if(int1k==0){while(!int1k);W1302(0x8e,0x00);a=1;c++;if(c==2)c=0;}}if(c==1){if(youyik==0) //扫描键盘{delay(20);if(youyik==0){while(!youyik);a+=2;if( a==7) a=1;}}if(zuoyik==0){delay(20);if(zuoyik==0){while(!zuoyik);if( a==1)a=7;a-=2;}}for(i=0;i<6;i++) //这个循环是个关键{if( a==i){b=a;SBUF=0xff;}else SBUF=tab2[tab[i]];while(!TI);TI=0;}delay(100);if(b==a){if(jiak==0){delay(20);if(jiak==0){while(!jiak);switch(b){case 1: tab[1]++;if(tab[1]==10){ tab[1]=0;tab[0]++;}if(tab[0]==2&&tab[1]==4){tab[0]=0;tab[1]=0;}shi=tab[0]*10+tab[1];W1302(0x84,(shi/10)*16+shi%10);break;case 3: tab[3]++;if(tab[3]==10){ tab[3]=0;tab[2]++;}if(tab[2]==6&&tab[3]==0){tab[2]=0;tab[3]=0;}fen=tab[2]*10+tab[3];W1302(0x82,(fen/10)*16+fen%10);break;case 5: tab[5]++;if(tab[5]==10){ tab[5]=0;tab[4]++;}if(tab[4]==6&&tab[5]==0){tab[4]=0;tab[5]=0;}miao=tab[4]*10+tab[5];W1302(0x80,(miao/10)*16+miao%10);break;}}}if(jiank==0){delay(20);if(jiank==0){while(!jiank);switch(b){case 1: if(tab[0]==0&&tab[1]==0){ tab[0]=2;tab[1]=4;}if(tab[1]==0){ tab[1]=10;tab[0]--;}tab[1]--;shi=tab[0]*10+tab[1];W1302(0x84,(shi/10)*16+shi%10);break;case 3: if(tab[2]==0&&tab[3]==0){ tab[2]=6;tab[3]=0;}if(tab[3]==0){ tab[3]=10;tab[2]--;}tab[3]--;fen=tab[2]*10+tab[3];W1302(0x82,(fen/10)*16+fen%10);break;case 5: if(tab[4]==0&&tab[5]==0){ tab[4]=6;tab[5]=0;}if(tab[5]==0){ tab[5]=10;tab[4]--;}tab[5]--;miao=tab[4]*10+tab[5];W1302(0x80,(miao/10)*16+miao%10);break;}}}}for(i=0;i<6;i++){SBUF=tab2[tab[i]];while(!TI);TI=0;}delay(100);}if(c==0)break;}}}。
555流水灯课程设计

555流水灯课程设计一、教学目标本课程旨在让学生了解和掌握555流水灯的工作原理、电路设计及编程实现。
通过本课程的学习,学生应达到以下目标:1.知识目标:–了解555定时器的内部结构和工作原理;–掌握555流水灯的电路设计方法;–理解编程实现555流水灯的逻辑控制。
2.技能目标:–能够运用555定时器设计简单的电路;–能够编写程序实现555流水灯的控制;–能够对555流水灯电路进行调试和故障排除。
3.情感态度价值观目标:–培养学生的创新意识和动手能力;–培养学生团队合作精神和沟通表达能力;–培养学生对电子科技的兴趣和热情。
二、教学内容本课程的教学内容主要包括以下几个部分:1.555定时器的内部结构和工作原理;2.555流水灯的电路设计方法;3.编程实现555流水灯的逻辑控制;4.电路调试和故障排除技巧。
具体的教学大纲安排如下:第一课时:555定时器的内部结构和工作原理;第二课时:555流水灯的电路设计方法;第三课时:编程实现555流水灯的逻辑控制;第四课时:电路调试和故障排除技巧。
三、教学方法为了提高教学效果,本课程将采用多种教学方法,包括:1.讲授法:讲解555定时器的内部结构和工作原理,让学生掌握基本知识;2.案例分析法:分析555流水灯的电路设计案例,让学生学会实际应用;3.实验法:让学生动手搭建555流水灯电路,提高学生的实践能力;4.讨论法:分组讨论编程实现555流水灯的控制,培养学生的团队合作精神。
四、教学资源为了支持教学内容的实施,我们将准备以下教学资源:1.教材:提供关于555定时器和流水灯的相关知识;2.参考书:提供更深入的原理和应用介绍;3.多媒体资料:演示555流水灯的电路设计和编程实现;4.实验设备:提供给学生动手实践的555定时器模块和编程环境。
五、教学评估本课程的教学评估将采用多元化的评估方式,以全面客观地评价学生的学习成果。
评估方式包括:1.平时表现:通过课堂参与、提问、回答问题等方式,评估学生的学习态度和积极性;2.作业:布置相关的作业,评估学生的理解和应用能力;3.考试:进行期中和期末考试,评估学生的知识掌握和运用能力;4.实验报告:评估学生的实验操作能力和分析问题的能力;5.团队合作项目:评估学生在团队中的协作能力和沟通表达能力。
实验三流水灯实验(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上试验通过驱动程序代码如下:#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流水灯硬件原理图从原理图中可以看出,假如要让接在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端口的每个位来实现的,因此程序显得有点简单,下面我们采用循环移位指令,采纳循环程序结构进行编程。
任务五 定时控制流水灯

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
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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的时钟 脉冲进行累计。
知识储备ቤተ መጻሕፍቲ ባይዱ
› 2)积算定时器
任务实施
› (1)采用定时控制方式编写程序
在Y5线圈得电期间,定时器T5开始定时。 当定时器T5定时1秒时间到,PLC执行[MOV K64 K2Y000]指令,使Y6线圈得电,第7 盏彩灯被点亮。
在Y6线圈得电期间,定时器T6开始定时。 当定时器T6定时1秒时间到,PLC执行[MOV K128 K2Y000]指令,使Y7线圈得电,第8 盏彩灯被点亮。
任务实施
› (2)采用当前值比较方式编写程序
PLC执行[>= T0 K110]指令和[< T0 K120] 指令,判断T0的经过值 是否在11~12秒时间段,如果T0的经 过值在此时段内,则PLC执行[MOV K8 K2Y000]指令,Y3线圈得电, 第4盏彩灯点亮。
PLC执行[>= T0 K120]指令和[< T0 K130] 指令,判断T0的经过值 是否在12~13秒时间段,如果T0的 经过值在此时段内,则PLC执行 [MOV K4 K2Y000]指令,Y2线圈 得电,第3盏彩灯点亮。
任务实施
› (1)采用定时控制方式编写程序
在Y3线圈得电期间,定时器T3开始定时。 当定时器T3定时1秒时间到,PLC执行[MOV K16 K2Y000]指令,使Y4线圈得电,第5盏彩灯被点亮。
在Y4线圈得电期间,定时器T4开始定时。 当定时器T4定时1秒时间到,PLC执行[MOV K32 K2Y000]指令,使Y5线圈得电,第6盏彩灯被点亮。
任务实施
› (2)采用当前值比较方式编写程序
PLC执行[>= T0 K50]指令和[< T0 K60] 指令,判断T0的经过值是否在 5~6秒时间段,如果T0的经过值在 此时段内,则PLC执行[MOV K32 K2Y000]指令,Y5线圈得电,第6盏 彩灯点亮。
PLC执行[>= T0 K100]指令和[< T0 K110] 指令,判断T0的经过值 是否在10~11秒时间段,如果T0的 经过值在此时段内,则PLC执行 [MOV K16 K2Y000]指令,Y4线 圈得电,第5盏彩灯点亮。
在Y1线圈得电期间,定时器T1开始 定时。
任务实施
› (1)采用定时控制方式编写程序
当定时器T1定时1秒时间到,PLC执行[MOV K4 K2Y000]指令,使Y2线圈得电,第3盏彩灯被点亮。
在Y2线圈得电期间,定时器T2开始定时。 当定时器T2定时1秒时间到,PLC执行[MOV K8 K2Y000]指令,使Y3线圈得电,第4盏彩灯被点亮。
任务实施
› (1)采用定时控制方式编写程序
在Y4线圈得电期间,定时器T10开始定时。 当定时器T10定时1秒时间到,PLC执行[MOV K8 K2Y000]指令,使Y3线圈得电,第4盏彩灯被点亮。
在Y3线圈得电期间,定时器T11开始定时。 当定时器T11定时1秒时间到,PLC执行[MOV K4 K2Y000]指令,使Y2线圈得电,第3盏彩灯被点亮。
在Y7线圈得电期间,定时器T7开始定时。 当定时器T7定时1秒时间到,PLC执行[MOV K64 K2Y000]指令,使Y6线圈得电,第7 盏彩灯被点亮。
任务实施
› (1)采用定时控制方式编写程序
在Y6线圈得电期间,定时器T8开始定时。 当定时器T8定时1秒时间到,PLC执行[MOV K32 K2Y000]指令,使Y5线圈得电,第6盏彩灯被点亮 。
任务实施
› (1)采用定时控制方式编写程序
当按下启动按钮SB1时,PLC执行 [MOV K1 K2Y000]指令,使Y0线 圈得电,第1盏彩灯被点亮。
在Y0线圈得电期间,定时器T0开始 定时。
当定时器T0定时1秒时间到,PLC执 行[MOV K2 K2Y000]指令,使Y1 线圈得电,第2盏彩灯被点亮。
元件名称 启动按钮 停止按钮
控制功能 启动控制 停止控制
任务分析
说明 PLC软元件
Y0
Y1
Y2
输出
Y3
Y4
Y5
Y6
Y7
元件文字符号
HL1 HL2 HL3 HL4 HL5 HL6 HL7 HL8
元件名称
彩灯1 彩灯2 彩灯3 彩灯4 彩灯5 彩灯6 彩灯7 彩灯8
控制功能
状态显示 状态显示 状态显示 状态显示 状态显示 状态显示 状态显示 状态显示
在Y2线圈得电期间,定时器T12开始定时。
任务实施
› (1)采用定时控制方式编写程序
当定时器T12定时1秒时间到,PLC执行[MOV K2 K2Y000]指令,使Y1线圈得电,第2盏彩灯被点亮。
在Y1线圈得电期间,定时器T13开始定时。
当定时器T13定时1秒时间到,PLC执行[MOV K1 K2Y000]指令,使Y0线圈得电,第1盏彩灯被点亮, 程序进入循环执行状态。
任务实施
› (2)采用当前值比较方式编写程序
当按下启动按钮SB1时,PLC执行[SET M0]指令, M0线圈得电。在M0线圈得电期间,定时器T0开始 计时。 当按下停止按钮SB2时,PLC执行[RST M0]指令, M0线圈失电。由于定时器T0的当前值为0,所以 PLC执行[MOV K0 K2Y000]指令,使输出继电器被 复位,彩灯全部被熄灭。
在Y5线圈得电期间,定时器T9开始定时。 当定时器T9定时1秒时间到,PLC执行[MOV K16 K2Y000]指令,使Y4线圈得电,第5盏彩灯被点亮 。
在Y4线圈得电期间,定时器T10开始定时。 当定时器T10定时1秒时间到,PLC执行[MOV K8 K2Y000]指令,使Y3线圈得电,第4盏彩灯被点亮 。
任务实施
› (2)采用当前值比较方式编写程序
PLC执行[>= T0 K70]指令和[< T0 K80] 指令,判断T0的经过值是否在 7~8秒时间段,如果T0的经过值在 此时段内,则PLC执行[MOV K128 K2Y000]指令,Y7线圈得电,第8盏 彩灯点亮。
PLC执行[>= T0 K80]指令和[< T0 K90] 指令,判断T0的经过值 是否在8~9秒时间段,如果T0的经 过值在此时段内,则PLC执行[MOV K64 K2Y000]指令,Y6线圈得电, 第7盏彩灯点亮。
PLC执行[> T0 K0]指令和[< T0 K10] 指令,判断T0的经过值是否在 0~1秒时间段,如果T0的经过值在此时段内,则PLC执行[MOV K1 K2Y000]指令,Y0线圈得电,第1盏彩灯点亮。
任务实施
› (2)采用当前值比较方式编写程序
PLC执行[>= T0 K10]指令和[< T0 K20] 指令,判断T0的经过值是否在 1~2秒时间段,如果T0的经过值在 此时段内,则PLC执行[MOV K2 K2Y000]指令,Y1线圈得电,第2盏 彩灯点亮。
任务实施
› (2)采用当前值比较方式编写程序
PLC执行[>= T0 K130]指令和[< T0 K140] 指令,判断T0的经过值是否在13~14秒时间段,如 果T0的经过值在此时段内,则PLC执行[MOV K2 K2Y000]指令,Y1线圈得电,第2盏彩灯点亮。 PLC执行[= T0 K140]指令,判断T0的当前值是否是14秒,如果T0的当前值是14秒,则PLC执行 [MOV K0 T0]指令,定时器T0被复位,使程序进入循环执行状态。
《PLC应用技术》
定时器应用程序设计
定时器控制流水灯程序设计
布置任务
定时器控制流水灯程序 设计
用两个控制按钮,控制八个彩灯实现单点左右循 环点亮,时间间隔为一秒。 当按下按钮启动时,彩灯开始循环点亮; 当按下停止按钮时,彩灯立即全部熄灭。
任务分析
任务分析
说明 输入
PLC软元件 X0 X1
元件文字符号 SB1 SB2
任务实施
› (2)采用当前值比较方式编写程序
PLC执行[>= T0 K50]指令和[< T0 K60] 指令,判断T0的经过值是否在 5~6秒时间段,如果T0的经过值在 此时段内,则PLC执行[MOV K32 K2Y000]指令,Y5线圈得电,第6盏 彩灯点亮。