#include<reg52.h>
#include <intrins.h>
/////////////////////////
#define uchar unsigned char
#define uint unsigned int
uchar table[]=" The voltage is";
uchar ADtemp;
double squ,squad;
sbit lcdrs=P2^2;
sbit lcdwr=P2^3;
sbit lcden=P2^4;
sbit ADCS = P3^4;
sbit ADCLK = P3^5;
sbit ADDI = P3^6;
sbit ADDO = P3^6;
/////////////////////////
void delay(uint delay_time)//延时函数
{
for(;delay_time>0;delay_time--);
}
void write_lcdcom(uchar date)//写lcd1602命令
{
lcdwr=0;
lcdrs=0;
delay(5);
P0=date;
lcden=1;
delay(5);
lcden=0;
}
void write_lcddate(uchar lcddate)//写1602数据
{
lcdwr=0;
lcdrs=1;
delay(5);
P0=lcddate;
lcden=1;
delay(5);
lcden=0;
}
void lcd_init()//1602初始化
{
write_lcdcom(0x38); //display mode
//write_lcdcom(0x38); //display mode
//write_lcdcom(0x38); //display mode
write_lcdcom(0x06); //显示光标移动位置
write_lcdcom(0x0c); //显示开及光标设置
write_lcdcom(0x01); //显示清屏
}
////////////////////////////
void display()//现实字符子函数
{
uchar i;
lcdwr=0;
lcdrs=0;
lcden=0;
write_lcdcom(0x80);
for(i=0;i<16;i++)
{
write_lcddate(table[i]);
}
lcdwr=1;
lcdrs=1;
lcden=1;
}
////////////////////////////volt显示函数
void lcd_printf(uint shuju)//第二行1602显示
{
uchar qian,bai,shi,ge;
qian=shuju/1000;
bai=shuju%1000/100;
shi=shuju%1000%100/10;
ge=shuju%10;
write_lcdcom(0xc5);
write_lcddate(qian+0x30);//0x30是0的ascii码
write_lcdcom(0xc5+1);
write_lcddate('.');
write_lcdcom(0xc5+2);
write_lcddate(bai+0x30);
write_lcdcom(0xc5+3);
write_lcddate(shi+0x30);
write_lcdcom(0xc5+4);
write_lcddate(ge+0x30);
write_lcdcom(0xc5+6);
write_lcddate('v');
}
//////////////////////////
uchar ADC0832(bit mode,bit channel) //AD转换,返回结果
{
uchar i,dat,ndat;
ADCS = 0;//拉低CS端
_nop_();//延时
_nop_();
ADDI = 1; //第1个下降沿为高电平
ADCLK = 1;//拉高CLK端
_nop_();
_nop_();
ADCLK = 0;//拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADDI = mode; //低电平为差分模式,高电平为单通道模式。
ADCLK = 1;//拉高CLK端
_nop_();
_nop_();
ADCLK = 0;//拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADDI = channel; //低电平为CH0,高电平为CH1
ADCLK = 1;//拉高CLK端
_nop_();
_nop_();
ADCLK = 0;//拉低CLK端,形成下降沿3
ADDI = 1;//控制命令结束(经试验必需)
dat = 0;
//下面开始读取转换后的数据,从最高位开始依次输出(D7~D0)
for(i = 0;i < 8;i++)
{
dat <<= 1;
ADCLK=1;//拉高时钟端
_nop_();
_nop_();
ADCLK=0;//拉低时钟端形成一次时钟脉冲
_nop_();
_nop_();
dat |= ADDO;
}
ndat = 0; //记录D0
if(ADDO == 1)
ndat |= 0x80;
//下面开始继续读取反序的数据(从D1到D7)
for(i = 0;i < 7;i++)
{
ndat >>= 1;
ADCLK = 1;//拉高时钟端
_nop_();
_nop_();
ADCLK=0;//拉低时钟端形成一次时钟脉冲
_nop_();
_nop_();
if(ADDO==1)
ndat |= 0x80;
}
ADCS=1;//拉高CS端,结束转换
ADCLK=0;//拉低CLK端
ADDI=1;//拉高数据端,回到初始状态
if(dat==ndat)
return(dat);
else
return 0;
}
void main()
{
float voltage;
uint v;
//T1time1();
lcd_init();
display();
while(1)
{
ADtemp=ADC0832(0,0); //差分模式,CH0-CH1
voltage=(float)ADtemp*5/256;//8位ad转换值
v=voltage*1000;//放大1000倍方便在1602显示
lcd_printf(v);//1602显示电压值
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
基于C51单片机设计的放大滤波检测电路proteus仿真图+源码.rar (33个子文件)
基于C51单片机设计的放大滤波检测电路proteus仿真图+源码
Thumbs.db 5KB
LM358波峰检测电路.DSN 93KB
LM358陷波电路.DSN 92KB
AD-1602.DSN 112KB
正弦波发生滤波检测电路.gif 689KB
LM358同相放大电路.DSN 95KB
滤波.DSN 62KB
正弦波发生电路.DSN 98KB
液晶显示AD值
AD-1602.M51 13KB
AD-1602.Uv2 2KB
adlcd1602 10KB
AD-1602.lnp 66B
AD-1602 9KB
adlcd1602.OBJ 10KB
AD-1602.PWI 2KB
AD-1602.Opt 920B
adlcd1602.Opt 1020B
STARTUP.A51 5KB
AD-1602.hex 2KB
AD-1602.DSN 116KB
Last Loaded AD-1602.DBK 116KB
adlcd1602.c 3KB
adlcd1602.Uv2 2KB
STARTUP.obj 826B
adlcd1602.plg 199B
adlcd1602.M51 13KB
STARTUP.lst 11KB
AD-1602.LST 437B
adlcd1602.lnp 50B
AD-1602.plg 201B
adlcd1602.hex 4KB
adlcd1602_Opt.Bak 1023B
adlcd1602.LST 8KB
共 33 条
- 1
资源评论
GJZGRB
- 粉丝: 1075
- 资源: 5911
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功