PCF8591是不是有一套固定的操作方法?求大神解答啊,,
时间:10-02
整理:3721RD
点击:
是这样的,,我想通过改变PCF8591外围电位器而改变数码管和上位机(串口通讯)的值 用的是I2C总线通讯其中关于赋值是这样写的
Send_Byte(PCF8591,0x40)
ad_val=Rcv_Byte(PCF8591);
结果是不管怎么拧电位器 数码管和上位机的值始终都不变 试了好多办法就是就是解决不了 希望大家帮忙看看,,,是不是我PCF8591操作不当呢?。下面是全部程序
#include<reg52.h>
#include<stdio.h>
#include"I2C.h"
#define PCF8591 0x90 //PCF8591地址
unsigned char ad_val,a,t0_num,flag_num,flag_on,flag_uart,flag_time;
float ad_vo;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管段选0~9
//unsigned char code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位选
void init() //定时器初始化
{
TMOD=0x21; //设置定时器1为工作方式2,定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=0xf3; //波特率为4800
TL1=0xf3;
TR1=1;
PCON=0x80; //波特率加倍,晶振为12MHZ时为了减小误差
ET0=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
void Display(unsigned int value) //数码管显示函数
{
unsigned char ge,shi,bai;
bai=value/100;
shi=value%100/10;
ge=value%100%10;
P0=table[bai];
P2=0x7f;
P0=0x00;
Nop();
P0=table[shi];
P2=0xbf;
P0=0x00;
Nop();
P0=table[ge];
P2=0xdf;
P0=0x00;
Nop();
}
unsigned char Rcv_Byte(unsigned char value) //接受AD数据
{
unsigned char Data;
I2c_Star(); //开启总线
Write_Byte(value+1); //发送器件地址
Data=Read_Byte; //读取数据
Ack_I2c(1); //发送非就答位
I2c_Stop(); //结束总线
return Data;
}
void Send_Byte(unsigned char value,unsigned char i) //发送数据
{
I2c_Star();
Write_Byte(value);
Write_Byte(i);
I2c_Stop();
}
void main()
{
init();
while(1)
{
if(flag_uart==1) //若上位机发来数据
{
flag_uart=0;
ES=0;
TI=1;
switch(flag_on)
{
case 0:puts("Turn on AD!\n");
TR0=1;
break;
case 1:printf("Turn off AD!\n");
TR0=0;
break;
case 2:puts("Error!\n");
break;
}
while(!TI);
TI=0;
ES=1;
}
if(flag_time==1)
{
flag_time=0;
Send_Byte(PCF8591,0x40);
ad_val=Rcv_Byte(PCF8591);
ad_vo=(float)ad_val*5.0/256.0;
ES=0;
TI=1;
printf("The voltage is%fV\n",ad_vo);
while(!TI);
TI=0;
ES=1;
}
Display(ad_val);
}
}
void T0_time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0_num++;
if(t0_num==20)
{
t0_num=0;
flag_time=1;
}
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag_uart=1;
if(a==1)
flag_on=0;
if(a==2)
flag_on=1;
else
flag_on=0;
}
Send_Byte(PCF8591,0x40)
ad_val=Rcv_Byte(PCF8591);
结果是不管怎么拧电位器 数码管和上位机的值始终都不变 试了好多办法就是就是解决不了 希望大家帮忙看看,,,是不是我PCF8591操作不当呢?。下面是全部程序
#include<reg52.h>
#include<stdio.h>
#include"I2C.h"
#define PCF8591 0x90 //PCF8591地址
unsigned char ad_val,a,t0_num,flag_num,flag_on,flag_uart,flag_time;
float ad_vo;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管段选0~9
//unsigned char code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位选
void init() //定时器初始化
{
TMOD=0x21; //设置定时器1为工作方式2,定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=0xf3; //波特率为4800
TL1=0xf3;
TR1=1;
PCON=0x80; //波特率加倍,晶振为12MHZ时为了减小误差
ET0=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
void Display(unsigned int value) //数码管显示函数
{
unsigned char ge,shi,bai;
bai=value/100;
shi=value%100/10;
ge=value%100%10;
P0=table[bai];
P2=0x7f;
P0=0x00;
Nop();
P0=table[shi];
P2=0xbf;
P0=0x00;
Nop();
P0=table[ge];
P2=0xdf;
P0=0x00;
Nop();
}
unsigned char Rcv_Byte(unsigned char value) //接受AD数据
{
unsigned char Data;
I2c_Star(); //开启总线
Write_Byte(value+1); //发送器件地址
Data=Read_Byte; //读取数据
Ack_I2c(1); //发送非就答位
I2c_Stop(); //结束总线
return Data;
}
void Send_Byte(unsigned char value,unsigned char i) //发送数据
{
I2c_Star();
Write_Byte(value);
Write_Byte(i);
I2c_Stop();
}
void main()
{
init();
while(1)
{
if(flag_uart==1) //若上位机发来数据
{
flag_uart=0;
ES=0;
TI=1;
switch(flag_on)
{
case 0:puts("Turn on AD!\n");
TR0=1;
break;
case 1:printf("Turn off AD!\n");
TR0=0;
break;
case 2:puts("Error!\n");
break;
}
while(!TI);
TI=0;
ES=1;
}
if(flag_time==1)
{
flag_time=0;
Send_Byte(PCF8591,0x40);
ad_val=Rcv_Byte(PCF8591);
ad_vo=(float)ad_val*5.0/256.0;
ES=0;
TI=1;
printf("The voltage is%fV\n",ad_vo);
while(!TI);
TI=0;
ES=1;
}
Display(ad_val);
}
}
void T0_time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0_num++;
if(t0_num==20)
{
t0_num=0;
flag_time=1;
}
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag_uart=1;
if(a==1)
flag_on=0;
if(a==2)
flag_on=1;
else
flag_on=0;
}
大家帮忙看看 给我指条路,,,让我大概知道哪有问题,,,现在试了好多改变都没有 只是显示一个数值不改变
我也不懂 帮顶上去~~~
等待大神的出现