PCF8581P存储器
- 格式:doc
- 大小:23.00 KB
- 文档页数:1


PCF8591程序/************************************头文件:PCF8591.h**文件名: PCF8591.c**创建人: 动车组**日期: 2012-8-8**功能描述:PCF8591_Write(uchar DAC_Date);DAC转换输出(8位的)** PCF8591_Read(uchar a[4]);四个单端输入ADC数据(8位的)**占用资源:IIC的两个IO口IIc_Scl、IIc_Sad***********************************/#include"PCF8591.h"#include <intrins.h>#define _NOP_() _nop_();_nop_();_nop_();_nop_();_nop_()/*短暂延时4.7us*//*停止I2C总线*/void IIc_stop(){IIc_Sad = 0;_NOP_();IIc_Scl = 1;_NOP_();IIc_Sad = 1; //总线置于空闲状态}/*IIC初始化子程序*/void IIc_init(){IIc_stop(); //结束之前IIC的操作IIc_Scl = 1; //总线置于空闲状态IIc_Sad = 1;}/* 启动I2C总线*/void IIc_start(){IIc_Sad = 1;IIc_Scl = 1;_NOP_();IIc_Sad = 0;_NOP_();IIc_Scl = 0;}/*IIC写一个字节返回应答信号返回1设备正常*/bit IIc_write_byte(uchar date){uchar i;bit ack;for(i=8;i>0;i--){date <<= 1;IIc_Scl = 0;IIc_Sad = CY;_NOP_();IIc_Scl = 1;_NOP_();}IIc_Scl = 0;_NOP_();IIc_Sad = 1;/*8位发送完后释放数据线,准备接收应答位*/_NOP_();IIc_Scl = 1;if(IIc_Sad==0)//从机设备应答ack=1ack = 1;elseack = 0;IIc_Scl = 0;_NOP_();return(ack);}/*IIC读一个字节主机应答信号Master_ack为1是应答0时非应答*/ uchar IIc_read_byte(bit Master_ack){uchar i,vaule;IIc_Sad=1;for(i = 8;i > 0;i--){vaule <<= 1;IIc_Scl = 1;_NOP_();if(IIc_Sad)vaule++;IIc_Scl = 0;_NOP_();}IIc_Sad = !Master_ack;//主机应答信号_NOP_();IIc_Scl = 1;_NOP_();IIc_Scl = 0;_NOP_();return vaule;}/******************以下是PCF8591的应用函数*********************************************************//*PCF8591的控制字Con和DAC数据这个函数已经写好器件地址了/*函数返回值1写入为正常*/bit PCF8591_Write(uchar DAC_Date){bit ack;// EA=0;IIc_init();IIc_start();ack=IIc_write_byte(Address_PCF8591);//写器件地址if(ack==0) //写入失败从机设备没有相应return(0);ack=IIc_write_byte(Model_PCF8591);//写第二个字节控制字if(ack==0) //写入失败从机设备没有相应return(0);ack=IIc_write_byte(DAC_Date);//写第三个字节DAC数据if(ack==0) //写入失败从机设备没有相应return(0);IIc_stop();/*后面是读一个字节数据用来开始ADC转换的*/IIc_start();ack=IIc_write_byte(Address_PCF8591+1);//写器件地址读数据if(ack==0) //写入失败从机设备没有相应return(0);IIc_read_byte(0); //读一个数据开始ADC转换这个数据没用哦IIc_stop();return(1);// EA=1;}/*从PCF8591中读出四个ADC通道的数据返回1从机设备正常*/bit PCF8591_Read(uchar a[]){bit ack;IIc_init();IIc_start();ack= IIc_write_byte(Address_PCF8591+1);if(ack==0) //写入失败从机设备没有相应return(0);a[0] = IIc_read_byte(1);a[1] = IIc_read_byte(1);a[2] = IIc_read_byte(1);a[3] = IIc_read_byte(0);IIc_stop();return (1);}/************************************//************************************文件名: PCF8591.h**创建人: 动车组**日期: 2012-8-8**功能描述:PCF8591_Write(uchar DAC_Date);DAC转换输出(8位的)** PCF8591_Read(uchar a[4]);四个单端输入ADC数据(8位的)**占用资源:IIC的两个IO口IIc_Scl、IIc_Sad***********************************/#ifndef __PCF8591_H__#define __PCF8591_H__#include <REG52.H>#define uchar unsigned char#define uint unsigned intsbit IIc_Scl=P1^5; //IIC的时钟sbit IIc_Sad=P3^6; //IIC的数据线#define Address_PCF8591 0x90 //PCF8591的硬件地址#define Model_PCF8591 0x44 //模式是四个ADC单端输入允许DAC输出允许自动增量/*PCF8591的DAC数据;函数返回值1写入为正常*/bit PCF8591_Write(uchar DAC_Date);/*从PCF8591中读出四通道的数据返回1从机设备正常*/bit PCF8591_Read(uchar a[4]);//a[]的长度必须大于等于4#endif/******************************/#include <REG52.H>#include"PCF8591.h"#include"LCD1602.h"void main(){uchar i;uchar temp[4];L1602_init();PCF8591_Write(127);PCF8591_Write(200);while(1){PCF8591_Write(i++);if(1){PCF8591_Read(temp);L1602_Uint(1,2,temp[0]);L1602_Uint(1,7,temp[1]);L1602_Uint(2,1,temp[2]);L1602_Uint(2,7,temp[3]);}elseL1602_Uint(2,2,1);}}。
单⽚机原理及接⼝技术课后习题答案第⼆章1.89C51单⽚机内包含哪些主要逻辑功能部件?答:80C51系列单⽚机在⽚内集成了以下主要逻辑功能部件:(l)CPU(中央处理器):8位 (2)⽚内RAM:128B (3)特殊功能寄存器:21个 (4)程序存储器:4KB(5)并⾏I/O⼝:8位,4个 (6)串⾏接⼝:全双⼯,1个 (7)定时器/计数器:16位,2个(8)⽚内时钟电路:1个2.89C51的EA端有何⽤途?答:/EA端接⾼电平时,CPU只访问⽚内/doc/c312e1f309a1284ac850ad02de80d4d8d15a01a8.html 并执⾏内部程序,存储器。
/EA端接低电平时,CPU只访问外部ROM,并执⾏⽚外程序存储器中的指令。
/EA端保持⾼电平时,CPU执⾏内部存储器中的指令。
3. 89C51的存储器分哪⼏个空间?如何区别不同空间的寻址?答:ROM(⽚内ROM和⽚外ROM统⼀编址)(使⽤MOVC)(数据传送指令)(16bits地址)(64KB)⽚外RAM(MOVX)(16bits地址)(64KB)⽚内RAM(MOV)(8bits地址)(256B)4. 简述89C51⽚内RAM的空间分配。
答:⽚内RAM有256B ,低128B是真正的RAM区,⾼128B是SFR(特殊功能寄存器)区5. 简述布尔处理存储器的空间分配,⽚内RAM中包含哪些可位寻址单元。
答:⽚内RAM区从00H~FFH(256B),其中20H~2FH(字节地址)是位寻址区,对应的位地址是00H~7FH7. 89C51如何确定和改变当前⼯作寄存器组?答:PSW(程序状态字)(Program Status Word)中的RS1和RS0可以给出4种组合,⽤来从4组⼯作寄存器组中进⾏选择,PSW属于SFR(Special Function Register)(特殊功能寄存器)9. 读端⼝锁存器和“读引脚”有何不同?各使⽤哪种指令?答:读锁存器(ANL P0,A)就是相当于从存储器中拿数据,⽽读引脚是从外部拿数据(如MOV A,P1 这条指令就是读引脚的,意思就是把端⼝p1输⼊数据送给A)传送类MOV,判位转移JB、JNB、这些都属于读引脚,平时实验时经常⽤这些指令于外部通信,判断外部键盘等;字节交换XCH、XCHD算术及逻辑运算 ORL、CPL、ANL、ADD、ADDC、SUBB、INC、DEC控制转移CJNE、DJNZ都属于读锁存器。