当前位置:文档之家› 电子生日蜡烛设计

电子生日蜡烛设计

/********************************************************************************* 广西科技大学电气学院**--------------------------------------------------------------------------------* 实验名 : LCD1602显示试验* 实验说明 : LCD1602显示Pechin Science* 连接方式 : 见连接图* 注意 :*******************************************************************************/#include<reg51.h>#define uchar unsignedchar#define uint unsignedint/**********************************PIN口定义**********************************/#define LCD1602_DATAPINS P0sbit LCD1602_E = P2 ^ 7;sbit LCD1602_RW = P2 ^ 5;sbit LCD1602_RS = P2 ^ 6;sbit P1_0=P1^7; // 扬声器输出口#define key_p P3 //按键输入口int m,i=0;int tri;int l;int x=0,y=2;playc(char ch);char code toneh[14]={0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,};char code tonel[14]={0x22,0x56,0x85,0x9A,0xC1,0xE3,0x03,0x10,0x2B,0x42,0x4C,0x60,0x71,0x81};//歌曲乐谱char codesong1[]="222322113336622552223221133336622550531141255311432536653326425434332321034554330 217023443332";char codesong2[]="167176671111322225777711105666611667665555003111132222355531110566662661166550665 054667705111";char codesong3[]="356665533566655335544332230332133665511666615623000356663550000230232161250330334 332402230232";char code length[]="444444444444444422224422224422224444444444";/*在51单片机12MHZ时钟下的延时函数*/void Lcd1602_Delay1ms(uint c); //误差 0us/*LCD1602写入8位命令子函数*/void LcdWriteCom(uchar com);/*LCD1602写入8位数据子函数*/void LcdWriteData(uchar dat);/*LCD1602初始化子程序*/void LcdInit();/*显示行数子程序*/void DisplayOneChar(uchar x,uchar y, uchar ddata);/*显示函数子程序*/void display(uchar *ddata,x,y);/*按键控制函数子程序*/void key();//音乐部分void timer0(void) interrupt 1 using 1 //计时器1{P1_0=~P1_0;TH0=toneh[tri];TL0=tonel[tri];}void timer1(void) interrupt 3 using 3 //计时器2{TH1=0xCA;TL1=0xFE;m++;key();}/******************************************************************************* * 函数名 : Lcd1602_Delay1ms* 函数功能 : 延时函数,延时1ms* 输入 : c* 输出 : 无* 说名 : 该函数是在12MHZ晶振下,12分频单片机的延时。

