问题描述
- 单片机:51单片机+ADC0804+LCD1602
- #include
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define IO_1602 P0
#define IO_0804 P1uint temp date;
uchar qianbaishige;
uchar cc[16]="" M O D E "";sbit lcdrs=P2^0;//LCD液晶的寄存器选择端
sbit lcdrw=P2^1;//LCD液晶的读写选择端
sbit lcden=P2^2;//LCD液晶的使能端
sbit adcs=P3^2;//AD的片选信号
sbit adrd=P3^7;//外部读取转换结果的控制信号
sbit adwr=P3^6;//A/D转换器启动控制信号
sbit adintr=P3^3;//中断请求信号输出端void delay_ms(uint t);//延时函数
void lcdxzl(uchar dat);//LCD液晶写指令函数
void lcdxsj(uchar dat);//LCD液晶写数据函数
void lcdinit();//LCD液晶初始化函数
/*void adinit();//ADC0804初始化函数
void start();//AD0804开始转化函数
uint adraed();//读取AD0804转化后的数据*/
uchar adc0804(void);
uint datpro(void);//ADC0804读出的数据处理
void display();//显示电压值函数void delay_ms(uint t)//延时程序
{
uchar xy;
for(t;t>0;t--)
{for(x=0;x<114;x++)
for(y=0;y<1;y++);
}
}void lcdxzl(uchar dat) //LCD液晶写指令函数
{
lcden=0;
IO_1602=dat;
lcdrs=0;
lcdrw=0;
lcden=1;
delay_ms(10);
lcden=0;
delay_ms(10);
}void lcdxsj(uchar dat)//LCD液晶写数据函数
{
lcden=0;
IO_1602=dat;
lcdrs=1;
lcdrw=0;
lcden=1;
delay_ms(10);
lcden=0;
delay_ms(10);
}void lcdinit()//LCD液晶初始化函数
{
uint a;
delay_ms(15);
lcdxzl(0x38);//设置16x2显示,5x7点阵,8位数据口
delay_ms(5);
lcdxzl(0x38);//设置16x2显示,5x7点阵,8位数据口
delay_ms(5);
lcdxzl(0x01);//光标及移动设置
lcdxzl(0x06);//显示开及光标设置
lcdxzl(0x0c);//全屏清0
lcdxzl(0x80);//设置初始显示地址
delay_ms(50);
for(a=1;a<16;a++)
{
lcdxsj(cc[a]);
delay_ms(50);
}
}void adinit()//AD0804初始化函数
{
adcs=1;
adwr=1;
adrd=1;
P3=0xff;
delay_ms(10);
}void start()//AD0804开始转化函数
{
P1=0xff;
adcs=0;
adwr=1;
adwr=0;
delay_ms(10);
adwr=1;
delay_ms(10);
}uint adraed()//读取AD0804转化数据
{
adcs=0;
adrd=1;
adrd=0;
delay_ms(10);
temp=P1;
delay_ms(10);
adrd=1;
adcs=1;
adwr=1;
delay_ms(10);
return (temp);
}void display()
{
uint s;
uint a;
s=adread();
s=s*1200;
a=s*8;
lcdxzl(0x80+0x40);
lcdxsj('U');
lcdxzl(0x80+0x41);
lcdxsj(':');
lcdxzl(0x80+0x42);lcdxsj('0'+s/1000);
lcdxzl(0x80+0x43);
lcdxsj('0'+s%1000/100);
lcdxzl(0x80+0x44);
lcdxsj('.');
lcdxzl(0x80+0x45);
lcdxsj('0'+s%100/10);
lcdxzl(0x80+0x46);
lcdxsj(0x30+s%10);
lcdxzl(0x80+0x47);
lcdxsj('V');
lcdxzl(0x80+0x4a);
lcdxsj('I');
lcdxzl(0x80+0x4b);
lcdxsj(':');
lcdxzl(0x80+0x4c);
lcdxsj('0'+s*8/10);
lcdxzl(0x80+0x4d);
lcdxsj('0'+s*8%10);
lcdxzl(0x80+0x4e);
lcdxsj('A');
}void main()
{
lcdinit();
while(1)
{
display();//显示电压值在LCD1602}
}
为什么我写出来的程序不能显示测出的电压
解决方案
你首先要确保自己的1602显示没有问题,这样才能有个信息反馈给你是否采集到电压。
入股显示没有问题,那么就要看你IO口的顺序是否正确,0804与单片机的通信是否有问题
解决方案二:
51单片机和ADC0804连接是否有问题?
ADC0804周围的连接是否有问题?
51单片机是否可正常运行
51单片机和LCD1602连接是否有问题?
解决方案三:
adc初始化和开始函数都没有用到