?? aaa.c
字號:
code uchar str_v[] = {"The V and A is:"};
//uchar temp1;
uint temp;
unsigned long int value;
uchar vv[3];
// ADC_EnableAll();
ADC_Init(channel);
clrlcd();
printchar(1,1,'v');
printstr(0,0,str_v);
printchar(2,1,0x3a);
printchar(4,1,0x2e) ; //"."
printchar(7,1,'V') ;
value = ADC_Read(channel);
temp = value*150; //或者88.temp = (value*2.5/1023)*1000*k
// temp1 = value % 51;
// if(temp1 >= 26)temp++;
vv[3] = temp%10; //小數(shù)點后第3位
vv[2] = (temp/10)%10; //小數(shù)點后第2位
vv[1] = temp/100; //小數(shù)點后第1位
// clrlcd();
// printchar(1,1,'v');
// printchar(2,1,0x3a);
printchar(3,1,vv[0]+48);
printchar(4,1,vv[1]+48);
printchar(5,1,0x2e) ; //"."
;
printchar(6,1,vv[2]+48);
//printchar(7,1,vv[3]+48);
//printchar(8,1,'V') ;
printchar(10,1,'I') ;
printchar(11,1,0x3a) ; //":"
printchar(15,1,'A') ; //"."
//keyv=getkey();}while(keyv == 0x0e);
}
/**************************************************************
* getPf()
*進入算功率,讀頻率程序
***************************************************************/
void getPf (void)
{ code uchar str_pf[] = {"The f and P is:"};
clrlcd();
printstr(0,0,str_pf);
printchar(1,1,'f');
printchar(2,1,0x3a); //":"
printchar(3,1,pinlv[0]+48);
printchar(4,1,pinlv[1]+48);
printchar(5,1,pinlv[2]+48);
printchar(6,1,'H');
printchar(7,1,'z');
printchar(9,1,'P');
printchar(10,1,0x3a); //":"
printchar(14,1,'W');
}
/***********************************************************
* void dat_get (void)
*進入輸入頻率程序
***********************************************************/
void dat_get (void)
{
void pwmwork(void );
code uchar hz[]={"Hz"};
code uchar putf[] = {"Please Input f:"};
uchar i;
clrlcd();
printstr(0,0,putf);
printchar(4,1,102); // "f"
printchar(5,1,58); // ":"
do{keyv=getkey();}while(keyv==0x0e); //有數(shù)字鍵按下則開始輸入頻率
for(i=0;i<3;i++)
{
do{
pinlv[i] = keyv;
printchar(6+i,1,keyv+48);
keyv=getkey();
}while(keyv!=0x0e);
if(i<=1)
{
do{keyv=getkey();}while((keyv == 0x0e)); // && (i != 0x02)
}
}
printstr(9,1,hz);
delay1ms(500);
pwmwork(); //開始PWM
}
/*********************************************************************
* m_get()
*輸入調(diào)制度
*********************************************************************/
/* void m_get(void )
{
xdata uchar i,j=2;
// code uchar ok[]={"OK"};
code uchar putm[] = {"Please Input M:"};
clrlcd();
printstr(0,0,putm);
printchar(4,1,77); // "M"
printchar(5,1,58); // ":"
do{keyv=getkey();}while(keyv==0x0e); //有數(shù)字鍵按下則開始輸入頻率
for(i=0;i<3;i++)
{
do{
mm[i] = keyv;
printchar(6+i,1,keyv+48);
keyv=getkey();
}while(keyv!=0x0e);
if(i<=1)
{
do{keyv=getkey();}while((keyv == 0x0e)); // && (i != 0x02)
}
}
printstr(14,1,OK);
delay1ms(300);
pwmwork(); //開始PWM
} */
/**********************************************************
*key_deal
鍵盤處理
***********************************************************/
void key_deal(void)
{
code uchar str_d1 [] ={"B:Get V and A:"};
code uchar str_d2 [] ={"C:Get f and P:"};
code uchar str1[] = {"Please Choose:"};
// code uchar str_m[] = {"D:Input the M:"};
// do{ keyv=getkey(); }while(keyv != 0x0e);// 開始
clrlcd();
printstr(0,0,str1); //Please input
do{keyv=getkey();} while(keyv==0x0e);
switch (keyv=getkey())
{
case 0x0a:{
clrlcd();
printstr(0,0,str1);
printstr(0,1,str_d0); //輸入頻率
do{keyv=getkey();}while(keyv==0x0a);
if(keyv==0x0e)
{
printstr(14,1,OK);
delay1ms(500);
dat_get() ;
} break; //輸入頻率值
}
case 0x0b:{
clrlcd();
printstr(0,0,str1);
//得到電壓和電流
printstr(0,1,str_d1);
delay1ms(15);
do{keyv=getkey();}while(keyv==0x0b);
if(keyv==0x0e) //確認(rèn)鍵
{
printstr(14,1,OK);
delay1ms(700);
getVA (0);
}
break;
}
case 0x0c:{
clrlcd();
printstr(0,0,str1); //算得功率,再次輸入頻率
printstr(0,1,str_d2);
delay1ms(15);
do{keyv=getkey();}while(keyv==0x0c);
if(keyv==0x0e)
{
printstr(14,1,OK);
delay1ms(500);
getPf();
}
break;
}
/* case 0x0d: {
clrlcd();
printstr(0,0,str1);
printstr(0,1,str_m); //"Input the M:"
do{keyv=getkey();}while(keyv==0x0d);
if(keyv==0x0e)
{
printstr(14,1,OK);
delay1ms(500);
m_get() ; //輸入調(diào)制度
} break;
} */
default: break;
}
}
/****************************************************
**********主程序*************
*****************************************************/
void main (void)
{
code uchar str0[] = {"Welcome!"};
code uchar str1[] = {"Please opt step:"};
POWK = 1; //電源關(guān)
POWZ = 1;
PSD33_reg.CONTROL_A = 0; //MCU I/O模式
PSD33_reg.DIRECTION_A =0xff; //輸出模式
init_lcd();
ADC_EnableAll();
printstr(4,0,str0); //"Welcom!"
printstr(0,1,str1); //"Please opt step:"
delay1ms(10);
do{ keyv=getkey(); }while(keyv != 0x0e);
key_deal();
}
void pwmwork(void)
{
unsigned char ADC_channel;
unsigned long ADC_result;
uchar f;
int du,err1,err2,uad;
// POWK = 0; //電源關(guān)
// POWZ = 0;
CCON0=0x10;
ADC_Init (0) ;
Ts = 1667; //采樣周期,晶振40M,則載波為1/(Ts*T)
Half_Ts = 833*3; //半采樣周期
// k1=120;
K_M = 256; //調(diào)制系數(shù)放大倍數(shù)
K_F = 256; //輸入頻率放大倍數(shù)
// K_sin = 256; //sin表放大倍數(shù)
// K_coe = K_M * K_sin; //總放大倍數(shù),K_M * K_sin;
F_min = 100; //最小頻率
f = pinlv[0]*100 + pinlv[1]*10 + pinlv[0] ;
F = K_F * f;
// M = mm[0]*100 + mm[1]*10 + mm[2];
M = 160;
N = (K_F*1000)/F ; // N = 1000/f;載波為1K
POWK = 0;
delay1ms(1000);
POWZ = 0;
ST = 0; //脈沖芯片使能
if ( F > F_min)
{
first();
timer0_init();
PCA_init();
}
//主循環(huán),一個采樣周期后,讀取AD的給定頻率值重新計算調(diào)制度M和載波比N
//如果計算時間不夠的話,可以另設(shè)M2,N2變量,在定時器中斷程序中判斷K=2*N時,
//將主循環(huán)中的計算值M2,N2賦給M,N進行計算
while(1)
{
if(Tm==240)
{
Tm = 0;
uad = ADC_Read(0 );
err1 = u36 - uad;
du =(err1 - err2)/4;
M = M + du;
err2 = err1;
}
keyv = getkey();
while(keyv!=0x0e)key_deal();
}
}
/******************************************************************************
* ADC_Init(channel)
*功能描述:ADC初始化,選擇模擬通道輸入,初始化時鐘,關(guān)閉ADC中斷
*參 數(shù):channel - uchar 選擇ADC通道
*注 意:當(dāng)ADC通道改變得時候,此子程序一定要被調(diào)用
*****************************************************************************/
void ADC_Init (unsigned char channel)
/******************************************************************************
* uint ADC_Read(channel)
*功能描述:讀A/D轉(zhuǎn)換后的數(shù)據(jù)
*參 數(shù):channel,初始化程序中選擇的通道
*返 回 值:ADC轉(zhuǎn)換結(jié)果,12位
*注 意:該子程序調(diào)用前,ADC_Init()必須先被調(diào)用
*******************************************************************************/
unsigned int ADC_Read( unsigned char channel )
/******************************************************************************
* uint ADC_Get(channel)
*功能描述:直接得到AD轉(zhuǎn)換值
*參 數(shù):channel,選擇讀取通道
*返 回 值:uint ADC轉(zhuǎn)換結(jié)果
*****************************************************/
unsigned ADC_Get (uchar channel)
void getVA (unsigned char channel)
*返 回 值:uint ADC轉(zhuǎn)換結(jié)果
*****************************************************/
uint ADC_Get (uchar channel)
{ uint i,j;
ADC_EnableAll();
ADC_Init(channel);
for(j=250;j>0;j--);
i = ADC_Read(channel);
return(i);
}
void getVA (uchar channel)
{
uchar str_v[] = {"The Voltage is:"};
uint temp;
uint value;
uchar vv[3];
uchar templ;
value = ADC_Get(channel);
value = value*100;
temp = (float)(value/1023)*5;
temp1 = value % 51;
if(temp1 >= 26)temp++;
vv[2] = temp%10;
vv[1] = (temp/10%)10; //小數(shù)點后1位
vv[0] = temp/100; // 個位
printstr(0,0,str_v);
printchar(5,1,vv[0]);
printchar(6,1,0x2e);
printchar(7,1,vv[0]);
printchar(8,1,vv[0]);
}
*/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -