首页资源分类嵌入式处理器51内核 > 51单片机控制PCF8511输出0-5V电压 数码管显示电压值

51单片机控制PCF8511输出0-5V电压 数码管显示电压值

已有 445117个资源

下载专区

文档信息举报收藏

标    签:51单片机PCF8591DA输出

分    享:

文档简介

51单片机控制PCF8951的DA模块输出0-5V电压,可由独立键盘控制输出大小,数码管显示当前电压值

文档预览

#include //包含头文件 #include #define uchar unsigned char //宏定义 #define uint unsigned int #define PCF8591 0x90 //PCF8591 地址 sbit k1=P2^3; //按键 sbit k2=P2^4; sbit k3=P2^5; sbit wei_1=P2^0; sbit wei_2=P2^1; sbit wei_3=P2^2; uint temp; // uint getdata; uchar dianya=128; uchar display_data[4]; sfr PORTD = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口 uchar code ledcode[]={0x50,0x5F,0x32,0x16,0x1D,0x94,0x90,0x5E, 0x10,0x14,0x18,0x91,0xF0,0x13,0xB0,0xB8}; //数码管0-F 编码 #define NOP() _nop_() /* 定义空指令 */ #define _Nop() {_nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_();} /*定义空指令*/ sbit SCL=P3^4; //I2C 时钟 sbit SDA=P3^5; //I2C 数据 bit ack; /*应答标志位*/ /******************************************************************* 起动总线函数 函数原型: void Start_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. ********************************************************************/ void Start_I2c() { SDA=1; /*发送起始条件的数据信号*/ _Nop(); SCL=1; _Nop(); /*起始条件建立时间大于4.7us,延时*/ _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; /*发送起始信号*/ _Nop(); /* 起始条件锁定时间大于4μs*/ _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; /*钳住I2C总线,准备发送或接收数据 */ _Nop(); _Nop(); _Nop(); _Nop(); } /******************************************************************* 结束总线函数 函数原型: void Stop_I2c(); 功能: 结束I2C总线,即发送I2C结束条件. ********************************************************************/ void Stop_I2c() { SDA=0; /*发送结束条件的数据信号*/ _Nop(); /*发送结束条件的时钟信号*/ _Nop(); _Nop(); SCL=1; /*结束条件建立时间大于4μs*/ _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; /*发送I2C总线结束信号*/ _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); } /******************************************************************* 字节数据发送函数 函数原型: void SendByte(UCHAR c); 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0) 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。 ********************************************************************/ void SendByte(unsigned char c) { unsigned char BitCnt; for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/ { if((c<0;a--) for(b=110;b>0;b--); } void timetoseg() { getdata=dianya*0.5; display_data[0] = ledcode[getdata/100%10]&0xef; display_data[1] = ledcode[getdata/10%10]; display_data[2] = ledcode[getdata%10]; PORTD=display_data[0]; wei_1=0; delay(5); wei_1=1; PORTD=display_data[1]; wei_2=0; delay(5); wei_2=1; PORTD=display_data[2]; wei_3=0; delay(5); wei_3=1; } /******************************************************************* ADC发送字节[命令]数据函数 *******************************************************************/ bit ISendByte(unsigned char sla,unsigned char c) { Start_I2c(); //启动总线 SendByte(sla); //发送器件地址 if(ack==0)return(0); SendByte(c); //发送数据 if(ack==0)return(0); Stop_I2c(); //结束总线 return(1); } /******************************************************************* ADC读字节数据函数 *******************************************************************/ unsigned char IRcvByte(unsigned char sla) { unsigned char c; Start_I2c(); //启动总线 SendByte(sla+1); //发送器件地址 if(ack==0)return(0); c=RcvByte(); //读取数据0 Ack_I2c(1); //发送非就答位 Stop_I2c(); //结束总线 return(c); } /******************************************************************* DAC 变换, 转化函数 *******************************************************************/ bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val) { Start_I2c(); //启动总线 SendByte(sla); //发送器件地址 //if(ack==0)return(0); SendByte(c); //发送控制字节 //if(ack==0)return(0); SendByte(Val); //发送DAC的数值 //if(ack==0)return(0); Stop_I2c(); //结束总线 return(1); } void key() { if(k1==0) { delay(10); if(k1==0) { dianya+=2; DACconversion(PCF8591,0x40, (dianya)); //DAC 数模转换 while(k1==0); } } if(k2==0) { delay(10); if(k2==0) { dianya-=2; DACconversion(PCF8591,0x40, (dianya)); //DAC 数模转换 while(k2==0); } } } void main() { DACconversion(PCF8591,0x40, (128)); //DAC 数模转换 while(1) { key(); timetoseg(); } }

Top_arrow
回到顶部
EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。