/*-------------2011.3.19xxx编写------------------------------------------------------------设计名称:花样和速度可控的花样彩灯设计功能:1.本程序用了两个按键,其中一个可以循环控制花样,另一个循环控制流水速度;2.有断电保存当前花样和速度功能,即断电后,在重现上电时,执行的花样和速度仍旧是断电前的速度和花样。缺点:1、本程序为延时计时,精度不高;2、由于使用延时来得到秒信号,时数和分数被改变后,有时要过一秒后才能被更新显示------------------------------------------------------------------------------------------------*/#includereg52.h#includezi.c#include24c02.csbits1=P1^4;//定义按键sbits2=P1^5;voidzhongduan(void)interrupt1{//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}voidmain(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){case1:huayang_1();break;case2:huayang_2();break;case3:huayang_3();break;case4:huayang_4();break;case5:huayang_5();break;}switch(i){case1:x=10;break;case2:x=100;break;case3:x=500;break;case4:x=1000;break;case5:x=2000;break;}}}}/****************************************花样子文件zi.c*************************************************//*sbitS1=P1^3;定义按键s1为引脚P1.3sbitS2=P1^4;sbitS3=P1^5;sbitS4=P1^6;sbitS5=P1^7;*/#defineledP3sbitbeep=P2^0;//定义蜂鸣器为引脚P2.0unsignedintx=10;unsignedchark=1,i=1,flag=0;//#defineledledvoiddelay_ms(unsignedintxms)//1ms延时子程序{unsignedintaa,bb;for(aa=xms;aa0;aa--){if(flag==1)//当检测到有按键按下,跳出内层循环break;for(bb=800;bb0;bb--);}//调整bb数值,以使本句运行时间为1ms。//在PROTEUS中仿真时,可调为120;实际下载到STC12C5A32S2使应调为800左右}//-------------------------------------------------voiddi()//短促响一声函数{beep=0;delay_ms(100);beep=1;}//-----------------------------------------------//------------------花样1隔一个位置灯亮----------------voidhuayang_1(void){led=0xfe;delay_ms(x);led=0xfb;delay_ms(x);led=0xef;delay_ms(x);led=0xbf;delay_ms(x);}//-----------------------------------------------------//-------------------花样2高低四位灯循环亮灭-----------voidhuayang_2(void){led=0xf0;delay_ms(x);//调用延时函数led=0x0f;delay_ms(x);//调用延时函数}//---------------------------------------------------//--------------------花样3灯两盏两盏亮----------------voidhuayang_3(void){led=0xfc;delay_ms(x);led=0xf3;delay_ms(x);led=0xcf;delay_ms(x);led=0x3f;delay_ms(x);}//------------------------------------------//---------------------花样4流水灯---------------voidhuayang_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灯闪烁---------------------voidhuayang_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*/#defineuintunsignedint#defineucharunsignedchar//--------与24C02相关的设置和子函数-------------voiddelay(){;;}//简单短延时子函数sbitsda_24c02=P2^7;//定义24C02的数据线与单片机的连接sbitscl_24c02=P2^6;//--------与24C02相关的设置和子函数-------------voidstart_24c02()//24c02开始信号{sda_24c02=1;delay();scl_24c02=1;delay();sda_24c02=0;delay();}voidstop_24c02()//24c02停止{sda_24c02=0;delay();scl_24c02=1;delay();sda_24c02=1;delay();}voidrespons_24c02()//24c02应答{uchari;scl_24c02=1;delay();while((sda_24c02==1)&&(i250))i++;scl_24c02=0;delay();}voidinit_24c02()//24c02初始化{sda_24c02=1;delay();scl_24c02=1;delay();}voidwrite_byte_24c02(uchardate)//写8个{uchari,temp;temp=date;for(i=0;i8;i++){temp=temp1;scl_24c02=0;delay();sda_24c02=CY;delay();scl_24c02=1;delay();}scl_24c02=0;delay();sda_24c02=1;delay();}ucharread_byte_24c02(){uchari,k;scl_24c02=0;delay();sda_24c02=1;delay();for(i=0;i8;i++){scl_24c02=1;delay();k=(k1)|sda_24c02;scl_24c02=0;delay();}returnk;}voidwrite_add_24c02(ucharaddress,uchardate)//将某数据写入24C02某个单元中{start_24c02();write_byte_24c02(0xa0);//24c02的写地址(10100000)respons_24c02();write_byte_24c02(address);respons_24c02();write_byte_24c02(date);respons_24c02();stop_24c02();}ucharread_add_24c02(ucharaddress)//读出24c02某个单元数据到变量中{uchardate;start_24c02();write_byte_24c02(0xa0);//24c02的读地址(10100001)respons_24c02();write_byte_24c02(address);respons_24c02();start_24c02();write_byte_24c02(0xa1);respons_24c02();date=read_byte_24c02();stop_24c02();returndate;}//--------与24C02相关的设置和子函数结束-----------