|
圖片1.png (357.24 KB, 下載次數(shù): 29)
下載附件
2018-5-6 13:13 上傳
圖片2.png (354.97 KB, 下載次數(shù): 21)
下載附件
2018-5-6 13:13 上傳
圖片3.png (395.84 KB, 下載次數(shù): 20)
下載附件
2018-5-6 13:13 上傳
圖片4.png (368.14 KB, 下載次數(shù): 21)
下載附件
2018-5-6 13:13 上傳
- #include "reg52.h"
- #include <I2C.H>
- #define uchar unsigned char
- #define uint unsigned int
- #define PCF8591 0x90 //PCF8591 地址
- sbit CS =P3^5;
- sbit SID=P3^6;
- sbit SCLK=P3^7;
- unsigned char i=0;
- unsigned char code D[5]={0,0,0,0,255};
- unsigned char key;
- unsigned char code sin[]={128.00,135.97,143.92,151.80,159.58,167.25,174.75,189.18, 196.05, 202.65,
- 208.95, 214.94, 220.58, 225.86, 230.75, 235.23, 239.29, 242.91, 246.08, 248.78, 251.01, 252.75, 254.00, 254.75, 255.00,255.00 ,255.00 ,
- 254.75, 254.00, 252.75, 251.01, 248.78, 242.91, 239.29, 235.23, 230.75, 225.86, 220.58, 214.94, 208.95, 202.65, 196.05,189.18,
- 182.07, 174.75,167.25, 159.58, 151.80, 143.92, 135.97, 128.00, 120.03, 112.08, 104.20, 96.42, 88.75, 81.25, 73.93, 66.82, 59.95,
- 53.35, 47.05, 41.06, 35.42, 30.14, 25.25 , 20.77, 16.71, 13.09, 9.92, 7.22, 4.99, 3.25, 2.00, 1.25, 1.00,
- 1.25, 2.00, 3.25, 4.99, 7.22, 9.92, 13.09, 16.71, 20.77, 25.25, 30.14, 35.42, 41.06, 47.05, 53.35,
- 59.95, 66.82, 73.93, 81.25, 88.75, 96.42, 104.20, 112.08, 120.03, 128.00 };
- unsigned char code Duan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76};
- unsigned char Data_Buffer[4]={1,2,3,4};
- sbit P24=P2^4; //四個(gè)數(shù)碼管的位碼口定義
- sbit P25=P2^5;
- sbit P26=P2^6;
- sbit P27=P2^7;
- bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val);
- unsigned char code high[5]={0xdb,0xed,0xf3,0xf6,0xf8};
- unsigned char code low[5]={0xff,0xff,0xff,0xff,0xcb};
- unsigned char code PIN[5]={1,2,3,4,5};
- unsigned char code FU[5]={5,4,3,2,1};
- unsigned char p;
- unsigned char v;
- unsigned char Bit;
- unsigned char flag=0;
- unsigned char y;
- void delay(unsigned int i)
- {
- unsigned int j;
- for(;i>0;i--)
- for(j=0;j<333;j++)
- {;}
- }
- uchar KeyScan() //帶返回值的子函數(shù)
- {
- uchar cord_l,cord_h;//聲明列線和行線的值的儲(chǔ)存變量
- P1 = 0xf0;//1111 0000
- if( (P1 & 0xf0) != 0xf0)//判斷是否有按鍵按下
- {
- delay(50);//軟件消抖
- if( (P1 & 0xf0) != 0xf0)//判斷是否有按鍵按下
- {
- cord_l = P1 & 0xf0;// 儲(chǔ)存列線值
- P1 = cord_l | 0x0f;
- cord_h = P1 & 0x0f;// 儲(chǔ)存行線值
- while( (P1 & 0x0f) != 0x0f );//松手檢測
- return (cord_l + cord_h);//返回鍵值碼
- }
- }
- }
- void KeyPro()
- {
- uchar key;
- switch( KeyScan() )
- {
- //第一行鍵值碼
- case 0xee: key = '0'; v=0; break;
- case 0xde: key = '1'; v=1; break;
- case 0xbe: key = '2'; v=2; break;
- case 0x7e: key = '3'; v=3; break;
-
- //第二行鍵值碼
- case 0xed: key = '4';
- p++;
- if(p==5)
- p=0;
- break;
- case 0xdd: key = '5';
- p--;
- if(p<0)
- p=4;
- break;
- case 0xbd: key = '6';
- y=0;
- break;
- case 0x7d: key = '7';
- y=1;
- break;
- //第三行鍵值碼
- case 0xeb: key = '8';
- y=2;
- break;
- case 0xdb: key = '9';
- y=3 ;
- break;
- case 0xbb:
- y=4;
- break;
- }
- }
- void main()
- {
-
- TMOD = 0x01; //啟動(dòng)定時(shí)器方式2
- TH0=high[p]; //定時(shí)器初值
- TL0=low[p];
- ET0=1; //T0允許
- TR0=1; //T0啟動(dòng)
- IT0=1;
- EX0=1;
- EA=1;
- while(1)
- {
- KeyPro();
- if(flag==1) //定時(shí)器中斷啟動(dòng)標(biāo)志
- { flag=0;
- i++;
- if(i>100)
- i=0 ;
- if(v==0) //(正弦)
- {
-
- switch(y)
- {
- case 0: DACconversion(PCF8591,0x40,sin[i]);break;
- case 1: DACconversion(PCF8591,0x40,sin[i]*0.8);break;
- case 2: DACconversion(PCF8591,0x40,sin[i]*0.6);break;
- case 3: DACconversion(PCF8591,0x40,sin[i]*0.4);break;
- case 4: DACconversion(PCF8591,0x40,sin[i]*0.2);break;
- }
-
- }
- if(v==1) //(三角)
- {
- if(i<50)
- {
- switch(y)
- {
- case 0: DACconversion(PCF8591,0x40,i*4.9);break;
- case 1: DACconversion(PCF8591,0x40,i*0.8*4.9);break;
- case 2: DACconversion(PCF8591,0x40,i*0.6*4.9);break;
- case 3: DACconversion(PCF8591,0x40,i*0.4*4.9);break;
- case 4: DACconversion(PCF8591,0x40,i*0.2*4.9);break;
- }
-
- }
- else
- {
- switch(y)
- {
- case 0: DACconversion(PCF8591,0x40,(100-i)*4.9);break;
- case 1: DACconversion(PCF8591,0x40,(100-i)*0.8*4.9);break;
- case 2: DACconversion(PCF8591,0x40,(100-i)*0.6*4.9);break;
- case 3: DACconversion(PCF8591,0x40,(100-i)*0.4*4.9);break;
- case 4: DACconversion(PCF8591,0x40,(100-i)*0.2*4.9);break;
- }
- }
- }
- if(v==2) //(方波)
- {
- if(i<50)
- {
- switch(y)
- {
- case 0: DACconversion(PCF8591,0x40,D[4]);break;
- case 1: DACconversion(PCF8591,0x40,D[4]*0.8);break;
- case 2: DACconversion(PCF8591,0x40,D[4]*0.6);break;
- case 3: DACconversion(PCF8591,0x40,D[4]*0.4);break;
- case 4: DACconversion(PCF8591,0x40,D[4]*0.2);break;
- }
- }
- else
-
- switch(y)
- {
-
- case 0: DACconversion(PCF8591,0x40,D[0]);break;
- case 1: DACconversion(PCF8591,0x40,D[0]*0.8);break;
- case 2: DACconversion(PCF8591,0x40,D[0]*0.6);break;
- case 3: DACconversion(PCF8591,0x40,D[0]*0.4);break;
- case 4: DACconversion(PCF8591,0x40,D[0]*0.2);break;
-
- }
- }
- if(v==3) //(鋸齒)
- {
- if(i<100)
- {
- switch(y)
- {
- case 0: DACconversion(PCF8591,0x40,i*2.49);break;
- case 1: DACconversion(PCF8591,0x40,i*0.8*2.49);break;
- case 2: DACconversion(PCF8591,0x40,i*0.6*2.49);break;
- case 3: DACconversion(PCF8591,0x40,i*0.4*2.49);break;
- case 4: DACconversion(PCF8591,0x40,i*0.2*2.49);break;
- }
- }
- if(i==100)
- {i=0;
-
- }
- }
-
-
- }
- Data_Buffer[0]=v%10; //(通道口)
- Data_Buffer[1]=PIN[p]%10; //(頻率)
- Data_Buffer[2]=FU[y]%10; //(幅度)
- }
-
- }
- void Timer0() interrupt 1 //(定時(shí)器0)
- {
- TH0=high[p];
- TL0=low[p];
-
- flag=1;
- Bit++;
- if(Bit>=3)Bit=0;
- P2 |=0xf0; //先關(guān)位碼
- P0=Duan[Data_Buffer[Bit]]; //開段碼
- switch(Bit) //送位碼
- {
- case 0: P24=0;break;
- case 1: P25=0;break;
- case 2: P26=0;break;
- case 3: P27=0;break;
- }
- }
- /*******************************************************************
- DAC 變換, 轉(zhuǎn)化函數(shù)
- *******************************************************************/
- bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val)
- {
- Start_I2c(); //啟動(dòng)總線
- SendByte(sla); //發(fā)送器件地址
- if(ack==0)return(0);
- SendByte(c); //發(fā)送控制字節(jié)
- if(ack==0)return(0);
- SendByte(Val); //發(fā)送DAC的數(shù)值
- if(ack==0)return(0);
- Stop_I2c(); //結(jié)束總線
- return(1);
- }
復(fù)制代碼
|
|