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. Spring 属性注入(三)AbstractNestablePropertyAccessor

    Spring 属性注入(三)AbstractNestablePropertyAccessor Spring 系列目录(https://www.cnblogs.com/binarylei/p/10117 ...

  2. nginx域名转发 负载均衡 反向代理

    公司有三台机器在机房,因为IP不够用,肯定要分出来,所以要建立单IP 多域名的反向代理, 就是当请求www.abc.com 跳转到本机, 请求www.bbc.com 跳转到192.168.0.35 机 ...

  3. Spring整合jedis 集群模式

    引入jedis依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis< ...

  4. Cantor表(NOIP1999)

    题目链接:Cantor表 这道题很水,但有的人没看懂题意,这不怪大家,怪题目没说清楚. 给张图: 看到这,你应该明白题目意思了. 先看看有什么规律. 我把这个数列写出来: 1/1,1/2,2/1,3/ ...

  5. Visual Studio 2015部署OpenCV

    Visual Studio 2015的安装破解及OpenCV的安装和部署 平台:win10 X64+VS2015专业版 X64:vs2015.pro_chs+OpenCV 3.X:opencv-3.4 ...

  6. 《从0到1》深度阅读笔记zz

    没有人能精准地预测未来,我们只知道两件事:一是世界必然会变得不同:二是现在再好的描述也不能让我们看到清晰的未来. 创业者把成就归功于商业模式和机会窗口,归功于创业者本人拥有的资源和能力,但还有一个最重 ...

  7. 02.制作一个自己的 Java 编辑器

    难度中等,适合 Java 基础扎实,对 Java 核心 API 有所熟悉的同学学习 No1.制作GUI界面 一.实验介绍 1.1 实验内容 本节课程的主要内容是准备开发环境,建立项目并完成 GUI 界 ...

  8. python报错ModelNotFoundError

    很可能是因为工作目录并不在sys.path中,系统无法默认的找到您的脚本文件,通过以下命令可以解决该问题: >>> import sys>>> sys.path.a ...

  9. Python-IDLE实现清屏

    1.将下面文件复制到命名为ClearWindow.py的文件下,移动到 …Python\Python36-32\Lib\idlelib下. ############################## ...

  10. python的6种基本数据类型--字典

    python的6种基本数据类型--字典   字典 字典的定义与特性 字典是Python语言中唯一的映射类型. 定义:{key1:value1,key2:value2} 1.键与值用冒号":& ...