OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5067|回复: 6

AD/DA PCF8591驱动问题

[复制链接]

23

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2013-12-8
在线时间
0 小时
发表于 2014-5-23 21:03:34 | 显示全部楼层 |阅读模式
5金钱

俺的51开发板上的AD芯片是PCF8591,IIC总线的,想将AD转换的值实时显示在数码管上,同时还想利用LED灯亮度的变换来反映DA效果。结果数码管值总是不变化,LED灯也不亮,请大家帮忙找找问题,下面上图上代码

[mw_shl_code=c,true]#include <reg52.h> #include <intrins.h> sbit SDA=P2^0; sbit SCL=P2^1; sbit DU=P2^6; sbit WE=P2^7; #define uchar unsigned char #define uint unsigned int uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delayms(uchar ms) { uchar i; while(ms--) { for(i=0;i<120;i++); } } void display(uint k) { P0=table[k/1000]; DU=1; DU=0; P0=0xfb; WE=1; WE=0; delayms(1); P0=table[k%1000/100]; DU=1; DU=0; P0=0xf7; WE=1; WE=0; delayms(1); P0=table[k%100/10]; DU=1; DU=0; P0=0xef; WE=1; WE=0; delayms(1); P0=table[k%10]; DU=1; DU=0; P0=0xdf; WE=1; WE=0; delayms(1); } void delayus(void) { _nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); } void IIC_Start(void) { SDA=1; delayus(); SCL=1; delayus(); SDA=0; delayus(); } void IIC_Stop(void) { SDA=0; delayus(); SCL=1; delayus(); SDA=1; delayus(); } void IIC_Ack(void) { uchar i=0; SCL=1; delayus(); while((SDA==1)&&(i<250)) { i++; } SCL=0; delayus(); } void IIC_NoAck(void) { SDA=1; delayus(); SCL=1; delayus(); SCL=0; delayus(); } void IIC_WriteOneByte(uchar dat) { uchar i; for(i=0;i<8;i++) { SCL=0; delayus(); if(dat&0x80) { SDA=1; } else { SDA=0; } dat=dat<<1; SCL=1; delayus(); } SCL=0; delayus(); SDA=1; delayus(); } uchar IIC_ReadOneByte(void) { uchar i,dat; SCL=0; delayus(); SDA=1; delayus(); for(i=0;i<8;i++) { SCL=1; delayus(); dat<<=1; dat|=(uchar)SDA; SCL=0; delayus(); } return dat; } void DAC(uchar dat) { IIC_Start(); IIC_WriteOneByte(0x90); IIC_Ack(); IIC_WriteOneByte(0x40); IIC_Ack(); IIC_WriteOneByte(dat); IIC_Ack(); IIC_Stop(); } uchar ReadADC(unsigned char Chl) { unsigned char Data; IIC_Start(); //写入芯片地址 //Send(AddWr); IIC_WriteOneByte(0x90); IIC_Ack(); IIC_WriteOneByte(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加 IIC_Ack(); IIC_Start(); IIC_WriteOneByte(0X91); //读入地址 IIC_Ack(); Data=IIC_ReadOneByte(); //读数据 SCL=0; IIC_NoAck(); IIC_Stop(); return Data; //返回值 } void main() { uchar temp,ad; DAC(temp); while(1) { ad=ReadADC(2); display(ad); } }[/mw_shl_code]


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2014-5-23 21:44:01 | 显示全部楼层
I2C通信成功么?可以正常读写寄存器么?
站在巨人的肩膀上不断的前进。。。
回复

使用道具 举报

23

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2013-12-8
在线时间
0 小时
 楼主| 发表于 2014-5-26 09:32:44 | 显示全部楼层
回复【2楼】xiaoyan:
---------------------------------
既然数码管有显示,我觉得IIC通信应该没问题吧
回复

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2014-5-26 21:29:24 | 显示全部楼层
回复【3楼】suso:
---------------------------------
你先别用数码管显示,先用串口打印看看
站在巨人的肩膀上不断的前进。。。
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2014-5-29
在线时间
0 小时
发表于 2014-5-29 11:07:55 | 显示全部楼层
不能理解楼主的数码管显示函数,p0口既输出段码又输出位码,那你的硬件是怎么连接的呢?
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2014-8-8
在线时间
11 小时
发表于 2014-8-8 20:47:28 | 显示全部楼层
回复【5楼】stone_z:
---------------------------------
用锁存器,一个段选一个位选
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2014-8-10
在线时间
0 小时
发表于 2014-8-10 10:14:04 | 显示全部楼层
我大概浏览了一下,你的AD转换通道时设到通道2,而DAC那里却是设到通道0,你用单通道的话可以不用设的,默认通道0.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 04:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表