📄 chengxu.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 + -