/*************************此部分为I2C总线的驱动程序*************************************/

#include#include #include本文引用地址:http://www.eepw.com.cn/article/201611/315912.htm

#define NOP() _nop_() /* 定义空指令 */

#define _Nop() _nop_() /*定义空指令*/

sbit SCL=P2^0; //I2C 时钟

sbit SDA=P2^1; //I2C 数据

bit ack; /*应答标志位*/

/*******************************************************************

起动总线函数

函数原型: void Start_I2c();

功能: 启动I2C总线,即发送I2C起始条件.

********************************************************************/

void Start_I2c()

{

SDA=1; /*发送起始条件的数据信号*/

_Nop();

SCL=1;

_Nop(); /*起始条件建立时间大于4.7us,延时*/

_Nop();

_Nop();

_Nop();

_Nop();

SDA=0; /*发送起始信号*/

_Nop(); /* 起始条件锁定时间大于4μs*/

_Nop();

_Nop();

_Nop();

_Nop();

SCL=0; /*钳住I2C总线,准备发送或接收数据 */

_Nop();

_Nop();

}

/*******************************************************************

结束总线函数

函数原型: void Stop_I2c();

功能: 结束I2C总线,即发送I2C结束条件.

********************************************************************/

void Stop_I2c()

{

SDA=0; /*发送结束条件的数据信号*/

_Nop(); /*发送结束条件的时钟信号*/

SCL=1; /*结束条件建立时间大于4μs*/

_Nop();

_Nop();

_Nop();

_Nop();

_Nop();

SDA=1; /*发送I2C总线结束信号*/

_Nop();

_Nop();

_Nop();

_Nop();

}

/*******************************************************************

字节数据发送函数

函数原型: void SendByte(UCHAR c);

功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对

此状态位进行操作.(不应答或非应答都使ack=0)

发送数据正常,ack=1; ack=0表示被控器无应答或损坏。

********************************************************************/

void SendByte(unsigned char c)