*******************************************************************************/ int playc(char ch){int ti;switch(ch){case'q':ti=0;break;case'w':ti=1;break;case'e':ti=2;break;case'r':ti=3;break;case't':ti=4;break;case'y':ti=5;break;case'u':ti=6;break;case'1':ti=7;break;case'2':ti=8;break;case'3':ti=9;break;case'4':ti=10;break;case'5':ti=11;break;case'6':ti=12;break;case'7':ti=13;break;case' ':ti=50;break;default:ti=50;break;}if(ti==50)return (100);elsereturn ti;}/******************************************************************************* * 函数名 : Lcd1602_Delay1ms* 函数功能 : 延时函数,延时1ms* 输入 : c* 输出 : 无* 说名 : 该函数是在12MHZ晶振下,12分频单片机的延时。

*******************************************************************************/void Lcd1602_Delay1ms(uint c) //误差 0us{uchar a, b;for (; c>0; c--){for (b = 199; b>0; b--){for (a = 1; a>0; a--);}}}/******************************************************************************* * 函数名 : LcdWriteCom* 函数功能 : 向LCD写入一个字节的命令* 输入 : com* 输出 : 无*******************************************************************************/ void LcdWriteCom(uchar com) //写入命令{LCD1602_E = 0; //使能LCD1602_RS = 0; //选择发送命令LCD1602_RW = 0; //选择写入LCD1602_DATAPINS = com; //放入命令Lcd1602_Delay1ms(1); //等待数据稳定LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5); //保持时间LCD1602_E = 0;}/******************************************************************************* * 函数名 : LcdWriteData* 函数功能 : 向LCD写入一个字节的数据* 输入 : dat* 输出 : 无*******************************************************************************/ void LcdWriteData(uchar dat) //写入数据{LCD1602_E = 0; //使能清零LCD1602_RS = 1; //选择输入数据LCD1602_RW = 0; //选择写入LCD1602_DATAPINS = dat; //写入数据Lcd1602_Delay1ms(1);LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5); //保持时间LCD1602_E = 0;}/******************************************************************************* * 函数名 : LcdInit()* 函数功能 : 初始化LCD屏* 输入 : 无* 输出 : 无*******************************************************************************/ void LcdInit() //LCD初始化子程序{LcdWriteCom(0x38); //开显示LcdWriteCom(0x0c); //开显示不显示光标LcdWriteCom(0x01); //清屏LcdWriteCom(0x06); //写一个指针加1LcdWriteCom(0x80); //设置数据指针起点}/***************************************************************************** *函数名:DisplayOneChr(uchar x,uchar y, uchar ddata)*函数功能:显示行数的设定* 输入 : x,y ddata* 输出 : 无*******************************************************************************/void DisplayOneChar(uchar x,uchar y, uchar ddata){y&=1;x&=15;if(y)x|=0x40;x|=0x80;LcdWriteCom(x);LcdWriteData(ddata);}/***************************************************************************** *函数名:display(uchar *ddata,x,y)*函数功能:显示函数* 输入 : x,y *ddata* 输出 : 无*******************************************************************************/void display(uchar *ddata,x,y){uchar lis=0;y&=0x01;x&=0x0f;while(x<16){DisplayOneChar(x,y,ddata[lis]);lis++;x++;}}/******************************************************************************* * 函数名 : key()* 函数功能 : 按键控制函数* 输入 : 无* 输出 : 无*******************************************************************************/ void key(){uchar key1;key_p=0XFF;key1=key_p;if(key1!=0xFF){Lcd1602_Delay1ms(1);key_p=0xFF;key1=key_p;if(key1!=0xFF){key1=key_p;switch(key1){case 0xFE:x=1; break;case 0xFD:x=2; break;case 0xFB:x=3; break;case 0xF7:y=1; break;case 0xEF:y=~y; break;default : break;}}}}/******************************************************************************* * 函数名 : main* 函数功能 : 主函数* 输入 : 无* 输出 : 无*******************************************************************************/ void main(void){//--定变量--//uchar *s1,*s2,*s3,*h,*h1,*h2,*h3,*h4;//uchar z;uchar xi=16;m=0;TMOD=0x11;P1_0=0;TH0=toneh[0];TL0=tonel[0];TH1=0xCE;TL1=0xFE;IP=0x08;EA=1;LcdInit();s1=" I LOVE Chopin ";s2=" MY LOVE ";s3=" Without You ";h=" Hello Music ";h1=" Music 1: ";h2=" Music 2: ";h3=" Music 3: ";h4=" Music is OVER ";display(h,0,0) ;Lcd1602_Delay1ms(10);while(1){key();if(x==1) {display(h1,0,0);display(s1,0,1); }if(x==2) {x=2;display(h2,0,0);display(s2,0,1); } if(x==3) {display(h3,0,0);display(s3,0,1); }if(y==1){switch(x){case 1:for(i=0;i<93;i++){ET1=1; TR1=1;ET0=1; TR0=1;while(!y){P1_0=1;}xi=xi%16;display(s1,xi,1);xi--;tri=playc(song1[i]);l=length[i]-0x03;while(m<l);m=0;}TR0=0; TR1=0; P1_0=0; break;case 2:for(i=0;i<93;i++){ET1=1; TR1=1;ET0=1; TR0=1;while(!y){P1_0=0;}xi=xi%16;display(s2,xi,1);xi--;tri=playc(song2[i]);l=length[i]-0x03;while(m<l);m=0;}TR0=0; TR1=0; P1_0=0; break;case 3:for(i=0;i<93;i++){ET1=1; TR1=1;ET0=1; TR0=1;while(!y){P1_0=0;}xi=xi%16;display(s3,xi,1);xi--;tri=playc(song3[i]);l=length[i]-0x03;do{}while(m<l);m=0;}TR0=0; TR1=0; P1_0=0; break;default :break;}LcdWriteCom(0x01); //清屏display(h4,0,1);x=0;y=0;}}}。

相关主题