• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

这个数模转换程序为什么显示不了数值?

艾笠调查团 2016-10-30 浏览量:1339
RT,用的是PCF8591芯片,接图如下,调节U1电阻小灯看到小灯确实有明显的明暗变化,可就是数码管显示不出来数值
请问哪里出了错,这样写程序可靠吗,顺便再问一下,为什么写、读字节都要有SCL=0,SDA=1的操作?
编译时总出来C141错误,随便改了个名字没有了,这个错误到底是什么意思?

#include
#define uchar unsigned char
#define uint unsigned int
sbit SDA=P2^0;
sbit SCL=P2^1;
sbit du=P2^6;
sbit we=P2^7;
uchar code table[]={
//0 1 2 3 4 5 6 7 8
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F,
//9 A B C D E F - . 关显示
0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x40, 0x80, 0x00
};
uint Value;

void delay_5us()
{;;}

void delay(uint z)
{
uint a;
for(z=z;z>0;z--)
for(a=110;a>0;a--);
}

void init()
{
SDA=1;
delay_5us();
SCL=1;
delay_5us();
}

void start()
{
SDA=1;
delay_5us();
SCL=1;
delay_5us();
SDA=0;
delay_5us();
}

void stop()
{
SDA=0;
delay_5us();
SCL=1;
delay_5us();
SDA=1;
delay_5us();
}

void respons()
{
uchar i;
SCL=1;
delay_5us();
while((SDA==1)&&(i<250))i++;
delay_5us();
SCL=0;
delay_5us();
}

void write_byte(uchar dat)
{
uchar i,temp;
temp=dat;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
delay_5us();
SDA=CY;
delay_5us();
SCL=1;
delay_5us();
}
SCL=0;
delay_5us();
SDA=1;
delay_5us();
}

uchar read_byte()
{
uchar i,k;
SCL=0;
delay_5us();
SDA=1;
delay_5us();
for(i=0;i<8;i++)
{
SCL=1;
delay_5us();
k=(k<<1)|SDA;
SCL=0;
delay_5us();
}
return k;
}

void DAC_out(uchar dat)
{
start();
write_byte(0x90);
respons();

write_byte(0x40);
respons();

write_byte(dat);
respons();
stop();

}

uchar ADC_read()
{
uchar Data;
start();
write_byte(0x90);
respons();

write_byte(0x01);
respons();

start();
write_byte(0x90+1);
respons();

Data=read_byte();
return Data;
}

void display(uint V)
{
we=0;
P0=0xfe;
we=1;
we=0;
P0=table[V/100];
du=1;
du=0;
delay(5);

we=0;
P0=0xfd;
we=1;
we=0;
P0=table[V%100/10];
du=1;
du=0;
delay(5);

we=0;
P0=0xfb;
we=1;
we=0;
P0=table[V%10];
du=1;
du=0;
delay(5);
}

void main()
{
init();
while(1)
{
Value=ADC_read();
DAC_out(Value);
display(Value);
}
}


1 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 本帖最后由 MOP 于 2016-10-30 20:18 编辑

    嗨,SCL=0,SDA=1,資料傳輸完等待對方ACK,不論讀寫

    即圖中間ACK的箭頭,當有ACK回送時,SDA會被拉低
    開始信號(S):SCL為高電位時,SDA由高電位降為低電位,開始傳送資料。
    結束信號(P):SCL為高電位時,SDA由低電位升為高電位,結束傳送資料。
    應答信號(ACK):接收資料的 IC 在接收到 8bit 資料後,向發送資料的IC發出特定
    的低電位脈衝,表示已收到資料;CPU 向受控單元發出一個信號後,等待受
    控單元發出一個應答信號,CPU 接收到應答信號後,根據實際情況判斷是否
    繼續傳遞信號,若未收到應答信號,則判斷受控單元故障。
    資料讀取方式:當 SCL 由低電位升為高電位時,讀取 SDA 的資料。

    另外您的Code,如果DAC正常,表示Value是有值的,顯示時候似乎不需要再一次將we設0,delay也設成3試看看
    void display(uint V)
    {
    P0=0xfe;
    we=1;
    we=0;
    P0=table[V/100];
    du=1;
    du=0;
    delay(3);
    
    P0=0xfd;
    we=1;
    we=0;
    P0=table[V%100/10];
    du=1;
    du=0;
    delay(3);
    
    P0=0xfb;
    we=1;
    we=0;
    P0=table[V%10];
    du=1;
    du=0;
    delay(3);
    }
    以上希望對您有幫助:)

    • 发布于 2016-10-30
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:11
  • 本帖最后由 LiuYang 于 2016-10-30 18:13 编辑

    SDA、SCL是I2C的读写,控制8591的AD读取和DA的输出,所以只要是操作8591就要控制这两个脚。
    随便改了个名字就能消除编译错误?这个不太可能吧,原来报的什么错?

    • 发布于2016-10-30
    • 举报
    • 评论 0
    • 0
    • 0

  • LiuYang 发表于 2016-10-30 18:02
    SDA、SCL是I2C的读写,控制8591的AD读取和DA的输出,所以只要是操作8591就要控制这两个脚。
    随便改了个名字 ...

    比如这个:难道是不同函数定义的名字也不能一样?
    • 发布于2016-10-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 你还是把PCF8591手册好好看看
    • 发布于2016-10-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 我用protues仿真,可以确定的是,程序是可以正确读到数据的。读不到是因为………………你读的是通道1的电压,而你调的是通道0的电压,你可以调节V2电阻看看
    • 发布于2016-10-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 刚刚突然想到也许数模转换需要的时间太长,在display函数上面加个延迟5毫秒居然就显示出来了......谢谢大家了:P看来还是多学习一下基础知识
    • 发布于2016-10-31
    • 举报
    • 评论 0
    • 0
    • 0

  • MOP 发表于 2016-10-30 19:49
    嗨,SCL=0,SDA=1,資料傳輸完等待對方ACK,不論讀寫

    即圖中間ACK的箭頭,當有ACK回送時,SDA會被拉低

    這樣改了...但還是沒用,不過我發現在display上加個5毫秒延遲就可以現實了,回復這麽多謝謝啦
    • 发布于2016-10-31
    • 举报
    • 评论 0
    • 0
    • 0

  • 本帖最后由 MOP 于 2016-10-31 21:30 编辑

    艾笠调查团 发表于 2016-10-31 19:58
    這樣改了...但還是沒用,不過我發現在display上加個5毫秒延遲就可以現實了,回復這麽多謝謝啦 ...
    不會:),不過打Code時候字體要選擇一下才不會全型半型混雜,您的delay確實跟一般寫法不同,因為DAC_out(Value)有反應到LED的話,是Value取值正確而不用再延時,不過有解決問題就好,祝學習愉快:)
    • 发布于2016-10-31
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

这个数模转换程序为什么显示不了数值?