当前位置:文档之家› 旋转LED灯程序(51单片机)

旋转LED灯程序(51单片机)

飘飞在空中的文字(详情咨询QQ:278540660)一、实物图(夜晚可以观测到飘在空中的文字,美!!!)二、部分代码/***************************************************************main. c***************************************************/#include<display.h>void main(){EX0init();TIM0init();Init_DS1302();while(1){time_set(IRcord[2]);IRcord[2]=0;if(time_love==0){if(time_onoff==0){ds1302_read_time();Dig_time();}else{Dig_time();}}else{Display_love();}while(!flag);flag=0;}}/***************************************************************redco n.h**************************************************/#define uchar unsigned char#define uint unsigned intsbit IR=P3^2;uchar irtime; //中断次数uchar IRcord[4]; //记录接收到的四个字节数据uchar irdata[33]; //接收到的32个二进制bituint flag=0;uchar nums=0;uint timelate=0;void TIM0init(void) //定时器0初始化{TMOD=0x02; //定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //重载值TL0=0x00; //初始化值(0.255ms一次中断)--晶振频率的十二分之一ET0=1; //开中断TR0=1;}void EX0init(void){IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)EX0 = 1; //使能外部中断0IT1=1; //指定外部中断1下降沿触发,INT0 (P3.3)EX1=1; //使能外部中断1EA = 1; //开总中断}void Ircordpro(void) //红外码值处理函数{uchar i, j, k;uchar cord,value;k=1;for(i=0;i<4;i++) //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k];if(cord>7) //1.125ms为0 2.25ms为1 0.255*7作为稳定判断值value|=0x80;if(j<8){value>>=1;}k++;}IRcord[i]=value;value=0;}}void EX1_ISR (void) interrupt 2 //外部中断0服务函数{static uchar i; //接收红外信号处理static bit startflag; //是否开始处理标志位if(startflag){if(irtime<60&&irtime>=35) //连续发送两个32位数据间隔不可预知性) 尤为重要{i=0;}irdata[i]=irtime; //存储每个电平的持续时间irtime=0;i++;if(i==33){i=0;startflag=0;Ircordpro();}}else{startflag=1;irtime=0;}}void tim0_isr (void) interrupt 1 using 1{irtime++;}void EX0_ISR (void) interrupt 0{flag=1;nums++;if(nums>=20){nums=0;timelate++;if(timelate>=4){timelate=0;}}}/***************************************************************DS130 2.h**************************************************/#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar time_buf[7]={0x13,0x01,0x01,0x00,0x00,0x00,0x02};sbit SCLK=P0^0;sbit SDA=P0^1;sbit RST=P0^4;void delayus(uint t){uint i;for(i=0;i<t;i++)_nop_();}void delayms(uint t){uint x,y;for(x=t;x>0;x--)for(y=95;y>0;y--);}void change_dats(){uchar i;uchar temp;for(i=0;i<6;i++){temp=time_buf[i]/16;time_buf[i]=time_buf[i]%16+temp*10;}}void DS1302WriteByte(uchar dat){uchar i;SCLK=0; //初始时钟线置为0delayus(2);for(i=0;i<8;i++)//传输的8个字节的数据{SDA=dat&0x01; //取最低位delayus(2);SCLK=1; //上升沿,SDA的数据被传输delayus(2);SCLK=0; //时钟线拉低,为下一个上升沿做准备dat>>=1; //数据右移一位,准备传输下一位数据}}uchar DS1302ReadByte(){uchar i,dat;delayus(2);for(i=0;i<8;i++){dat>>=1; //要返回的数据左移一位if(SDA==1) //当数据线为高时,证明该位数据为 1 dat|=0x80;SCLK=1; //拉高时钟线delayus(2);SCLK=0; //制造下降沿delayus(2);}return dat; //返回读取出的数据}void DS1302Write(uchar cmd, uchar dat){RST=0; //初始 CE线置为 0SCLK=0; //初始时钟线置为0RST=1; //初始 CE置为 1,传输开始DS1302WriteByte(cmd); //传输命令字,要写入的时间/日历地址DS1302WriteByte(dat); //写入要修改的时间/日期SCLK=1; //时钟线拉高RST=0; //读取结束,CE置为0,结束数据的传输}uchar DS1302Read(uchar cmd){uchar dat;RST=0; //初始 CE线置为0SCLK=0; //初始时钟线置为0RST=1; //初始 CE置为 1,传输开始DS1302WriteByte(cmd); //传输命令字,要读取的时间/日历地址dat=DS1302ReadByte(); //读取要得到的时间/日期SCLK=1; //时钟线拉高RST=0; //读取结束,CE置为 0,结束数据的传输return dat; //返回得到的时间/日期}void Init_DS1302(void){DS1302Write(0x8e,0x00); //写保护关DS1302Write(0x80,time_buf[5]); //初始秒值为0DS1302Write(0x82,time_buf[4]); //初始分钟值为 0DS1302Write(0x84,time_buf[3]); //初始为 24小时模式初始时间为0点DS1302Write(0x86,time_buf[2]); //设置日DS1302Write(0x88,time_buf[1]); //设置月DS1302Write(0x8c,time_buf[0]); //设置年DS1302Write(0x8a,time_buf[6]); //设置星期数DS1302Write(0x8e,0x80); //禁止写入change_dats();}void ds1302_read_time(){uchar i,temp;time_buf[0]=DS1302Read(0x8D); //年time_buf[1]=DS1302Read(0X89); //月time_buf[2]=DS1302Read(0X87); //日time_buf[3]=DS1302Read(0X85); //时time_buf[4]=DS1302Read(0X83); //分time_buf[5]=(DS1302Read(0X81))&0x7F;//秒time_buf[6]=DS1302Read(0X8B); //星期for(i=0;i<7;i++) //BCD 处理{temp=time_buf[i]/16;time_buf[i]=time_buf[i]%16;time_buf[i]+=temp*10;}}/***************************************************************DISPL AY.h**************************************************/#include<ds1302.h>#include<redcon.H>#define uint unsigned int#define uchar unsigned charuchar code W[]={0x81,0xfb,0xf7,0xfb,0x81};uchar code N[]={0xe1,0xdf,0xdf,0xe1};uchar code R[]={0x81,0xa7,0xab,0xdd};uchar code I[]={0xbd,0x81,0xbd};uchar code L[]={0x81,0xfd,0xfd};uchar code o[]={0xe3,0xdd,0xe3};uchar code v[]={0xc7,0xfb,0xfd,0xfb,0xc7};uchar code E[]={0xe3,0xd5,0xd5,0xe5};uchar code Y[]={0x9f,0xef,0xf1,0xef,0x9f};uchar code U[]={0xc3,0xfd,0xfd,0xc3};uchar code num[10][5]={{0x83,0x75,0x6d,0x5d,0x83},{0xff,0xbd,0x01,0xfd,0xff},{0xbd,0x79,0x75,0x6d,0x9d},{0x7b,0x7d,0x5d,0x2d,0x73},{0xe7,0xd7,0xb7,0x01,0xf7},{0x1b,0x5d,0x5d,0x5d,0x63},{0x83,0x6d,0x6d,0x6d,0x73},{0xbf,0x7f,0x7d,0x41,0x3d},{0x93,0x6d,0x6d,0x6d,0x93},{0x9b,0x6d,0x6d,0x6d,0x83}};uchar code wen[]={0xdf,0xcd,0xd5,0x9b,0xd5,0xcd,0xdf};uchar code er[]={0xfd,0x83,0xff,0x83,0xfb,0xfd,0xfd};uchar code xin[]={0xcf,0xb7,0xdb,0xb7,0xcf};uchar set_num=0;uchar time_onoff=0;uchar time_love=0;void change_dath(){uchar i;uchar temp;for(i=0;i<6;i++){temp=time_buf[i]/10;time_buf[i]=time_buf[i]%10+temp*16; }}void time_set(uchar dat){switch(dat){case 0x46:{if(set_num==0) //按下设置键第一次{set_num=1;time_onoff=1;DS1302Write(0x8e,0x00); //写保护关DS1302Write(0x80,0X80); //时钟停止}else if(set_num==1){set_num=2;}else if(set_num==2){P2=0XFB;set_num=3;}else if(set_num==3){set_num=4;P2=0Xf7;}else if( set_num==4){set_num=5;}else if(set_num==5){set_num=6;}else if(set_num==6){set_num=0;time_onoff=0;change_dath();Init_DS1302();DS1302Write(0x80,0X00); //时钟运行}break;}case 0x47:{if(set_num!=0){if(set_num==1){time_buf[0]++;}else if(set_num==2){time_buf[1]++;if(time_buf[1]>12)time_buf[1]=1;}else if(set_num==3){time_buf[2]++;if(time_buf[2]>=32)time_buf[2]=1;}else if(set_num==4){time_buf[3]++;if(time_buf[3]>=24)time_buf[3]=0;}else if(set_num==5){time_buf[4]++;if(time_buf[4]>=60)time_buf[4]=0;}else if(set_num==6){time_buf[5]++;if(time_buf[5]>=60)time_buf[5]=0;}}break;}case 0x45:{if(set_num!=0){if(set_num==1){if(time_buf[0]<=0)time_buf[0]=20;else{time_buf[0]=time_buf[0]-1; }}else if(set_num==2){time_buf[1]=time_buf[1]-1; if(time_buf[1]<=0)time_buf[1]=12;}else if(set_num==3){if(time_buf[2]<=1)time_buf[2]=31;elsetime_buf[2]=time_buf[2]-1; }else if(set_num==4){if(time_buf[3]<=0)time_buf[3]=23;elsetime_buf[3]=time_buf[3]-1; }else if(set_num==5){if(time_buf[4]<=0)time_buf[4]=59;elsetime_buf[4]=time_buf[4]-1;}else if(set_num==6){if(time_buf[5]<=0)time_buf[5]=59;elsetime_buf[5]=time_buf[5]-1;}}break;}case 0x07:{time_love=1;break;}case 0x15:{time_love=0;break;}}}/******************时钟显示***************/ void Dig_time(){char m;for(m=0;m<=4;m++) //显示时十位{P2=num[time_buf[3]/10][m];delayms(1);}P2=0xff;delayms(1);for(m=0;m<=4;m++) //显示时个位{P2=num[time_buf[3]%10][m];delayms(1);}P2=0xff;delayms(1);P2=0xd7;delayms(1);P2=0xff;delayms(1);for(m=0;m<=4;m++) //显示分十位{P2=num[time_buf[4]/10][m];delayms(1);}P2=0xff;delayms(1);for(m=0;m<=4;m++) //显示分个位{P2=num[time_buf[4]%10][m];delayms(1);}P2=0xff;delayms(1);P2=0xd7;delayms(1);P2=0xff;delayms(1);for(m=0;m<=4;m++) //显示秒十位{P2=num[time_buf[5]/10][m];delayms(1);}P2=0xff;delayms(1);for(m=0;m<=4;m++) //显示秒个位{P2=num[time_buf[5]%10][m];delayms(1);}P2=0xff;}/***************i love you*****************/ void Display_love(){char i,j;if(timelate==0){for(i=0;i<=6;i++) //显示W{P2=wen[i];delayms(1);}P2=0xff;delayms(1);for(i=0;i<=6;i++) //显示r {P2=er[i];delayms(1);}P2=0xff;delayms(2);}if(timelate<=1){for(i=2;i>=0;i--) //显示I {P2=I[i];delayms(1);}P2=0xff;delayms(2);}if(timelate<=2){for(i=0;i<3;i++) //显示L {P2=L[i];delayms(1);}P2=0xff;delayms(1);for(i=2;i>=0;i--) //显示o {P2=o[i];delayms(1);}P2=0xff;delayms(1);for(i=4;i>=0;i--) //显示v {P2=v[i];delayms(1);}P2=0xff;delayms(1);for(i=0;i<=3;i++) //显示e {P2=E[i];delayms(1);}P2=0xff;delayms(2);}if(timelate<=3){for(i=4;i>=0;i--) //显示Y {P2=Y[i];delayms(1);}P2=0xff;delayms(1);for(i=2;i>=0;i--) //显示o {P2=o[i];delayms(1);}P2=0xff;delayms(1);for(i=3;i>=0;i--) //显示u {P2=U[i];delayms(1);}P2=0xff;delayms(2);}if(timelate>0){for(j=0;j<timelate;j++) {for(i=0;i<=4;i++){P2=xin[i];delayms(1);}P2=0xff; delayms(2); }}}。

相关主题