单片机电压采集系统问题求解0804
时间:10-02
整理:3721RD
点击:
大婶们,看进来看看,解决我一点小问题,我用0804和单片机进行电压采集,但是不知道哪里出错了,只能运行一次测量一次,一旦采集电压变化,显示屏的数字就会显示出错,必须要再点击运行一次,所以不能测量动态的电压,比如正弦波,以下是程序,附proteus仿真图,谢谢
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD1602_RW=P2^5; //一直困惑的问题是位定义接口错了,fuck、、、、、、、、、、、、、、、、rw与rs
sbit LCD1602_RS=P2^6 ;
sbit LCD1602_E=P2^7 ;
sbit CS=P3^5;
sbit ADWR=P3^6;
sbit ADRD=P3^7;
uchar k=0;
void delay(uint z) ;
char ADC0804(void)
{
uchar aaa;
CS=0;
ADWR=1;
delay(100);
ADWR=0;
delay(100);
ADWR=1;
delay(100);
ADRD=1;
delay(100);
ADRD=0;
delay(100);
aaa=P1;
P0=P1;
ADRD=1;
CS=1;
return(aaa);
}
void write_com(uchar com) //写命令
{
LCD1602_RS=0;
LCD1602_RW = 0;
P0=com;
delay(5);
LCD1602_E=1;
delay(5);
LCD1602_E=0;
}
void write_data(uchar date) //写数据
{
LCD1602_RS=1;
LCD1602_RW = 0;
P0=date;
delay(5);
LCD1602_E=1;
delay(5);
LCD1602_E=0;
}
void init() //初始化
{
LCD1602_E=0;
write_com(0x38); //开显示
write_com(0x0e); // 光标
write_com(0x06); // 指针加一
write_com(0x01); // 清屏
write_com(0x80); //设置数据指针起点
}
void main (void) //主函数
{
uint bai,shi,ge,f,f1,f2,f3,f4,f5,f6,f7;
uchar m,b,h;
init();
while(1)
{
P1=ADC0804();
b=P1;
init();
bai=b/100; //把IO口数据转化成十进制
b=b%100;
shi=b/10;
ge=b%10;
f1=(bai*100+shi*10+ge)/51; //转换成0-5v之间的电压值,此处为第一位
f2=(bai*100+shi*10+ge)%51; //取余
f3=f2*10;
f4=f3/51; //小数点后一位
f5=((f3%51)*10)/51; //小数点后二位
f6=((f3%51)*10)%51; //以下为小数点后三位的四舍五入
f7=(f6*10)/51;
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
write_com(0x80+0x40); //设置指针起点为第二排
write_data(0x30+f1);
write_data('.');
write_data(0x30+f4);
write_data(0x30+f5);
write_data(0x30+f7);
delay(1000);
}
}
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD1602_RW=P2^5; //一直困惑的问题是位定义接口错了,fuck、、、、、、、、、、、、、、、、rw与rs
sbit LCD1602_RS=P2^6 ;
sbit LCD1602_E=P2^7 ;
sbit CS=P3^5;
sbit ADWR=P3^6;
sbit ADRD=P3^7;
uchar k=0;
void delay(uint z) ;
char ADC0804(void)
{
uchar aaa;
CS=0;
ADWR=1;
delay(100);
ADWR=0;
delay(100);
ADWR=1;
delay(100);
ADRD=1;
delay(100);
ADRD=0;
delay(100);
aaa=P1;
P0=P1;
ADRD=1;
CS=1;
return(aaa);
}
void write_com(uchar com) //写命令
{
LCD1602_RS=0;
LCD1602_RW = 0;
P0=com;
delay(5);
LCD1602_E=1;
delay(5);
LCD1602_E=0;
}
void write_data(uchar date) //写数据
{
LCD1602_RS=1;
LCD1602_RW = 0;
P0=date;
delay(5);
LCD1602_E=1;
delay(5);
LCD1602_E=0;
}
void init() //初始化
{
LCD1602_E=0;
write_com(0x38); //开显示
write_com(0x0e); // 光标
write_com(0x06); // 指针加一
write_com(0x01); // 清屏
write_com(0x80); //设置数据指针起点
}
void main (void) //主函数
{
uint bai,shi,ge,f,f1,f2,f3,f4,f5,f6,f7;
uchar m,b,h;
init();
while(1)
{
P1=ADC0804();
b=P1;
init();
bai=b/100; //把IO口数据转化成十进制
b=b%100;
shi=b/10;
ge=b%10;
f1=(bai*100+shi*10+ge)/51; //转换成0-5v之间的电压值,此处为第一位
f2=(bai*100+shi*10+ge)%51; //取余
f3=f2*10;
f4=f3/51; //小数点后一位
f5=((f3%51)*10)/51; //小数点后二位
f6=((f3%51)*10)%51; //以下为小数点后三位的四舍五入
f7=(f6*10)/51;
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
write_com(0x80+0x40); //设置指针起点为第二排
write_data(0x30+f1);
write_data('.');
write_data(0x30+f4);
write_data(0x30+f5);
write_data(0x30+f7);
delay(1000);
}
}
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
单片机电压采集
【OK210试用体验】+自拟标题
【OK210试用体验】+自拟标题
酱油party路过
不错的资料,值得收藏