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

📄 serialtest.c

📁 c8051f005的16*2液晶显示程序张工
💻 C
📖 第 1 页 / 共 2 页
字号:
    }	

	ep = 1;
	delay();
	ep = 0;	

}


lcd_init()
{							//LCD初始化设定
	lcd_wcmd(0x38);			//
	delayms(1);
	lcd_wcmd(0x0c);			//
	delayms(1);
	lcd_wcmd(0x06);			//
	delayms(1);
	lcd_wcmd(0x01);			//清除LCD的显示内容
	delayms(1);
}

void dacout(unsigned int output)
{
 unsigned int i;
 i=output>>8;
 DAC0L = (char) output;	// DAC0 Low Byte Register
 DAC0H = (char) i;	// DAC0 High Byte Register
}

unsigned int get_c1(void)
{
 unsigned int c1=0;
 AMX0SL = 0x00;	// AMUX Channel Select Register
 ADBUSY=1;
 while (!flag_ad);
 c1=kk;
 flag_ad=0;
 return (c1);
}

unsigned int get_c2(void)
{
 unsigned int c2=0;
 AMX0SL = 0x01;	// AMUX Channel Select Register
 ADBUSY=1;
 while (!flag_ad);
 c2=kk;
 flag_ad=0;
 return (c2);
}

unsigned int get_c3(void)
{
 unsigned int c3=0;
 AMX0SL = 0x04;	// AMUX Channel Select Register
 ADBUSY=1;
 while (!flag_ad);
 c3=kk;
 flag_ad=0;
 return (c3);
}

unsigned int get_c4(void)
{
 unsigned int c4=0;
 AMX0SL = 0x03;	// AMUX Channel Select Register
 ADBUSY=1;
 while (!flag_ad);
 c4=kk;
 flag_ad=0;
 return (c4);
}


unsigned int filter_c1(void)
{
   unsigned int  sum = 0;
   unsigned char count;
   for ( count=0;count<N;count++)
   {
      sum=sum+get_c1();
   }
   return (unsigned int)(sum/N);
}

unsigned int filter_c2(void)
{
   unsigned int  sum = 0;
   unsigned char count;
   for ( count=0;count<N;count++)
   {
      sum=sum+get_c2();
   }
   return (unsigned int)(sum/N);
}
unsigned int filter_c3(void)
{
   unsigned int  sum = 0;
   unsigned char count;
   for ( count=0;count<N;count++)
   {
      sum=sum+get_c3();
   }
   return (unsigned int)(sum/N);
}

unsigned int filter_c4(void)
{
   unsigned int  sum = 0;
   unsigned char count;
   for ( count=0;count<N;count++)
   {
      sum=sum+get_c4();
   }
   return (unsigned int)(sum/N);
}


void display_c3(unsigned int m)   
{
  unsigned char a,b,c,d;
  a=m/1000;
  b=(m-1000*a)/100;
  c=(m-1000*a-100*b)/10;
  d=m-1000*a-100*b-10*c;
  lcd_wdat(number[a]);
  lcd_wdat(0x2e);
  lcd_wdat(number[b]);
  lcd_wdat(number[c]);
  lcd_wdat(number[d]);
  lcd_wdat(0x56);
}

void display_c4(unsigned int m)   
{
  unsigned char a,b,c,d;
  a=m/1000;
  b=(m-1000*a)/100;
  c=(m-1000*a-100*b)/10;
  d=m-1000*a-100*b-10*c;
  lcd_wdat(number[a]);
  lcd_wdat(0x2e);
  lcd_wdat(number[b]);
  lcd_wdat(number[c]);  
  lcd_wdat(number[d]);
  lcd_wdat(0x56);
}

void display_c1(unsigned int m)   
{
  unsigned char a,b,c,d;
  a=m/1000;
  b=(m-1000*a)/100;
  c=(m-1000*a-100*b)/10;
  d=m-1000*a-100*b-10*c;
  lcd_wdat(number[a]);
  lcd_wdat(0x2e);
  lcd_wdat(number[b]);
  lcd_wdat(number[c]);  
  lcd_wdat(number[d]);
  lcd_wdat(0x56);
}

void display_c2(unsigned int m)   
{
  unsigned char a,b,c,d;
  a=m/1000;
  b=(m-1000*a)/100;
  c=(m-1000*a-100*b)/10;
  d=m-1000*a-100*b-10*c;
  lcd_wdat(number[a]);
  lcd_wdat(0x2e);
  lcd_wdat(number[b]);
  lcd_wdat(number[c]);
  lcd_wdat(number[d]);
  lcd_wdat(0x56);

}






void interrupt0(void) interrupt 0    //key_enter scan
{
 if (k<2)
	k++;
 else
	k=0;
}

void timer0(void) interrupt 1
{


 if (!key_up)
   {
    display_set=display_set+10;
   }

 if (!key_down)
   {
    display_set=display_set-10;
   }

  TH0=0x20;
  TL0=0x00;
}

void interrupt1(void) interrupt 2    //key_enter scan
{
  flag_set=!flag_set;
  if (flag_set)
    {
    	lcd_wcmd(0x0f);
		EX0=1;
		TR0=1;
    }

  else
    {
    	lcd_wcmd(0x0c);
		EX0=0;
		TR0=0;
		switch (k)
		{
		 case 0 : current_da = (long)current_set<<8;
		          current_da = current_da/180;
				  voltage_out= (unsigned int)current_da;
				  current_dac=current_set;
				  break;
         case 1 : voltage_out=0;
		          break;
         case 2 : voltage_out=0;
		          break;
         default: voltage_out=0;
		          break;
		}
    }
}

