📄 newlcdtest_1127.c
字号:
/////////////////////反射电压显示///////////////////////////
uchar xdata out[]="HZS,14,70,7,0.00V";
//////////////////////驻波比显示////////////////////////////
uchar xdata rat[]="HZS,28,51,7,0.0";
//////////////////////温度显示/////////////////////////////
uchar xdata tem[]="HZS,28,114,7, 0";
/////////////////////////////////标志显示////////////////////////////
////////////////////////三角或空格/////////////////////////////////
//第一行或左声道(第5行)
uchar xdata sanjiao_1[]="IMG,0,0,7,12,12,0000000018000E0007000380038007000E00180000000000";
uchar xdata space_1[]="HZS,0,0,7, ";
//第二行
uchar code sanjiao_2[]="IMG,14,0,7,12,12,0000000018000E0007000380038007000E00180000000000";
uchar code space_2[]="HZS,14,0,7, ";
//第三行或右声道(第24行)
uchar xdata sanjiao_3[]="IMG,28,0,7,12,12,0000000018000E0007000380038007000E00180000000000";
uchar xdata space_3[]="HZS,28,0,7, ";
//////////////////////圆圈//////////////////////////////////
//第一行
uchar xdata quan_1[]="IMG,0,0,7,12,12,0000000007000F801DC018C01DC00F800700000000000000";
//第二行
uchar code quan_2[]="IMG,14,0,7,12,12,0000000007000F801DC018C01DC00F800700000000000000";
//第三行
uchar xdata quan_3[]="IMG,28,0,7,12,12,0000000007000F801DC018C01DC00F800700000000000000";
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////主函数/////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void main(void)
{
uchar keytemp=0;
uchar keyvalue=0;
uint i = 0;
char l=0;
int n=0,j;
ulong voltage1,voltage2,voltage3;
ulong intemp,outtemp,rattemp,temtemp;
//float pow;
EA=0;
c8051_initial( ); //单片机初始化
reset_3w();
wbyte_3w(0x8e);//写保护控制寄存器
wbyte_3w(0); //允许写入
reset_3w();
wbyte_3w(0x90);//涓流充电控制寄存器
wbyte_3w(0xab);//允许充电 双二极管 8K电阻
reset_3w();
FlashRead(para,17);//读flash
flag_store=para[0];
if(flag_store==1)//使用默认参数还是保存设置的参数
para_stored( );
else
para_default( );
clear_screen();
lcd_face();
control_initial( ); //控制参数初始化
main_menu1();
vfd_com(sanjiao_1,sizeof(sanjiao_1));
vfd_com(update_screen,sizeof(update_screen));
LEDSTATE=0x0d;
ADC0CN = 0x80; //1000 0000 ADC允许,除转换期间一直跟踪 允许窗口比较
DAC0CN = 0x80;
DAC1CN = 0x80;//1000 0000;
DAC0=0;
count_TF2=0;//T2中断次数开始计数
TR2=1; //允许定时器2
RCAP2H=0x00;
RCAP2L=0x00;
en_vfd=1;
////////////串口协议及思路说明////////////////
//共五个字节,存入buf中.
//其中,字节0为设备号,收到与设备号相同的字节0,进行相应操作,字节0与设备号不同,中断返回;
//字节一:最高位为读(1)写(0)命令位,其他七位为工作参数地址号
//字节二到字节四:工作参数数据段.
//采用中断方式,首字节接收完成产生中断,将所有数据接收完,然后根据数据进行相应操作,包括返回错误信息.
//错误状态字格式:
// MSB____________________________________________________________________________LSB
// | ERR_ADDR | ERR_LEN | ERR_DATA | ERR_COM | ERR_AUD | ERR_CTR | 0 | 0 |
// |__________|_________|___________|___________|___________|___________|_____|_____|
//ERR_ADDR=1:工作参数地址号非法;
//ERR_LEN=1: 数据长度非法;
//ERR_DATA=1:数据非法;
//ERR_COM=1:命令非法.
//ERR_AUD=1:静音,音量不能更改
//ERR_CTR=1且ERR_DATA=1:控制电压增长过快
//ERR_CTR=1:功率已达到30瓦,控制电压不能再增加
while(1)
{
if(control_choice==1)ES0=1; //control_choice=1远控允许
else ES0=0;
EX0=1; //允许外部中断0
EA=0;
if(LOCK==1)LEDSTATE=LEDSTATE&0xbf;
else LEDSTATE=LEDSTATE|0x40;
if((SHUZI==0)&&(MONI==0))
LEDSTATE=LEDSTATE&0xfe;
else LEDSTATE=LEDSTATE|0x01;
AMX0SL=0x02;//2通道为入射电压取样
AD0INT=0;
AD0BUSY=1;
while(AD0INT==0);
voltage1=ADC0;
AMX0SL=0x03;//3通道为反射电压取样
AD0INT=0;
AD0BUSY=1;
while(AD0INT==0);
voltage2=ADC0;
AMX0SL=0x04;//4通道为温度取样
AD0INT=0;
AD0BUSY=1;
while(AD0INT==0);
voltage3=ADC0;
intemp=(ulong)4860*voltage1;
vol_in=intemp>>12;
if(vol_in<=50)
{
vol_in=0;
goto out;
}
if((vol_in<=3180)&&(vol_in>50))
{
vol_in-=40;
goto out;
}
if((vol_in<=3680)&&(vol_in>=3181))
{
vol_in-=30;
goto out;
}
if((vol_in<=4080)&&(vol_in>=3681))
{
vol_in-=20;
goto out;
}
if((vol_in<=4310)&&(vol_in>=4081))
{
vol_in-=10;
goto out;
}
if((vol_in<=4670)&&(vol_in>=4531))
{
vol_in+=10;
goto out;
}
if(vol_in>=4671)
{
vol_in+=20;
goto out;
}
out:
for(i=0;i<36;i++)
{
if((vol_in<voltage[i+1])&&(vol_in>=voltage[i]))
break;
}
power_out=(power[i+1]-power[i])/(voltage[i+1]-voltage[i])*(vol_in-voltage[i])+power[i];
//power_out=pow*(vol_in-voltage[i])+power[i];
if((menu_grade==3)&&(main_value==1)&&(sub_value==2))
{
if(((power_out-power_out_1)>=30)||((power_out_1-power_out)>=30))
display_power(power_out);
}
power_out_1=power_out;
outtemp=(ulong)4860*voltage2;
vol_out=outtemp>>12;
temtemp=(ulong)4860*voltage3;
vol_tem=temtemp>>12;
for(i=0;i<11;i++)
{
if((vol_tem<=voltage_temper[i+1])&&(vol_tem>=voltage_temper[i]))
break;
}
j=(voltage_temper[i+1]-voltage_temper[i])/(temperature[i+1]-temperature[i]);
temper=(vol_tem-voltage_temper[i])/j+temperature[i];
rattemp=(voltage1+voltage2)*10/(voltage1-voltage2);
if((rattemp<20)||(ctr_vol<=190))
{
OVER=0;
LEDSTATE=LEDSTATE&0x7f; //保护
}
if((rattemp>=20)&&(en_power==0)&&(ctr_vol>190))
OVER=1;
if(((rattemp>=30)&&(en_power==0)&&(ctr_vol>190))||(temper>40))
{
en_power=2;
LEDSTATE=LEDSTATE&0xdf;
LEDSTATE=LEDSTATE|0x80; //保护
OVER=1;//过载
sent(EN_RF,0x00,0x00,en_power|freq_clk);
ctr_vol=140;
voltemp=ctr_vol*5;
DAC0L=voltemp;
DAC0H=voltemp>>8;
}
ratio=rattemp;
if(menu_grade==4)
{
display_in(vol_in);
display_out(vol_out);
display_ratio(ratio);
display_temper(temper);
}
EA=1;
}
}
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////函数定义///////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
//////////////////////单片机控制部分////////////////////////////
///////////////////////////////////////////////////////////////
/////////////////////单片机初始化/////////////////////////////
void c8051_initial(void)
{
WDTCN = 0xde; //1101 1110 禁止看门狗定时器
WDTCN = 0xad; //1010 1101
XBR0 = 0x04; //0000 0100 RX0,TX0 连到两个端口引脚
XBR1 = 0x14; //0001 0100 允许INT0,INT1
XBR2 = 0x44; //0100 0100 允许交叉开关和弱上拉,RX1,TX1连到两个端口引脚
P0MDOUT=0x0f; //P0输出方式
P1MDIN=0xff; //P1输入方式为数字输入
P1MDOUT=0xff; //P1输出方式设为推挽方式
P2MDOUT=0xff; //P2输出方式设为推挽方式
P3MDOUT=0x07; //P3输出方式:0-2设为推挽方式,3-7为开漏方式
P3=0xf8; //P3.3-P3.7为数字输入
P3IF=0x0c; //外部中断6,7由IE6和IE7输入的上升沿触发
P74OUT=0xcf; //7,5,4端口输出方式为推挽,P6除7,6脚外,其他为数字输入方式
P6=0xff;
LEDSTATE=0x00;
OVER=0;
MULOCK=0;
OSCXCN = 0x67; //0110 0111 外部振荡器控制寄存器,晶体振荡器方式,频率>6.74MHZ
while(!(OSCXCN & 0x80));//等待外部晶体起振
OSCICN = 0x08; //0000 1000 内部振荡器控制寄存器 选择外部时钟源作为系统时钟
//Timer
SCON1 = 0x50; //0101 0000 UART1串行口方式1,8位可变波特率 接收允许
PCON = 0x80; //1001 0000 UART0串口波特率加倍允许
TCON = 0x01; //0100 0101 禁止了定时器0及定时器1,设置了中断触发方式
TMOD = 0x20; //0010 0000 当TR1=1时,允许定时器1,工作在方式2:自动重装载的8位定时器
CKCON = 0x00; //0000 0000 定时器0,1,2,4使用系统时钟的12分频
T4CON = 0x34; //0011 0100 定时器4溢出作为UART1发送和接收时钟
T2CON = 0x00; //0000 0000 禁止定时器2,定时器1溢出作为UART0发送和接收时钟
SCON0 = 0x50; //0101 0000 UART0串行口方式1,8位可变波特率 接收允许
RCAP4H = 0xff; //装载定时器4的时间常数,UART1波特率为19200(固定值)
RCAP4L = 0xee;
TH1 = -(SYSCLK/((baudrate==1)?BAUDRATE4800:((baudrate==2)?BAUDRATE9600:BAUDRATE19200))/192);//装载定时器1
TL1 = -(SYSCLK/((baudrate==1)?BAUDRATE4800:((baudrate==2)?BAUDRATE9600:BAUDRATE19200))/192);
TR1 = 1; //定时器1允许
//DAC
REF0CN = 0x03; //0000 0011温度传感器关闭,内部偏压允许 电压基准缓冲器工作
DAC0H = 0;
DAC0L = 0;
DAC0CN = 0; //禁止DA,数据右对齐
DAC1H = 0;
DAC1L = 0;
DAC1CN = 0;
//ADC
AMX0CF = 0x00; //0000 0000 AIN0~7为独立的单端输入
AMX0SL = 0x00; //0000 0000 通道选择 从AIN0输入
//ADC0CF = 0x60; //0110 0000 转换时钟等于系统时钟,ADC内部放大器增益为1
ADC0CF = (SYSCLK/2500000)<<3;//ADC0转换时钟为2.5MHz,PGA增益为1
ADC0CN = 0x00; /*0000 0000ADC禁止,当ADC被允许时,除了转换期间一直出于跟踪方式ADC完成一次数据转换
ADC转换结束以来没有有效的数据转换 向ADCBUSY写1启动数据转换 未发生窗口匹配 寄存器数据右对齐*/
//ADC0H = 0;
//ADC0L = 0;
PX0 = 0;//外部中断0为默认优先级
ET2 = 1;//允许定时器2中断
PT2 = 0;//定时器2中断为默认优先级
ES0 = 0;//禁止UART0中断
ET1 = 0;//禁止定时器1的所有中断
EX1 = 0;//禁止外部中断1的中断
ET0 = 0;//禁止定时器0的中断请求
EX0 = 1;//允许引脚/INT0的中断请求
EIE2 = 0x00;//禁止外部中断6,7
}
///////////////////////初始化控制字//////////////
void control_initial(void)
{
sent(EN_RF,0x00,0x00,freq_clk|en_power);
delay(300);
freq_div(freq_carry);
dispart(freq_msb);
sent(FREQ_M,0x00,msb,lsb);
dispart(freq_lsb);
sent(FREQ_L,0x00,msb,lsb);
delay(300);
sent(MODE,0x00,0x00,mode_operate);
delay(300);
sent(TUNNEL,0x00,0x00,tunnel_choice);
delay(300);
dispart24(lweight);
sent(LAUDIO,msb,isb,lsb);
delay(300);
dispart24(rweight);
sent(RAUDIO,msb,isb,lsb);
delay(300);
sent(TIME,0x00,0x00,time_choice);
delay(300);
delay_div(delay_audio);
dispart(delay_quo);
sent(DELAY,0x00,msb,lsb);
dispart(delay_res);
sent(DELAY1,0x00,msb,lsb);
delay(300);
dispart(delay_19k);
sent(DELAY_19K,0x00,msb,lsb);
delay(300);
dispart24(cont_fm);
sent(CONT,msb,isb,lsb);
delay(300);
dispart24(pilot_vol);
sent(PILOT,msb,isb,lsb);
delay(300);
}
///////////////////////////外部中断服务程序///////////////////////
void exint0(void) interrupt 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -