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

📄 chengxu.c

📁 单片机调试程序
💻 C
字号:
#include<reg51.h>
#include<math.h>

void short_delay(void);                           //短延时程序
void send_1602( unsigned char DATA_OUT );	      //控制1602接收数据
void  write_command(unsigned char DATA_OUT);      //写命令
void  write_data(unsigned char DATA_OUT);		  //写数据
unsigned int fh(unsigned char i);
unsigned int Vout[10];
unsigned char counter,couter,counter1;

sbit RS=P3^1;                    //1602命令控制端
sbit RW=P3^0;	                 //1602读写控制端
sbit E=P3^7;	  	             //1602时能控制端,并且是低下降延触发

//*************************************
//1602的操作

//写数据到1602
void send_1602( unsigned char DATA_OUT )
{E=1;
 P1=DATA_OUT;
 short_delay();
 E=0;
 short_delay(); 
}

//写命令
void  write_command(unsigned char DATA_OUT)
{RS=0;
 RW=0;
 send_1602(DATA_OUT);
}

//写数据
void  write_data(unsigned char DATA_OUT)
{RS=1;
 RW=0;
 send_1602(DATA_OUT);
}

//显示单位
void  write_unit(void)	                
{write_command(0x8d);
 write_data('(');
 write_data('V');
 write_data(')');
 write_command(0x85);
 }
//*************************************
//10的指数次运算
unsigned int fh(unsigned char i)
{unsigned int temp;
  temp=1;
  for(i;i;i--)
  {temp=temp*10;
   }
 return(temp);
 }

//数据处理
void  Vout_manage(void) 
{unsigned char i,flag,temp[7]={"000000"};
// unsigned long int a;
 unsigned int a,b;
  a=0;
  for(i=(counter1);i;i--)
  {a+=Vout[i-1];}
   b=a/10;
 flag=0;
 temp[0]= (b/fh(4))+48;                        //清除标致
 for(i=3;i;i--)									   //
 {temp[4-i]=((b/fh(i))-(b/fh(i+1))*10)+48;
  }
 temp[4]=(b%10)+48;                             //求最后一位
 for(i=0;i<5;i++)
 {if(i<2)                                          //如果是整数部份,就执行整数部分的程序
    {if(!(temp[i]-48))						 	   //整数值是否为零,为零时是否是最高位为零,是不显示
	   {if(flag) write_data(temp[i]);}	          
	 else
	   {flag=1;
	     write_data(temp[i]);}   
	 }
  else if(i==2)
    {if(flag!=1)
	   {write_data('0');                           //如果显示整数为零,折显示0
	     }
	  write_data('.');			                   //显示小数点
	  write_data(temp[i]);
	  }	
  else if(i>2&&i<5) 
    {write_data(temp[i]);
	 }                                   
   }
  write_command(0x85);
 }

void yw(void)
{unsigned char i;
 for(i=9;i;i--)Vout[i]=Vout[i-1];
 }
//*************************************
//中断程序
											  
//外部脉冲计数控制,既定时器0中断控制
void  time0(void) interrupt 1 using 1
{TL0=0x00;
 TH0=0x00;
 counter++;
 }

//定时器一秒时间控制,既定时器1中断控制
void  time1(void) interrupt 3 using 1          
{unsigned char i,temp1,temp2,temp3;
 unsigned int temp;
 TL1=0xB0;
 TH1=0x3C;
 couter--;
 if(!couter)	                            //V-F转换
  {temp1=TL0;						    //低位
   TL0=0x00;
   temp2=TH0;		                    //高位
   TH0=0x00;
   couter=20;
   temp3=counter;                    
   counter=0;
   if(counter1!=10)counter1++;
   temp=(temp1+temp2*256+65536*temp3); 
   temp=(temp-2000)*1.5;
   //yw();                               //移位
   for(i=9;i;i--)Vout[i]=Vout[i-1];
   i=temp/100;
   if(50<i&&i<60)
    {temp=temp+40;}
   else if(40<i && i<50)
    {temp=temp+20;}
   else if(30<i&&i<41)
    {temp=temp+10;}
   else if(20<i&&i<31)
    {temp=temp-40;}
   else if(15<i&&i<21)
    {temp=temp-80;}
   else if(i<16)
     {switch (i)
	   {case 15:temp=temp-100;break;
	    case 14:temp=temp-150;break;
        case 13:temp=temp-180;break;
		case 12:temp=temp-200;break;
		case 11:temp=temp-200;break;
	    case 10:temp=temp-220;break;
        case 9:temp=temp-250;break;
        case 8:temp=temp-260;break;
        case 7:temp=temp-275;break;
	    case 6:temp=temp-285;break;
	    case 5:temp=temp-330;break;
	    case 4:temp=temp-410;break;
	    case 3:temp=temp-420;break;
	    case 2:temp=temp-400;break;
	     }
	   }
   Vout[0]=temp;   
   //Vout=((temp1+temp2*256+65536*temp3)-2000)*1.5;   //对数值进行1000倍放大 
   //Vout=10000; 
   //Vout=(Vout-2)*1.5;
   }
 }

//*************************************
//延时程序
void short_delay(void)
{unsigned char i;
 for(i=200;i;i--);
}  

//主程序
void main()
{unsigned char code a[9]={"Vout="};
 unsigned char i;                                                                                                                                                                                                                                                                                                          SP=0x60;
 IE=0x8A;                         //打开定时中断0和1
 IP=0x08;
 TMOD=0x15;                       //T0为外部计脉冲,T1为定时控制
 TL0=0x00;						  //设置定时器0和1的器起始时间
 TH0=0x00;
 TL1=0xB0;
 TH1=0x3C;
 //PCON=0X01;
 Vout[0]=2000;
 counter1=1;
 counter=0;
 couter=20;
 write_command(0x01);			 //关画面
 for(i=255;i;i--)		             //保证液晶正常复位
 {short_delay();
  }
  for(i=200;i;i--)		             //保证液晶正常复位
 {short_delay();
  }
 write_command(0x0c);	         //开画面
 write_command(0x38);            //设置数据为8位,并且使双行显示,5*7的点阵字体
 write_command(0x06);            //设置光标为右移
 write_command(0x80);			 //设置起始位置
 for (i=0;i<5;i++)               //显示个数据 
 {write_data( a[i] );
  }
 Vout_manage();                  //显示数值
 write_unit();	                 //显示单位
 TCON=0x50;	                     //打开定时器
 while(1)
 {Vout_manage();
  } 
}

⌨️ 快捷键说明

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