#include<reg52.h>
#include<intrins.h>
#define LCD1602_DB
#define uchar unsigned char
#define uint unsigned int
uchar a;
sbit LCD1602_RS=P2^5;
sbit LCD1602_RW=P2^6;
sbit LCD1602_EN=P2^7;
//sbit LCD1602_DB=P0;
sbit ADCLK=P2^2; // ADS7818 串行时钟输入
sbit ADDATA=P2^1; // ADS7818 串行数据的输出
sbit ADCON=P2^0; // ADS7818 转换信号输入
sbit BEEP=P2^4; // 蜂鸣器 BEEP 与单片机相连的引脚 P3^3
uint h=0;
sbit s1=P1^0;
sbit s2=P1^1;
sbit s3=P1^2;
sbit s4=P1^3;
#define V200_on {s4=0;s3=1;s2=1;s1=1;} //宏定义不同量程,不同开关状态
#define V20_on {s4=1;s3=0;s2=1;s1=1;}
#define V2_on {s4=1;s3=1;s2=0;s1=1;}
#define V200mv_on {s4=1;s3=1;s2=1;s1=0;}
int ADValue=0;
int V;
uchar table1[]="19082304009";
uchar table2[]="Guo Mengran";
/*延时函数*/
void Delay(uint ms) //毫秒 ms 级延时函数
{
uint i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
/*BEEP 蜂鸣器*/
void Loop(void)
{
while(h==1)
{
BEEP=!BEEP;
Delay(100);
BEEP=!BEEP;
}
}
/*ADS7818 数据提取*/
unsigned int ADConv()
{
unsigned char i;
int ADValue=0;
ADCON=0; //产生的下跳边沿,启动 AD 转换
_nop_(); //延时给 ADS7818 以启动转换响应时间
_nop_();
ADCLK=1; //第一个时钟信号
_nop_(); //延时以使高电平维持 50ns 以上,低电平同理
_nop_();
ADCLK=0;
_nop_();
_nop_();
ADCLK=1; //在第 2 个时钟的上升沿将转换结果移出 ADS7818
_nop_();
_nop_();
for(i=0;i<12;i++) //准备送后 12 个时钟脉冲
{ if(ADDATA) //当引脚 DATA电平为高
ADValue|=0x001; //末位置 1
ADValue=ADValue<<1; //左移 1 位
ADCLK=0;
_nop_();
_nop_();
ADCLK=1;
_nop_();
_nop_();
}
ADCON=1; //CONV 引脚电平拉高,为一下次转换作准备
_nop_();
_nop_();
ADCLK=0; //本次转换已完成,拉低 CLK 端,也可以拉高
_nop_();
_nop_();
ADDATA=1; //拉高 ADDATA端,回到初始状态
return(ADValue); //返回转换结果
}
/*数据处理*/
/*1602*/
/*写命令*/
void Write_Cmd(uchar cmd)
{
LCD1602_RS=0; //写命令
LCD1602_RW=0;
// LCD1602_DB=cmd; //准备发送命令
P0=cmd;
Delay(5);
LCD1602_EN=1;
Delay(5);
LCD1602_EN=0;
}
/*写数据*/
void Write_Dat(uchar dat)
{
LCD1602_RS=1; //写命令
LCD1602_RW=0;
// LCD1602_DB=dat; //准备发送命令
P0=dat;
Delay(5);
LCD1602_EN=1;
Delay(5);
LCD1602_EN=0;
}
/*显示*/
void Display()//int V
{
int bw,sw,gw,yw,ew;
//uint dat;
//dat=V*100;
bw=V/10000; //取得百位数字
sw=V%10000/1000;//取得十位数字
gw=V/100%10;//取得个位数字
yw=V/10%10 ; //小数点后一位
ew=V%10000; //小数点后二位
Write_Cmd(0x89);
Write_Dat(0x30+bw);
Write_Cmd(0x8a);
Write_Dat(0x30+sw);//数字+30得到该数字的LCD1602显示码
Write_Cmd(0x8b);
Write_Dat(0x30+gw);//数字+30得到该数字的LCD1602显示码
Write_Cmd(0x8c);
Write_Dat('.');
Write_Cmd(0x8d);
Write_Dat(0x30+yw);//数字+30得到该数字的LCD1602显示码
Write_Cmd(0x8e);
Write_Dat(0x30+ew);//数字+30得到该数字的LCD1602显示码
}
/*LCD1602初始化*/
void LCD_INIT()
{
LCD1602_RW=0;
LCD1602_EN=0;
Write_Cmd(0x38); //设置显示模式
Write_Cmd(0x0c); //开显示不显示光标,光标不闪烁
Write_Cmd(0x06); //写一个指针加1
Write_Cmd(0x01); //清屏
Write_Cmd(0x80); //设置数据指针起点
}
/*主函数*/
void main()
{
LCD_INIT(); //LCD初始化
Delay(10); //延时100us
INIT();
while(1)
{
V200_on;
Write_Cmd(0x80+17);
Delay(10);
for(a=0;a<11;a++)
{
Write_Dat(table1[a]);
Delay(10);
}
Write_Cmd(0xc0+17);
Delay(10);
for(a=0;a<11;a++)
{
Write_Dat(table2[a]);
Delay(10);
}
for(a=0;a<16;a++)
{
Write_Cmd(0x18);
Delay(10);
}
/*_200v;
V200_on;
ADConv();
if(ADValue>3276)
{
Loop();
}
if((ADValue<=3276)&&(ADValue>=327))
{
V=(ADValue*2.5/4096)*100;
Display();
}
if(ADValue<327)
{
V20_on;
ADConv();
if((ADValue<=3276)&&(ADValue>=327))
{
V=(ADValue*2.5/4096)*10;
Display();
}
if(ADValue<327)
{
V2_on;
ADConv();
if((ADValue<=3276)&&(ADValue>=327))
{
V=(ADValue*2.5/4096)*10;
Display();
}
if(ADValue<327)
{
V200mv_on
ADConv();
V=(ADValue*2.5/4096)*0.1;
}
}
}*/
}
}
评论12