void serial () interrupt 4 using 3 
{
	if (RI)
	{
		unsigned char ch;
                RI = 0;
	        ch=SBUF;
	        if (!flag_handshake)
	          {
	          	handshaking=ch;
	          	flag_handshake=1;
	          }
	        else
	        {
	        	if (!flag_len)
	        	{
	        		data_len=ch;
	        		flag_len=1;
	        	}
	        	else
	        	{
	        			inbuf[count]=ch;
	        			count++;
	        			if ((count>=data_len))
	        			{
	        			    count=0;
	        				flag_handshake=0;
	        				flag_len=0;
							flag_end=1;
	        			}
	        	}
	        }
	}
}

void send_char_com(unsigned char ch)  
{
    SBUF=ch;
    while(TI==0);
    TI=0;
}

void send_string_com(unsigned char *str,unsigned int strlen)
{
    unsigned int k=0;
    do 
    {
        send_char_com(*(str + k));
        k++;
    } while(k < strlen);
}

void ADC0_ISR() interrupt 15{
	ADCINT=0;
	flag_ad=1;
	kk=ADC0VAL;

	
	
	/*
	ADC0转化值乘以单端电平系数,其结果为电平真实值乘以100000
	例如ADC0VAL=1024时,realvol=1024*118=120832,即表示真实电压为1.20832v 
	*/
	
	
	/*
	ADC0转化值乘以物理量转化系数,来表示物理量值
	例如某速度传感器输出为0-2.43V,其量程为0-1m/s,
	则target_val为物理量值乘以1000000
	例如ADC0VAL=1024时,target_val=1024*488=499712,即表示真实物理量为0.499712m/s
	这里存在计算误差是因为没有采用浮点运算,对于精度要求低于0.2%,则采用上述长整型计算即可满足要求
	若系统要求更高精度,则可考虑浮点运算。
	*/
	
}

main()
{
	BYTE i,j;

	unsigned char c4_l,c4_h,c3_l,c3_h,c2_l,c2_h,c1_l,c1_h;
	long c3_ad=0,c4_ad=0,c2_ad=0,c1_ad=0;
	unsigned char n;
	config();
	OSCXCN = 0x67;	// EXTERNAL Oscillator Control Register	
    for (n = 0; n < 255; n++) ;            // wait for osc to start    while ( (OSCXCN & 0x80) == 0 );        // wait for xtal to stabilize
	OSCICN = 0x0C;	// Internal Oscillator Control Register
	
	lcd_init();

	delayms(1);
    led_cc=0;
    led_cv=0;
    led_cp=0;
    led_cr=0;
	EA = 1;
    TR1=1;
	while (1)
	{
	 dacout(voltage_out);
	 
     c1_adc = filter_c1();
     c2_adc = filter_c2();
     c3_adc = filter_c3();
	 c4_adc = filter_c4();

	 c3_ad = (long) c3_adc*2438;
     c3_ad = c3_ad>>12;
     c3_dis = (unsigned int) c3_ad;
   
     c4_ad = (long) c4_adc*2438;
	 c4_ad = c4_ad>>12;
     c4_dis = (unsigned int) c4_ad;

	 c2_ad = (long) c2_adc*2438;
	 c2_ad = c2_ad>>12;
     c2_dis = (unsigned int) c2_ad;

	 c1_ad = (long) c1_adc*2438;
	 c1_ad = c1_ad>>12;
     c1_dis = (unsigned int) c1_ad;

	 c4_h=(unsigned char)(c4_adc>>8);
     c4_l=(unsigned char)c4_adc;
	 c3_h=(unsigned char)(c3_adc>>8);
     c3_l=(unsigned char)c3_adc;
     c2_h=(unsigned char)(c2_adc>>8);
     c2_l=(unsigned char)c2_adc;
	 c1_h=(unsigned char)(c1_adc>>8);
     c1_l=(unsigned char)c1_adc;	 

	 lcd_pos(0x14);				// 设置显示位置为第一行的第1个字符
	 i = 0;
	 while(dis1[i] != '\0')
	 {						// 显示字符"voltage="
		lcd_wdat(dis1[i]);
		i++;
	 }
	 display_c3(c3_dis); //显示电压值

	 lcd_pos(0x54);			// 设置显示位置为第二行的第1个字符
	 i = 0;
	 while(dis2[i] != '\0')
	 {
		lcd_wdat(dis2[i]);	// 显示字符"current="
		i++;
	 }
     display_c4(c4_dis);//显示电流值
     
	 lcd_pos(0x40);			// 设置显示位置为第二行的第1个字符
	 i = 0;
	 while(dis7[i] != '\0')
	 {
		lcd_wdat(dis7[i]);	// 显示字符"c2="
		i++;
	 }
     display_c2(c2_dis);//显示功率值

     lcd_pos(0x00);
	 i = 0;
	 while(dis3[i] != '\0')
	 {						// 显示字符"c1="
		lcd_wdat(dis3[i]);
		i++;
	 }
	 display_c1(c1_dis);//显示功率值
    

	 sendbuf[0]=c1_h;
	 sendbuf[1]=c1_l;
	 sendbuf[2]=c2_h;
	 sendbuf[3]=c2_l;
	 sendbuf[4]=c3_h;
	 sendbuf[5]=c3_l;
	 sendbuf[6]=c4_h;
	 sendbuf[7]=c4_l;
	 sendbuf[8]=sendbuf[2]+sendbuf[3]+sendbuf[4]+sendbuf[5]+sendbuf[6]+sendbuf[7];

	 if (flag_end)
	   {
	    
	   }
	 

    
	 
	 
	 

     

	
     
     
	 delayms(50);

	 }

	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -