⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 newlcdtest_1127.c

📁 8051f020的屏显和控制文件包含头文件。开发环境可选用KEIL
💻 C
📖 第 1 页 / 共 5 页
字号:
/////////////////////反射电压显示///////////////////////////
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 + -