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. 常用的 composer 命令

    一.列表内容 composer composer list二.查看当前镜像源 composer config -l -g [repositories.packagist.org.type] compo ...

  2. GBDT原理

    样本编号 花萼长度(cm) 花萼宽度(cm) 花瓣长度(cm) 花瓣宽度 花的种类 1 5.1 3.5 1.4 0.2 山鸢尾 2 4.9 3.0 1.4 0.2 山鸢尾 3 7.0 3.2 4.7 ...

  3. Sliding Window Median LT480

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  4. Predict the Winner LT486

    Given an array of scores that are non-negative integers. Player 1 picks one of the numbers from eith ...

  5. javascript 事件流的应用之 addEventListener

    原始需求:防止按钮短时间内高频率触发点击事件,由于重复提交导致的业务异常. 图: demo: <!DOCTYPE html> <html lang="en" di ...

  6. MongoDB相关记录

    win10中zip安装 下载地址:http://dl.mongodb.org/dl/win32/x86_64 首先解压至某文件夹, 使用管理员权限打开cmd或者powershell, 进入指定目录中的 ...

  7. Mac 环境通用

    mac 下更新 .bash_profile 文件 1.打开terminal(终端) 2.cd ~ ( 进入当前用户的home目录) 3.open .bash_profile (打开.bash_prof ...

  8. Linux mount命令

    mount 1.作用 mount命令的作用是加载文件系统,它的用权限是超级用户或/etc/fstab中允许的使用者. 2.格式 mount -a [-fv] [-t vfstype] [-n] [-r ...

  9. Java的GUI设计

    这里笔者写一些自己做GUI时候的心得,希望可以帮助需要学习的同学,函数的实现和界面设计不在同一个文件中,且涉及参数的传递 一.继承于JFrame   当遇到继承于JFrame的类的时候,可以省去建立对 ...

  10. 2018.12.17 bzoj4802: 欧拉函数(Pollard-rho)

    传送门 Pollard−rhoPollard-rhoPollard−rho模板题. 题意简述:求ϕ(n),n≤1e18\phi(n),n\le 1e18ϕ(n),n≤1e18 先把nnn用Pollar ...