包含C語言的代碼,AD的原理圖及PCB板圖,proteus的仿真圖,由聲音控制的音樂彩燈。可放心下載
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (29.66 KB, 下載次數: 80)
下載附件
2020-1-17 19:31 上傳
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png (22.3 KB, 下載次數: 67)
下載附件
2020-1-17 19:32 上傳
單片機源程序如下:
- #include <reg52.h>
- #include <intrins.h> //頭文件
- #define uint unsigned int
- #define uchar unsigned char
- #define delay4us() {_nop_();_nop_();_nop_();_nop_();} //延時4us
- #define uint unsigned int
- #define uchar unsigned char
- sbit beep = P1^5;
- uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
- 212,212,106,126,159,169,190,119,119,126,159,142,159,0};
- uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
- 9,3,12,12,12,12,12,9,3,12,12,12,24,0};
- unsigned char dat = 0x00;
- unsigned char count = 0x00;
- unsigned char CH;
- unsigned char dis[] = {0x00, 0x00, 0x00};
- unsigned int displaynum;
- sbit RS = P2^0; //數據|命令選擇指示端
- sbit RW = P2^1; //讀/寫選擇端
- sbit E= P2^2; //使能
- sbit led1= P2^3; //led1燈使能
- sbit led2= P2^4; //led2燈使能
- sbit CS = P3^5; //片選
- sbit Clk = P3^4; //ad時鐘輸入
- sbit DATI = P3^3; //數據信號輸入/輸出
- sbit DATO = P3^3;
- void Disp_temper_range(uchar add,uint T);
- void Display();
- uchar code table1[]="GZ:";
- uchar code table2[]="SY:";
- uchar code table5[]="SPEED:";
- uchar code table3[]={0x07,0x05,0x07,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x06,0x09,0x10,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x01,0x12,0x0C,0x00,};
- uchar code table4[]={14,12,7,5,0};
- uchar code table6[]="1";
- uchar code table7[]="2";
- uchar code table8[]="3";
- uchar code table9[]="0";
- uchar d,a,temp,*p,aa,s,m,i=0;
- unsigned int num=0;
- unsigned char gz;
- unsigned char sy;
- unsigned char openflag=0;
- void DelayMS(uint x)
- {
- uchar t;
- while(x--) for(t=0;t<120;t++);
- }
- void PlayMusic()
- {
- uint i=0,j,k;
- while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
- { //播放各個音符,SONG_LONG 為拍子長度
- for(j=0;j<SONG_LONG[i]*20;j++)
- {
- beep=~beep;
- led1=~led1;
- led2=~led1;
- //SONG_TONE 延時表決定了每個音符的頻率
- for(k=0;k<SONG_TONE[i]/3;k++);
- }
- DelayMS(10);
- i++;
- }
- }
- void delay(uint z) //延時函數
- {
- uint i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- void delay_(uint i)
- {
- while(i--);
- }
- bit LCD_Busy_Check() //LCD判忙
- {
- bit result;
- RS = 0;
- RW = 1;
-
- E= 1;
- delay4us();
- result = (bit)(P0&0x80); // 1000 0000
- E= 0;
- return result;
- }
- void LCD_Write_Command(uchar cmd) //LCD寫命令
- {
- while(LCD_Busy_Check());
- RS = 0;
- RW = 0;
- E = 0;
- _nop_();
- _nop_();
- P0 = cmd;
- delay4us();
- E = 1;
- delay4us();
- E = 0;
- }
- void LCD_Write_Data(uchar dat) //LCD寫數據
- {
- while(LCD_Busy_Check( ));
- RS = 1;
- RW = 0;
- E = 0;
- P0 = dat;
- delay4us();
-
- E = 1;
- delay4us();
- E = 0;
- }
- void set_XY(uchar X,uchar Y) //????????
- {
- if(Y==0)
- X+=0x80;
- else
- X|=0xC0;
- LCD_Write_Command(X);
- }
- void DispOneChar(uchar X,uchar Y,uchar Data) //??????
- {
- set_XY(X,Y);
- LCD_Write_Data(Data);
- }
- void LCD_Initialise() //LCD初始化
- {
- LCD_Write_Command(0x38); DelayMS(1);
- LCD_Write_Command(0x38); DelayMS(1);
- LCD_Write_Command(0x38); DelayMS(1);
- LCD_Write_Command(0x38); DelayMS(1);
- LCD_Write_Command(0x0c); DelayMS(1);
- LCD_Write_Command(0x06);
- LCD_Write_Command(0x01);
- delay4us();
- delay4us();delay4us();delay4us();
- }
- void Display_fre(uchar f) //
- {
- uchar a1,a2,a3;
- a1=f/100;
- a2=f/10%10;
- a3=f%10;
- DispOneChar(4,0,0x30+a1);
- DispOneChar(5,0,0x30+a2);
- DispOneChar(6,0,0x30+a3);
- }
- void Display_fre1(uchar s)
- {
- uchar b1,b2,b3;
- b1=s/100;
- b2=s/10%10;
- b3=s%10;
-
- DispOneChar(13,0,0x30+b1);
- DispOneChar(14,0,0x30+b2);
- DispOneChar(15,0,0x30+b3);
- }
- void Display_fre2(uint ss)
- {
- uint c1,c2,c3,c4;
- c1=ss/1000;
- c2=ss/100%10;
- c3=ss/10%10;
- c4=ss%10;
-
- DispOneChar(7,1,0x30+c1);
- DispOneChar(8,1,0x30+c2);
- DispOneChar(9,1,0x30+c3);
- DispOneChar(10,1,0x30+c4);
- }
- void DispChars(uchar X,uchar Y,uchar *p,uchar count) //?????
- {
- uchar i;
- for(i=0;i<count;i++)
- {
- set_XY(X,Y);
- LCD_Write_Data(*p);
- X++;
- p++;
- }
- }
- /*****CH=0X00,對CH1進行轉換,TGS260******/
- unsigned char adc0832(unsigned char CH) //模數轉化
- {
- unsigned char i,test,adval;
- adval = 0x00;
- test = 0x00;
- Clk = 0;
- DATI = 1;
- _nop_();
- CS = 0;
-
- _nop_();
- Clk = 1;
- _nop_();
-
- if ( CH == 0x00 ) //CH=0X00,對CH1進行轉換,TGS260
- {
- Clk = 0;
- DATI = 1; //
- _nop_();
- Clk = 1;
- _nop_();
- Clk = 0;
- DATI = 1;
- _nop_();
- Clk = 1;
- _nop_();
- }
- else
- {
- Clk = 0;
- DATI = 1;
- _nop_();
- Clk = 1;
- _nop_();
- Clk = 0;
- DATI = 0;
- _nop_();
- Clk = 1;
- _nop_();
- }
-
- Clk = 0;
- DATI = 1;
-
- for( i = 0;i < 8;i++ ) //
- {
- _nop_();
- adval <<= 1;
- Clk = 1;
- _nop_();
- Clk = 0;
- if (DATO)
- adval |= 0x01;
- else
- adval |= 0x00;
- }
-
-
- for (i = 0; i < 8; i++)
- {
- test >>= 1;
- if (DATO)
- test |= 0x80;
- else
- test |= 0x00;
- _nop_();
- Clk = 1;
- _nop_();
- Clk = 0;
- }
-
- if (adval == test)
- dat = test;
- _nop_();
- CS = 1;//ADC0832
- DATO = 1;
- Clk = 1;
-
- return dat;
- }
- void main(){
-
- led1= 0;
- led2= 0;
- LCD_Initialise(); //LED初始化
- // DelayMS(5);
- DispChars(0,0,p=table1,4); //??“tgs”
- // DelayMS(5);
- DispChars(8,0,p=table2,4); //??“mq2”
- while (1){
-
- gz=100-100*adc0832(0x00)/255;
- Display_fre(gz);
- sy= 100*adc0832(0x11)/255;
- Display_fre1(sy);
- if (gz<50){
- openflag = 0;
- }
- if ((50<=gz)&&(sy>40)){
- openflag = 1;
- }
- else {
- openflag = 0;
- }
- if (openflag==1)
- {
- beep=0;
-
- while(1)
- {
- PlayMusic(); //播放生日快樂
- DelayMS(500);
- break; //播放完后暫停一段時間
- }
- beep=1;
- led1=0;
- led2=0;
- num++;
- delay(200);
- }
- else{
- if (num!=0)
- {
- num++;
- delay(200);
- if (num>180)
- {
- num=0;
- led1=1;
- led2=1;
- openflag = 0;
- }
- }
-
- }
- }
- }
復制代碼
所有資料51hei提供下載:
設計.7z
(2.21 MB, 下載次數: 95)
2020-1-17 19:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|