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. Delegate,Action,Func,匿名方法,匿名委托,事件 (转载)

    Delegate,Action,Func,匿名方法,匿名委托,事件 (转载) 一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本 ...

  2. 熟悉JSON

    JSON是什么 JSON ( JavaScript Object Notation) ,是一种数据交互格式. 为什么有这个技术 Json之前,大家都用 XML 传递数据.XML 是一种纯文本格式,所以 ...

  3. 解决ubuntu常见问题

    cd /usr/local/hadoop 1. bash: cd: ~:Permission denied 报错:bash: cd: /usr/local/hadoop:Permission deni ...

  4. 【密码学】轻松理解“加盐”的原理与java实现

    转自:https://blog.csdn.net/DavidHuang2017/article/details/80283469 一.什么是加盐? 1.背景 现在很多公司后台以hash值形式存储用户密 ...

  5. spring学习 十七 scope属性,单例多例

    Scope属性是<bean>中的属性,取值可以有, singleton 默认值, 单例, prototype 多例, 每次获取重新实例化, request 每次请求重新实例化, sessi ...

  6. 2019.01.22 hdu5195 DZY Loves Topological Sorting(贪心+线段树)

    传送门 题意简述:给出一张DAGDAGDAG,要求删去不超过kkk条边问最后拓扑序的最大字典序是多少. 思路:贪心帮当前不超过删边上限且权值最大的点删边,用线段树维护一下每个点的入度来支持查询即可. ...

  7. 2019.01.21 bzoj2441: [中山市选2011]小W的问题(树状数组+权值线段树)

    传送门 数据结构优化计数菜题. 题意简述:给nnn个点问有多少个www型. www型的定义: 由5个不同的点组成,满足x1<x2<x3<x4<x5,x3>x1>x2 ...

  8. BUG YII2.0 $ is not defined

    来源:https://www.cnblogs.com/attitudeY/p/6279985.html BUG描述:$ is not defined 没有加载jquery成功 原因:Yii2.0将JS ...

  9. 用 ASP.NET MVC 实现基于 XMLHttpRequest long polling(长轮询) 的 Comet(转)

    轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接. 优点:后端程序编写比较容易. 缺点:请求中有大半是无用,浪费带宽和服务器资源. 实例:适于小型应用. 长轮询:客 ...

  10. AttributeError: type object 'testClass' has no attribute 'testMothod'

    点击"Unittest for test_post_API.testClass"按钮,点击”Edit configuration...“,弹出对话框Run/Debug config ...