📄 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; //小数点后第3位
vv[2] = (temp/10)%10; //小数点后第2位
vv[1] = temp/100; //小数点后第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); //有数字键按下则开始输入频率
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()
*输入调制度
*********************************************************************/
/* 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); //有数字键按下则开始输入频率
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_d0 [] ={"A:Input Fre:"};
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) //确认键
{
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() ; //输入调制度
} break;
} */
default: break;
}
}
/****************************************************
**********主程序*************
*****************************************************/
void main (void)
{
code uchar str0[] = {"Welcome!"};
code uchar str1[] = {"Please opt step:"};
POWK = 1; //电源关
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; //电源关
// POWZ = 0;
CCON0=0x10;
ADC_Init (0) ;
Ts = 1667; //采样周期,晶振40M,则载波为1/(Ts*T)
Half_Ts = 833*3; //半采样周期
// k1=120;
K_M = 256; //调制系数放大倍数
K_F = 256; //输入频率放大倍数
// K_sin = 256; //sin表放大倍数
// K_coe = K_M * K_sin; //总放大倍数,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();
}
//主循环,一个采样周期后,读取AD的给定频率值重新计算调制度M和载波比N
//如果计算时间不够的话,可以另设M2,N2变量,在定时器中断程序中判断K=2*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初始化,选择模拟通道输入,初始化时钟,关闭ADC中断
*参 数:channel - uchar 选择ADC通道
*注 意:当ADC通道改变得时候,此子程序一定要被调用
*****************************************************************************/
void ADC_Init (unsigned char channel)
/******************************************************************************
* uint ADC_Read(channel)
*功能描述:读A/D转换后的数据
*参 数:channel,初始化程序中选择的通道
*返 回 值:ADC转换结果,12位
*注 意:该子程序调用前,ADC_Init()必须先被调用
*******************************************************************************/
unsigned int ADC_Read( unsigned char channel )
/******************************************************************************
* uint ADC_Get(channel)
*功能描述:直接得到AD转换值
*参 数:channel,选择读取通道
*返 回 值:uint ADC转换结果
*****************************************************/
unsigned ADC_Get (uchar channel)
void getVA (unsigned char channel)
*返 回 值:uint ADC转换结果
*****************************************************/
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; //小数点后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]);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -