1.利用单片机控制PCF8591的AD转换,控制AD0和AD1电位器,在数码光上显示DA转换的值。

2.利用单片机控制PCF8591的DA转换,让发光二极管D1由暗到亮变化,整个过程时间差不多2s左右,再由亮到暗变化,循环变化。

以下代码将1、2实验合并成一个实验。

Lab6.1

#include<reg51.h>

#include <I2C.H>

#define  PCF8591 0x90    //PCF8591 地址

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

//=========全局变量区============================================

unsignedchar AD_CHANNEL;

];

sbit high;

sbit mid;

sbit low;

uint code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码

//=========全局变量区结束========================================

//=========函数区============================================

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

延时

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

void delay_1ms(uint x){

uint i=x;

uint j;

;--i){

;--j);

}

}

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

在数码管上显示对应的值

参数说明:

Num 要显示的数字

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

void display(uchar Num,uchar withDot)

{

P0=NumTable[Num]|withDot;

delay_1ms);

P0;      //送完段选信号后,进行消影的处理

}

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

控制数码管显示,并分解计数值

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

void DisplayNumByOrder(uint left,uint right){

low);         //left

low);

low,0x80);

low);

//right

low);

low);

low,0x80);

low);

}

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

DAC 变换, 转化函数

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

bit DACconversion(unsignedchar sla,unsignedchar c,  unsignedchar Val)

{

Start_I2c();              //启动总线

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

);

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

);

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

);

Stop_I2c();               //结束总线

);

}

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

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

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

bit ISendByte(unsignedchar sla,unsignedchar c)

{

Start_I2c();              //启动总线

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

);

SendByte(c);              //发送数据

);

Stop_I2c();               //结束总线

);

}

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

ADC读字节数据函数

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

unsignedchar IRcvByte(unsignedchar sla)

{  unsignedchar c;

Start_I2c();          //启动总线

SendByte);      //发送器件地址

);

c

Ack_I2c);           //发送非就答位

Stop_I2c();           //结束总线

return(c);

}

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

main()

{

)

{

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

//个时钟才是正常的值,相当于

//swith经历了一轮case 0~4后,程序里面读取到的AD转换的值才是正常的。

switch(AD_CHANNEL)    // A/D信道,通过这个函数,4个信道的数值都能读到

{

: ISendByte(PCF8591,0x41);

D倍显示

break;

: ISendByte(PCF8591,0x42);

D

break;

: ISendByte(PCF8591,0x43);

D

break;

: ISendByte(PCF8591,0x40);

D

break;

]);//DAC  数模转换

break;

}

D];  //   把模拟输入采样的信号通过数模转换输出,最终改变灯泡亮度

;

DisplayNumByOrder]);//将AD的值送到LED数码管显示

}

}

//=========函数结束区============================================

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

I2c.c

#include<reg51.h>

#include <intrins.h>

#include <I2C.H>

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

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

sbit     SCL;       //I2C  时钟

sbit     SDA;       //I2C  数据

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

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

起动总线函数

函数原型: void  Start_I2c();

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

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

void Start_I2c()

{

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

_Nop();

SCL;

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

_Nop();

_Nop();

_Nop();

_Nop();

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

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

_Nop();

_Nop();

_Nop();

_Nop();

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

_Nop();

_Nop();

}

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

结束总线函数

函数原型: void  Stop_I2c();

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

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

void Stop_I2c()

{

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

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

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

_Nop();

_Nop();

_Nop();

_Nop();

_Nop();

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

_Nop();

_Nop();

_Nop();

_Nop();

}

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

字节数据发送函数

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

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

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

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

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

void  SendByte(unsignedchar  c)

{

unsignedchar  BitCnt;

位*/

{

;   /*判断发送位*/

;

_Nop();

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

_Nop();

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

_Nop();

_Nop();

_Nop();

SCL;

}

_Nop();

_Nop();

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

_Nop();

_Nop();

SCL;

_Nop();

_Nop();

_Nop();

;

;        /*判断是否接收到应答信号*/

SCL;

_Nop();

_Nop();

}

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

字节数据接收函数

函数原型: UCHAR  RcvByte();

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

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

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

unsignedchar   RcvByte()

{

unsignedchar  retc;

unsignedchar  BitCnt;

retc;

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

;BitCnt++)

{

_Nop();

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

_Nop();

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

_Nop();

_Nop();

_Nop();

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

_Nop();

_Nop();

retc;

;  /*读数据位,接收的数据位放入retc中 */

_Nop();

_Nop();

}

SCL;

_Nop();

_Nop();

return(retc);

}

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

应答子函数

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

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

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

void Ack_I2c(bit a)

{

;              /*在此发出应答或非应答信号 */

;

_Nop();

_Nop();

_Nop();

SCL;

_Nop();

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

_Nop();

_Nop();

_Nop();

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

_Nop();

_Nop();

}

I2c.h

