/*-------------2011.3.19 xxx编写------------------------------------------------------------设计名称:花样和速度可控的花样彩灯设计功能:1.本程序用了两个按键,其中一个可以循环控制花样,另一个循环控制流水速度;2.有断电保存当前花样和速度功能,即断电后,在重现上电时,执行的花样和速度仍旧是断电前的速度和花样。
缺点:1、本程序为延时计时,精度不高;2、由于使用延时来得到秒信号,时数和分数被改变后,有时要过一秒后才能被更新显示------------------------------------------------------------------------------------------------*/#include<reg52.h>#include<zi.c>#include<24c02.c>sbit s1=P1^4; //定义按键sbit s2=P1^5;void zhongduan(void)interrupt 1{//P1=0xff;TR0=0; //关闭定时器T0if(s1==0) //如果按键s1被按下{delay_ms(10); //延时消抖di();{if(s1==0) //如果按键s1按下{k++;write_add_24c02(0,k);if(k==6){k=1;}}while(!s1);flag=1;} //等待s1键抬起并改变标志位TR0=1; //启动定时器T0}if(s2==0) //如果按键s2被按下{delay_ms(10); //延时消抖di();if(s2==0){i++;write_add_24c02(1,i);if(i==6)i=1;}while(!s2);flag=1;} //等待s2键抬起并改变标志位TR0=1; //启动定时器T0}void main(void){TMOD=0X02; // 定时器TO,工作方式2,带自动装在的8位计数器,最大数值2^8=256TH0=256-200; //装载初值TL0=256-200;ET0=1; // 定时器T0中断允许TR0=1; //开启定时器T0EA=1; //打开外部中断0k=read_add_24c02(0);i=read_add_24c02(1);if(k>=6)k=1;if(i>=6)i=1;while(1){flag=0; //按键按下标志位while(flag==0) //检测到有按键按下{ switch(k){case 1:huayang_1();break;case 2:huayang_2();break;case 3:huayang_3();break;case 4:huayang_4();break;case 5:huayang_5();break;}switch(i){case 1:x=10;break;case 2:x=100;break;case 3:x=500;break;case 4:x=1000;break;case 5:x=2000;break;}}}}/****************************************花样子文件zi.c*************************************************/ /*sbit S1=P1^3; 定义按键s1为引脚P1.3sbit S2=P1^4;sbit S3=P1^5;sbit S4=P1^6;sbit S5=P1^7;*/#define led P3sbit beep=P2^0; //定义蜂鸣器为引脚P2.0unsigned int x=10;unsigned char k=1,i=1,flag=0;//#define led ledvoid delay_ms(unsigned int xms) //1ms延时子程序{ unsigned int aa,bb;for(aa=xms;aa>0;aa--){if(flag==1) //当检测到有按键按下,跳出内层循环break;for(bb=800;bb>0;bb--);} //调整bb数值,以使本句运行时间为1ms 。
//在PROTEUS中仿真时,可调为120;实际下载到STC12C5A32S2使应调为800左右}//-------------------------------------------------void di() //短促响一声函数{ beep=0; delay_ms(100);beep=1;}//-----------------------------------------------//------------------花样1隔一个位置灯亮----------------void huayang_1(void){led=0xfe;delay_ms(x);led=0xfb;delay_ms(x);led=0xef;delay_ms(x);led=0xbf;delay_ms(x);}//-----------------------------------------------------//-------------------花样2高低四位灯循环亮灭-----------void huayang_2(void){led=0xf0;delay_ms(x); //调用延时函数led=0x0f;delay_ms(x); //调用延时函数}//---------------------------------------------------//--------------------花样3灯两盏两盏亮---------------- void huayang_3(void){led=0xfc;delay_ms(x);led=0xf3;delay_ms(x);led=0xcf;delay_ms(x);led=0x3f;delay_ms(x);}//------------------------------------------//---------------------花样4流水灯---------------void huayang_4(void){led=0x7f;delay_ms(x);led=0xbf;delay_ms(x);led=0xdf;delay_ms(x);led=0xef;delay_ms(x);led=0xf7;delay_ms(x);led=0xfb;delay_ms(x);led=0xfd;delay_ms(x);led=0xfe;delay_ms(x);}//----------------------------------------------//---------------花样5灯闪烁---------------------void huayang_5(void){led=0xff;delay_ms(x);led=0x00;delay_ms(x);}/* 24C02的使用函数库函数使用说明:1、write_add_24c02(2,aaa ); //把变量aaa的值保存到在24c02的单元地址2中,注意,最好在后面加上几个ms的延时,避免出错。
2、bbb=read_add_24c02(2); //读出24c02的单元地址2中保存的数据并赋给变量bbb*/#define uint unsigned int#define uchar unsigned char//--------与24C02相关的设置和子函数-------------void delay(){ ;; } //简单短延时子函数sbit sda_24c02=P2^7; //定义24C02的数据线与单片机的连接sbit scl_24c02=P2^6;//--------与24C02相关的设置和子函数-------------void start_24c02() //24c02开始信号{ sda_24c02=1; delay();scl_24c02=1; delay();sda_24c02=0; delay(); }void stop_24c02() //24c02停止{ sda_24c02=0; delay();scl_24c02=1; delay();sda_24c02=1; delay(); }void respons_24c02() //24c02应答{ uchar i;scl_24c02=1;delay();while((sda_24c02==1)&&(i<250))i++;scl_24c02=0;delay(); }void init_24c02() //24c02初始化{ sda_24c02=1; delay();scl_24c02=1; delay(); }void write_byte_24c02(uchar date) //写8个{ uchar i,temp;temp=date;for(i=0;i<8;i++){ temp=temp<<1;scl_24c02=0; delay();sda_24c02=CY; delay();scl_24c02=1; delay();}scl_24c02=0; delay();sda_24c02=1; delay(); }uchar read_byte_24c02(){ uchar i,k;scl_24c02=0; delay();sda_24c02=1; delay();for(i=0;i<8;i++){ scl_24c02=1; delay();k=(k<<1)|sda_24c02;scl_24c02=0; delay();}return k; }void write_add_24c02(uchar address,uchar date)//将某数据写入24C02某个单元中{ start_24c02();write_byte_24c02(0xa0); //24c02的写地址(1010 0000)respons_24c02();write_byte_24c02(address);respons_24c02();write_byte_24c02(date);respons_24c02();stop_24c02(); }uchar read_add_24c02(uchar address)//读出24c02某个单元数据到变量中{ uchar date;start_24c02();write_byte_24c02(0xa0); //24c02的读地址(1010 0001)respons_24c02();write_byte_24c02(address);respons_24c02();start_24c02();write_byte_24c02(0xa1);respons_24c02();date=read_byte_24c02();stop_24c02();return date; }//--------与24C02相关的设置和子函数结束-----------。