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. django模板语言和过滤

    一:模板组成 HTML代码 + 逻辑控制代码 逻辑代码组成格式: 使用大括号来引用变量, {{ var_name }} 二: Template和Context对象 //进入该的django的项目环境 ...

  2. PHP 判断字符串括号是否匹配

    <?php function aa($str) { $temp = array(); for ($i = 0; $i < strlen($str); $i++) { $t = $str[$ ...

  3. maven mirror , profile , snapshot 和release

    1. settings.xml 配置的mirror <mirrors> <mirror> <id>Nexus</id> <name>nexu ...

  4. Sophus libSophus.so

    在编译包含Sophus的源文件的时候,出现如下错误 ../lib/libmyslam.so: undefined reference to `Sophus::SO3::SO3(double, doub ...

  5. 《C#从现象到本质》读书笔记(二)第2章 C#类型基础(上)

    <C#从现象到本质>读书笔记第二篇 第2章 C#类型基础(上) 类型指的是集合{类,结构,接口,枚举,委托}中的任意一个成员.任何拥有某类型的值(value)称为某类型的一个实例(inst ...

  6. On the internet, nobody known you are a dog !

  7. windows中执行celery beat任务

    由于最新的celery4.2不支持windows系统,因此按照网上的建议安装了3.1.25版.按照官网的说明使用 app.conf.beat_schedule = { 'add-every-30-se ...

  8. 如何将frm文件导入MySql数据库

    只要在mysql的安装文件中找到data文件夹,然后在里面建立一个文件夹,比如test.这个test其实就对应着数据库的名称,所以,你想要起什么样的数据库名称就把文件夹起什么名字. 然后把.frm文件 ...

  9. C#装箱,拆箱和强制转换(转)

    出处:https://www.cnblogs.com/fengjiulin110120/p/6605739.html 关系: 强制转换就包含有装箱拆箱操作,装箱就是把值类型转换成引用类型,反之就是拆箱 ...

  10. 安装了nodejs后在命令行运行npm报错:Error: Cannot find module 'internal/util/types'

    报错如下图所示: 解决方法:删除目录“C:\Users\wls\AppData\Roaming\npm\node_modules”下的npm文件夹