基于单片机c语言花样彩灯设计(共7页).doc
精选优质文档-倾情为你奉上/*-2011.3.19 xxx编写- 设计名称:花样和速度可控的花样彩灯设计 功能:1.本程序用了两个按键,其中一个可以循环控制花样,另一个循环控制流水速度;2.有断电保存当前花样和速度功能,即断电后,在重现上电时, 执行的花样和速度仍旧是断电前的速度和花样。 缺点:1、本程序为延时计时,精度不高; 2、由于使用延时来得到秒信号,时数和分数被改变后,有时要过一秒后才能被更新显示- */#include<reg52.h>#include<zi.c>#include<24c02.c>sbit s1=P14; /定义按键sbit s2=P15; void zhongduan(void)interrupt 1 /P1=0xff; TR0=0; /关闭定时器T0 if(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位计数器,最大数值28=256 TH0=256-200;/装载初值 TL0=256-200; ET0=1; / 定时器T0中断允许 TR0=1;/开启定时器T0 EA=1;/打开外部中断0 k=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=P13; 定义按键s1为引脚P1.3sbit S2=P14;sbit S3=P15;sbit S4=P16;sbit S5=P17;*/#define led P3sbit beep=P20; /定义蜂鸣器为引脚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=P27; /定义24C02的数据线与单片机的连接 sbit scl_24c02=P26;/-与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相关的设置和子函数 结束-专心-专注-专业