实验5 IIC通讯与AD/接DA接口的更多相关文章

  1. 实验4 IIC通讯与EEPROM接口

    1.       用C语言编程,利用定时器产生一个0~99秒变化的秒表,并且显示在数码管上,每过一秒将这个变化写入实验板上AT24C02,当关闭实验板电源,并再次打开实验板电源时,单片机从AT24C0 ...

  2. 51单片机学习笔记(郭天祥版)(6)——键盘的作业题、AD、DA、DS18B20(这里之后看清翔的补一下好了)

    A:analog,D:digital AD,就是模拟量转换为数字量,DA就是数字量转换为模拟量 为什么要转换? 单片机是数字芯片,内部只有0和1,没法表示模拟量 比如我们如果需要2.5V怎么办?其实是 ...

  3. 基于esp32的IIC通讯

    本文源码地址在:http://download.csdn.net/download/noticeable/9962029 IIC 通讯应该是当代比较常用的几种通讯方式之一,其无需特殊的IO接口,连线方 ...

  4. 用Verilog实现IIC通讯

    注意,此代码是错误代码,并不能实现想要的结果. 之所以留着,因为里面的enable 是独立开来的思想值得借鉴.就是控制单元和运算单元分开(我也是借鉴别人的实现思想).具体用verilogHDL实现II ...

  5. LPC1768的iic通讯

    LPC1768有三路IIC,其中IIC0支持高速模式和plus模式,另外两路是普通IIC,使用IIC的过程如下 首先依然是打开IIC时钟,同时打开GPIO时钟 然后配置引脚为IIC功能 另外,因为ii ...

  6. 2018-2019-1-20165221&20165225 《信息安全系统设计》实验五:通讯协议设计

    2018-2019-1-20165221&20165225 <信息安全系统设计>-实验五:通讯协议设计 OpenSSL学习: 简介: OpenSSL是为网络通信提供安全及数据完整性 ...

  7. STM32作为主设备,Arduino作为从设备进行IIC通讯的注意要点

    近日公司的项目重心要往米思齐的Arduino图形化编程上转移了,需要我将STM32和Arduino的IIC通讯调通.之前Arduino并没怎么使用过,仅仅是将超声波的代码移植成TOF激光测距而已.网上 ...

  8. 「STM32 」IIC通讯原理及其实验

    I2C两线式串行总线通讯协议,它是由飞利浦开发的,主要用于连接微控制器及其外围设备之间,它是由数据线SDA和信号线SCL构成的,可发送和接收数据即在MUC和I2C设备之间,I2C和I2C之间进行全双工 ...

  9. STM32F412应用开发笔记之三:SPI总线通讯与AD采集

    本次我们在NUCLEO-F412ZG试验模拟量输入采集.我们的模拟量输入采用ADI公司的AD7705,是一片16位两路差分输入的AD采集芯片.具有SPI接口,我们将采用SPI接口与AD7705通讯.两 ...

随机推荐

  1. Java中的逆变与协变 很直接不饶弯的讲出来了

    ```java 协变 extends只能new 辈分比自己低的家伙 List<? extends Number> list001 = new ArrayList<Integer> ...

  2. Java学习笔记:23种设计模式

    设计模式(Design pattern)的定义: In software engineering, a software design pattern is a general, reusable s ...

  3. python之并发编程初级篇8

    一.进程理论 1)进程介绍 .什么是进程 一个正在进行的过程,或者说是一个程序的运行过程 其实进程是对正在运行的程序的一种抽象/概括的说法 进程的概念起源操作系统,进程是操作最核心的概念之一 操作系统 ...

  4. IDEA导入MySQL包

    点击[Project Structure] 点击[Modules]   在点击下面的界面   找到自己下载的MySQL包就OK了  

  5. 2018.12.05 codeforces 948C. Producing Snow(堆)

    传送门 维护一个堆. 每次先算出一个都不弹掉的总贡献. 然后把要弹掉的弹掉,并减去它们对应的贡献. 代码: #include<bits/stdc++.h> #define ri regis ...

  6. 2018.11.08 NOIP模拟 景点(倍增+矩阵快速幂优化dp)

    传送门 首先按照题意构造出转移矩阵. 然后可以矩阵快速幂求出答案. 但是直接做是O(n3qlogm)O(n^3qlogm)O(n3qlogm)的会TTT掉. 观察要求的东西发现我们只关系一行的答案. ...

  7. 2018.11.01 NOIP训练 某种密码(折半搜索)

    传送门 直接折半搜索,把所有和装到unorderedmapunordered_mapunorderedm​ap里面最后统计答案就行了. 然后考试的时候读优并没有处理有负数的情况于是爆零了 代码

  8. 2018.10.29 bzoj3718: [PA2014]Parking(树状数组)

    传送门 显然只用判断两个会相交的车会不会卡住就行了. 直接树状数组维护后缀最大值就行了. 代码: #include<bits/stdc++.h> using namespace std; ...

  9. 微信小程序请求数据

    微信小程序请求数据,在页面展示,可以在onLoad生命周期中进行请求. 1.新建目录http,新建文件http.js 2.在js文件中暴露需要使用的变量 var baseUrl = 'http://1 ...

  10. MPA(Macro Prudential Assessment)即宏观审慎评估体系

    MPA(Macro Prudential Assessment)即宏观审慎评估体系.2015年12月29日,央行发布公告称,为进一步完善宏观审慎政策框架,更加有效地防范系统性风险,发挥逆周期调节作用, ...