stc89c52驱动ADC0832数模转换与显
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//将AD转换后得到数据分解为三个数为
display_buffer[0]=d/100+'0';
display_buffer[2]=d/10%10+'0';
display_buffer[3]=d%10+'0';
set_disp_pos(0x01);//设置显示位置
i=0;
while(line1[i]!='\0')
lcd_write_command(0x06);delayms(1);
lcd_write_command(0x01);delayms(1);
}
//获取AD转换结果
uchar get_ad_result()
{
uchar i,dat1=0,dat2=0;
//起始控制位置
cs=0;
clk=0;
dio=1;_nop_();_nop_();
delay4us();
result=(bit)(P0&0x80);
e=0;return result;
}
//led命令
void lcd_write_command(uchar cmd)
{
while(lcd_busy_check());
rs=0;rw=0;e=0;
_nop_();_nop_();
P0=cmd;delay4us();
sbit cs=O1^0;
sbit clk=P1^1;
sbit dio=P1^2;
//lcd1602端口定义
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
//一为整数,两位小数的数字电压显示缓冲
uchar display_buffer[]="0.00V";
//lcd第一行显示的信息
lcd_write_data(line1[i++]);//显示第一行字符
set_disp_pos(0x46);
i=0;
while(display_buffer[i]!='\0')//显示电压
lcd_write_data(display_buffer[i++]);
}
}
clk=1;dio=1;_nop_();_nop_();
//第三个下降沿之前,设DI=1,
clk=0;dio=1;_nop_();_nop_();
//弟4~11,共8个下降沿读数据(MDB->LSB)
for(i=0;i<8;i++)
{
clk=1;_nop_();_nop_();
clk=0;_nop_();_nop_();
return(dat1==dat2)?dat1 :0;
}
void main()
{
uchar i;
uint d;//注意d的类型
lcd_initialise();
delayms(10);
while(1)
{
//获取AD转换值,最大值255对应于最高电压5.00v
//本例中设计为显示三个数,故使用500
d=get_ad_result()*500.0/255;
e=1;delay4us();e=0;
}
//设置lcd显示位置
void set_disp_pos(uchar pos)
{
lcd_write_command(pos|0x80);
}
//写lcd
void lcd_write_data(uchar dat)
{
while(lcd_busy_check());
clk=1;_nop_();_nop_();
//第一个下降沿之前,设DI=1/0
//选择单端/差分(SGL/DIF)模式中的单端输入模式
clk=0;dio=1;_nop_();_nop_();
clk=1_nop_();_nop_();
//第二个下降沿之前,设DI=0/1,选择CHO/CH1
clk=0;dio=0;_nop_();_nop_();
dat1=dat1<<1|dio;
}
//弟11~18,共8个下降沿读数据(LSB->MSB)
for(i=0;i<8;i++)
{
dat2=dat2|((uchar)(dio)<<i);
clk=1;_nop_();_nop_();
clk=0;_nop_();_nop_();
}
cs=wenku.baidu.com;
//如果MDB->LSB和LSB->MSB读取的结果相同,则返回读取的结果,否则返回0
uchar code line1[]="current Voltage:";
void delay(uint ms)
{
uchar t;
while(ms--)
for(t=0;t<120;t++);
}
//LCD忙状态检测
bit lcd_busy_check()
{
bit result;
rs=0;rw=1;e=1;
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define delay4us(){_nop_();_nop_();_nop_();_nop_();}
//ADC0832引脚定义
rs=1;rw=0;e=0;
P0=dat;delay4us();
e=1;delay4us();e=0;
}
//lcd初始化
void lcd_initialise()
{
lcd_write_command(0x38);delayms(1);
lcd_write_command(0x0c);delayms(1);
display_buffer[0]=d/100+'0';
display_buffer[2]=d/10%10+'0';
display_buffer[3]=d%10+'0';
set_disp_pos(0x01);//设置显示位置
i=0;
while(line1[i]!='\0')
lcd_write_command(0x06);delayms(1);
lcd_write_command(0x01);delayms(1);
}
//获取AD转换结果
uchar get_ad_result()
{
uchar i,dat1=0,dat2=0;
//起始控制位置
cs=0;
clk=0;
dio=1;_nop_();_nop_();
delay4us();
result=(bit)(P0&0x80);
e=0;return result;
}
//led命令
void lcd_write_command(uchar cmd)
{
while(lcd_busy_check());
rs=0;rw=0;e=0;
_nop_();_nop_();
P0=cmd;delay4us();
sbit cs=O1^0;
sbit clk=P1^1;
sbit dio=P1^2;
//lcd1602端口定义
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
//一为整数,两位小数的数字电压显示缓冲
uchar display_buffer[]="0.00V";
//lcd第一行显示的信息
lcd_write_data(line1[i++]);//显示第一行字符
set_disp_pos(0x46);
i=0;
while(display_buffer[i]!='\0')//显示电压
lcd_write_data(display_buffer[i++]);
}
}
clk=1;dio=1;_nop_();_nop_();
//第三个下降沿之前,设DI=1,
clk=0;dio=1;_nop_();_nop_();
//弟4~11,共8个下降沿读数据(MDB->LSB)
for(i=0;i<8;i++)
{
clk=1;_nop_();_nop_();
clk=0;_nop_();_nop_();
return(dat1==dat2)?dat1 :0;
}
void main()
{
uchar i;
uint d;//注意d的类型
lcd_initialise();
delayms(10);
while(1)
{
//获取AD转换值,最大值255对应于最高电压5.00v
//本例中设计为显示三个数,故使用500
d=get_ad_result()*500.0/255;
e=1;delay4us();e=0;
}
//设置lcd显示位置
void set_disp_pos(uchar pos)
{
lcd_write_command(pos|0x80);
}
//写lcd
void lcd_write_data(uchar dat)
{
while(lcd_busy_check());
clk=1;_nop_();_nop_();
//第一个下降沿之前,设DI=1/0
//选择单端/差分(SGL/DIF)模式中的单端输入模式
clk=0;dio=1;_nop_();_nop_();
clk=1_nop_();_nop_();
//第二个下降沿之前,设DI=0/1,选择CHO/CH1
clk=0;dio=0;_nop_();_nop_();
dat1=dat1<<1|dio;
}
//弟11~18,共8个下降沿读数据(LSB->MSB)
for(i=0;i<8;i++)
{
dat2=dat2|((uchar)(dio)<<i);
clk=1;_nop_();_nop_();
clk=0;_nop_();_nop_();
}
cs=wenku.baidu.com;
//如果MDB->LSB和LSB->MSB读取的结果相同,则返回读取的结果,否则返回0
uchar code line1[]="current Voltage:";
void delay(uint ms)
{
uchar t;
while(ms--)
for(t=0;t<120;t++);
}
//LCD忙状态检测
bit lcd_busy_check()
{
bit result;
rs=0;rw=1;e=1;
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define delay4us(){_nop_();_nop_();_nop_();_nop_();}
//ADC0832引脚定义
rs=1;rw=0;e=0;
P0=dat;delay4us();
e=1;delay4us();e=0;
}
//lcd初始化
void lcd_initialise()
{
lcd_write_command(0x38);delayms(1);
lcd_write_command(0x0c);delayms(1);