0305 定时器控制流水灯程序设计
- 格式:pptx
- 大小:1.35 MB
- 文档页数:24
五种编程方式实现流水灯的单片机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流水灯的工作原理、电路设计及编程实现。
通过本课程的学习,学生应达到以下目标: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.团队合作项目:评估学生在团队中的协作能力和沟通表达能力。
实验三流水灯实验(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上试验通过驱动程序代码如下:#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端口的每个位来实现的,因此程序显得有点简单,下面我们采用循环移位指令,采纳循环程序结构进行编程。
流水灯设计专业班级学生指导教师日期2011年7 月7日一.名称:流水灯设计方法:1.利用555定时器制作一个秒信号发生器。
(1).555定时器的结构图图1.555定时器结构图(2).555定时器功能表(3).秒信号产生计算参数:图.3. 用555做的多谐振荡器因为R1=R2,所有取2搞47KΩ和一个2KΩ的电阻串联。
就得到如图3的设计图。
2.控制电路(1).用分配器控制彩灯的流水式.74HC4017中1-7,9-11为输出管脚,输出为1000000000—010*******—0010000000—0001000000——0000100000——0000010000——00000001000——0000000100——00000000010——0000000001——1000000000.符号如下图。
逻辑图封装图14管脚是时钟输入端。
13是低电平有效。
15清零端端。
12管脚为进位端。
这个设计中我们只用1个芯片,所有不用12端。
(2).时序波形图3.仿真过程通过一个星期的课程设计,我们了解到此次设计主要是完成LED循环闪烁电路的设计,当我把准备好关于此次课程设计的资料分析后,我没有到学校的实验室进行本次课程设计,而是天天在寝室或者图书馆来回跑,进过这些天的努力,终于完成了12V直流稳压电源和LED循环闪烁次得任务。
当我把电路连接好后,做了最后的检查,在检查过后,就是进行电路仿真过程。
当电路仿真成功后,就是进行LED循环闪烁电路部分的观察,当通电后,LED 循环闪烁,在通电后,看LED灯是否按照我们本次课程设计的要求进进行闪烁,如果不按照要求闪烁的话,再进行电路的检查,直到结果正确才成功。
检查电路设计的原理图即导线的链接,并确定导线的链接与电路原理图一致。
检查导线的链接,并检查导线是否断路,根据电路原理图,检查各导线对应的按点是否接好。
检查完线路,确定电路完全连好。
点击运行仿真,这是可以看到电路发光情况。