当前位置:文档之家› 用单片机实现流水灯的控制设计知识分享

用单片机实现流水灯的控制设计知识分享

用单片机实现流水灯的控制设计用单片机实现流水灯的控制设计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 软件流程框图及程序清单按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。

AT89C51单片机是美国ATMEL公司生产的低电压、高性能CMOS 8位单片机,具有丰富的内部资源:4kB闪存、128BRAM、32根I/O口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.25~5.50V的电压工作范围和0~24MHz工作频率,使用AT89C51单片机时无须外扩存储器。

因此,本流水灯实际上就是一个带有八个发光二极管的单片机最小应用系统,即为由发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。

其具体硬件组成如图1所示。

图1 流水灯硬件原理图2.1 硬件组成分析1)总体方案设计分析要求用8DC52的P0口做为输出,接8个发光二极管,从而实现8位流水灯的显示效果,在C口的地两位接两个开关,实现两个扩展功能的控制。

:基本流水灯显示电路如果要让接在P0.0口的 D5亮起来,那么只要把P0.0口的电平变为低电平就可以了;相反,如果要接在P0.0口的 D5灯熄灭,就要把P0.0口的电平变为高电平;同理,接在P0.1~P0.7口的其他7个LED的点亮和熄灭的方法同D5。

因此,要实现流水灯功能,我们只要将发光二极管 D1~D8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。

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 软件流程框图及程序清单从原理图中可以看出,如果要让接在P1.0口的LED1亮起来,那么只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平;同理,接在P1.1~P1.7口的其他7个L ED的点亮和熄灭的方法同LED1。

因此,要实现流水灯功能,我们只要将发光二极管LED1~LED8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。

在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。

3.软件编程#include<reg51.h>#include<intrins.h>#define uchar unsigned char //定义无符号字符#define uint unsigned int //定义无符号整数sbit k1=P3^4 ; //增加键sbit k2 =P3^5 ; //减少键unsigned char PWM=0x7f; //赋初值int ch=100;unsigned char temp=0xff;unsigned char shu=0x00;unsigned char k=0;unsigned char m=1;void delayms(char ms);//void liu();void line();void shudu();void fangxiang();void delay(uint t) ;void tiao();unsigned char const zu[]={ 0xff, 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f, };void main(){ P1=0xff;// P0=0xff;TMOD=0x21 ;TH0=0xff ; //1ms延时常数TL0=0x02 ; //频率调节TH1=PWM ; //脉宽调节TL1=0 ;EA=1;ET0=1;ET1=1;TR0=1 ;// P0=0xff;// EA=1;EX0=1;EX1=1;//TCON=0x01;IE0=1;IE1=1;IT0=1;IT1=1;while(1){if(P1==0xef){if(PWM!=0xff){ PWM++ ;delayms(10);}}if(P1==0xdf){if(PWM!=0x02){ PWM-- ;delayms(10);}}if(P1==0x7f){//delayms(10);if(P1==0x7f){fangxiang();}}}}/*********************************************************/// 设置LED灯的亮灭程度/*********************************************************/ /*********************************************************/// 定时器0中断服务程序./*********************************************************/ void timer0() interrupt 1{TR1=0 ;TH0=0xff ;TL0=0x02 ;TH1=PWM ;TR1=1 ;if(PWM<0xff){P0=shu ; //启动输出}}/*********************************************************/// 定时器1中断服务程序/*********************************************************/ void timer1() interrupt 3{TR1=0 ;P0=0xff ; //结束输出}/*********************************************************/// 延时子程序/*********************************************************/void delayms(char ms){char i ;while(ms--){for(i = 0 ; i < 120 ; i++) ;}}/*********************************************************/// 设置流水灯的方向/*********************************************************/void fangxiang(){ //while(1)uint i;uint j;uint a=1;uint b=9;// uchar temp;// TR0=0 ;// TR1=0 ;while(P1!=0xf7){ if(m%2==1){for(i=b;i<8&&P1!=0xf7;i++) //8个流水灯逐个闪动{if(m%2==1){shu=zu[i];delay(ch); //调用延时函数// b--;}}}b=9;for(i=1;i<9&&P1!=0xf7;i++) //8个流水灯逐个闪动{if(m%2==1){shu=zu[i];delay(ch); //调用延时函数a++;}}if(m%2==0){ for(j=a;j>0&&P1!=0xf7;j--){if(m%2==0){shu=zu[j];delay(ch); //调用延时函数// a--;}}}a=1;for(j=8;j>0&&P1!=0xf7;j--) //8个流水灯逐个闪动{if(m%2==0){shu=zu[j];delay(ch); //调用延时函数b--;}}}// TR0=1 ;// TR1=1 ;//{ P0=0x0f;}shu=0x00;}void delay(uint t) //定义延时函数{register uint bt;for(;t>0;t--)for(bt=0;bt<255;bt++);}void int_0() interrupt 0{ EX0=0;// delayms(1);ch=ch+40;if(ch>=200){ch=20;}//delayms(15);EX0=1;}void int_1() interrupt 2{ // uint m;EX1=0;m++;if(m==100){m=1;}EX1=1;}单片机的应用系统由硬件和软件组成,上述硬件原理图搭建完成上电之后,我们还不能看到流水灯循环点亮的现象,我们还需要告诉单片机怎么来进行工作,即编写程序控制单片机管脚电平的高低变化,来实现发光二极管的一亮一灭。

相关主题