{

unsigned char BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/

{

if((c< else SDA=0;

_Nop();

SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/

_Nop();

_Nop(); /*保证时钟高电平周期大于4μs*/

_Nop();

_Nop();

_Nop();

SCL=0;

}

_Nop();

_Nop();

SDA=1; /*8位发送完后释放数据线,准备接收应答位*/

_Nop();

_Nop();

SCL=1;

_Nop();

_Nop();

_Nop();

if(SDA==1)ack=0;

else ack=1; /*判断是否接收到应答信号*/

SCL=0;

_Nop();

_Nop();

}

/*******************************************************************

字节数据接收函数

函数原型: UCHAR RcvByte();

功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),

发完后请用应答函数应答从机。

********************************************************************/

unsigned char RcvByte()

{

unsigned char retc;

unsigned char BitCnt;

retc=0;

SDA=1; /*置数据线为输入方式*/

for(BitCnt=0;BitCnt<8;BitCnt++)

{

_Nop();

SCL=0; /*置时钟线为低,准备接收数据位*/

_Nop();

_Nop(); /*时钟低电平周期大于4.7μs*/

_Nop();

_Nop();

_Nop();

SCL=1; /*置时钟线为高使数据线上数据有效*/

_Nop();

_Nop();

retc=retc<<1;

if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */

_Nop();

_Nop();

}

SCL=0;

_Nop();

_Nop();

return(retc);

}

/********************************************************************

应答子函数

函数原型: void Ack_I2c(bit a);

功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)

********************************************************************/

void Ack_I2c(bit a)

{

if(a==0)SDA=0; /*在此发出应答或非应答信号 */

else SDA=1;

_Nop();

_Nop();

_Nop();

SCL=1;

_Nop();

_Nop(); /*时钟低电平周期大于4μs*/

_Nop();

_Nop();

_Nop();

SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/

_Nop();

_Nop();

}

#include#include

#define PCF8591 0x90 //PCF8591 地址

//else IO

sbit LS138A=P2^2;

sbit LS138B=P2^3;

sbit LS138C=P2^4;

//此表为 LED 的字模, 共阴数码管 0-9 -

unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char AD_CHANNEL;

unsigned long xdata LedOut[8];

unsigned int D[32];

/*******************************************************************

DAC 变换, 转化函数

*******************************************************************/

bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val)

{

Start_I2c(); //启动总线

SendByte(sla); //发送器件地址

if(ack==0)return(0);

SendByte(c); //发送控制字节

if(ack==0)return(0);

SendByte(Val); //发送DAC的数值

if(ack==0)return(0);

Stop_I2c(); //结束总线

return(1);

}

/*******************************************************************

ADC发送字节[命令]数据函数

*******************************************************************/

bit ISendByte(unsigned char sla,unsigned char c)

{

Start_I2c(); //启动总线

SendByte(sla); //发送器件地址

if(ack==0)return(0);

SendByte(c); //发送数据

if(ack==0)return(0);

Stop_I2c(); //结束总线

return(1);

}

/*******************************************************************

ADC读字节数据函数

*******************************************************************/

unsigned char IRcvByte(unsigned char sla)

{ unsigned char c;

Start_I2c(); //启动总线

SendByte(sla+1); //发送器件地址,地址加一的原因是地址字的最后一位0为写,1为读

if(ack==0)return(0);

c=RcvByte(); //读取数据0

Ack_I2c(1); //发送非就答位

Stop_I2c(); //结束总线

return(c);

}

//******************************************************************/

main()

{ char i,j;

while(1)

{/********以下AD-DA处理*************/

switch(AD_CHANNEL)

{

case 0: ISendByte(PCF8591,0x41);

D[0]=IRcvByte(PCF8591)*2; //ADC0 模数转换1,乘以2的原因是把结果00~0xff换算成0~510,除以100就是实际采样值了

break;

case 1: ISendByte(PCF8591,0x42);

D[1]=IRcvByte(PCF8591)*2; //ADC1 模数转换2

break;

case 2: ISendByte(PCF8591,0x43);

D[2]=IRcvByte(PCF8591)*2; //ADC2模数转换3

break;

case 3: ISendByte(PCF8591,0x40);

D[3]=IRcvByte(PCF8591)*2; //ADC3 模数转换4

break;

case 4: DACconversion(PCF8591,0x40, D[4]/4); //DAC 数模转换

break;

}

// D[4]=400; //数字--->>模拟输出

D[4]=D[3];

if(++AD_CHANNEL>4) AD_CHANNEL=0;

/********以下将AD的值送到LED数码管显示*************/

LedOut[0]=Disp_Tab[D[1]%10000/1000];

LedOut[1]=Disp_Tab[D[1]%1000/100];

LedOut[2]=Disp_Tab[D[1]%100/10]|0x80;

LedOut[3]=Disp_Tab[D[1]%10];

LedOut[4]=Disp_Tab[D[0]%10000/1000];

LedOut[5]=Disp_Tab[D[0]%1000/100];

LedOut[6]=Disp_Tab[D[0]%100/10]|0x80;

LedOut[7]=Disp_Tab[D[0]%10];

for( i=0; i<8; i++)

{ P1 = LedOut[i];

switch(i) //使用switch 语句控制138译码器 也可以是用查表的方式 学员可以试着自己修改

{

case 0:LS138A=0; LS138B=0; LS138C=0; break;

case 1:LS138A=1; LS138B=0; LS138C=0; break;

case 2:LS138A=0; LS138B=1; LS138C=0; break;

case 3:LS138A=1; LS138B=1; LS138C=0; break;

case 4:LS138A=0; LS138B=0; LS138C=1; break;

case 5:LS138A=1; LS138B=0; LS138C=1; break;

case 6:LS138A=0; LS138B=1; LS138C=1; break;

case 7:LS138A=1; LS138B=1; LS138C=1; break;

}

for (j = 0 ; j<90 ;j++) { ;} //扫描间隔时间

}

P1 = 0;

}

}

pcf8591c语言编程,ADDA系列PCF8591的驱动程序相关推荐

  1. c8051f c语言编程,C8051F系列单片机开发与C语言编程

    C8051F系列单片机开发与C语言编程 维普资讯 http://doc.xuehai.net 雎 A 21进行控制,这样可以选择不同的地址,进而控制的读写. S D1 5 E 6对应的内存和寄存器. ...

  2. 使用c语言编程首先要新建,【C语言编程入门系列】—— 第三章,编写第一个C语言程序!...

    导读:一般学一门计算机语言的第一堂上机课("上机"顾名思义,上计算机,机你太美),就是往屏幕输出"hello world",本章也不例外. 3.1 Hello, ...

  3. 视频教程-Kali Linux渗透测试全程课与脚本语言编程系列课程-渗透测试

    Kali Linux渗透测试全程课与脚本语言编程系列课程 本人有多年的服务器高级运维与开发经验,擅长计算机与服务器攻防及网络攻防技术!对网络安全领域有持续的关注和研究! 林晓炜 ¥899.00 立即订 ...

  4. 单片C语言程序设计,用C语言编程操作SPMC75系列单片 - 控制/MCU - 电子发烧友网

    用C语言编程操作SPMC75系列单片机内部Flash的方法 SPMC75系列单片机的内部程序存储器采用Flash,其中有一部分Flash在程序自由运行模式下可以由程序擦除.写入,本文主要介绍采用C语言 ...

  5. 博途中用的是c吗_S7-1500系列博途中使用SCL语言编程方法简介

    S7-1500系列博途中使用SCL语言编程方法简介 SCL:Structured Contorl Language,结构化控制语言. 在TIA博途软件中,默认支持SCL语言,在建立程序块时可以直接选择 ...

  6. 单片机c语言编程入门下載,系列单片机C语言编程入门.pdf

    系列单片机C语言编程入门.pdf 本文由c h e n j u n j u n j u n 3贡献 p d f 文档可能在WAP端浏览体验不佳.建议您优先选择TXT,或下载源文件到本机 查看. 维普资 ...

  7. 三菱PLC程序 三菱F5U 系列PLC程序,ST语言编程,配触摸屏程序,恒压测试设备,可递增,可一直保持恒压,递增的阶梯和递增的先后顺序都可在触摸屏上设置

    三菱PLC程序 三菱F5U 系列PLC程序,ST语言编程,配触摸屏程序,恒压测试设备,可递增,可一直保持恒压,递增的阶梯和递增的先后顺序都可在触摸屏上设置,有监控曲线和历史记录,PLC采用ST语言进行 ...

  8. S7-1500系列博途中使用SCL语言编程方法简介

    SCL:Structured Contorl Language,结构化控制语言. 在TIA博途软件中,默认支持SCL语言,在建立程序块时可以直接选择SCL语言. SCL语言类似计算机高级语言,如果你有 ...

  9. 中文名称:案例编程MOOK系列

    中文名称:案例编程MOOK系列 图书集锦 版本:高清晰电子图书及源代码 发行时间:2003年 地区:大陆 语言:普通话 简介: 2008-06-08日添加 Visual C/C++编程精选集锦(网络与 ...

  10. 大牛们的C语言编程建议和技巧!

    点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 我们鼓励在编程时应有清晰的哲学思维,而不是给予硬性规则.我并不希望你们能认可所有的东 ...

最新文章

  1. Softmax v.s. LogSoftmax
  2. 一根数据线玩转树莓派Zero
  3. android 单个模块编译的方法
  4. 【NLP】好资源!近 20 万本 txt 书籍的语料库,可用于 GPT 模型训练和语义分析...
  5. ios开发瀑布流框架的封装
  6. bootstrap4 左侧导航栏 优秀 大气_Axure导出html没有左侧菜单栏(导航栏)?——Mac Safari...
  7. 轮盘算法 java_java – 使用轮盘选择的遗传算法
  8. python中列表操作
  9. win7 linux启动设置u盘启动,在linux下怎么样制作win7的U盘启动?
  10. atomicReference 的使用和AtomicStampedReference 解决ABA的问题
  11. 羊毛之家,青龙脚本,几乎全部可用
  12. EasyCHM(CHM电子书制作工具) v3.84.545 绿色版
  13. matlab正反馈系统根轨迹,正反馈回路和非最小相位系统根轨迹
  14. 无人机倾斜摄影测量技术有哪些特点?
  15. Marvin is plain Jane WriteUp_实验吧_Crypto
  16. 股票波段操作的技术缺陷在哪里?
  17. 统计正数和负数的个数用C语言数组,输入10个整数统计其中的正数和负数的个数,用数组实现...
  18. Laravel实现google-authenticator--Google二维码验证器
  19. JAVA JDK介绍
  20. littlevGL:字体与汉字

热门文章

  1. DELETE_FAILED_INTERNAL_ERROR 小米之殇
  2. Android方法耗时监控工具
  3. 七周数据分析01_数据分析思维
  4. hadoop fs -du -s -h 输出三列数据的含义
  5. html怎么设置拉伸图片大小,html – 如何在不拉伸的情况下调整图像大小?
  6. 孩子兄弟存储结构的几个统计算法实现
  7. 【转】slideUp() 和slideDown() 如何解决反复抖动的问题
  8. 这有几个常见的电脑故障解决方法,需要的朋友快来
  9. python PTA合集
  10. sqlconnection mysql_深入sql数据连接时的一些问题分析