网站建设具体工作,数据网站建设工具模板,电子商务网站建设实训 报告,全国加盟网站大全在上述at24c02de 基础上#xff0c;添加三个函数 一个是读取通道1光敏电阻的数据#xff1b; 一个是读取通道3的电压#xff1b; 一个是输出DA的数据。。 
5V的AD DA。 如果读入的电压是5V#xff0c;输入AD#xff0c;就是255#xff1b; 如果是0V#xff0c;就是00000… 在上述at24c02de 基础上添加三个函数 一个是读取通道1光敏电阻的数据 一个是读取通道3的电压 一个是输出DA的数据。。 
5V的AD DA。 如果读入的电压是5V输入AD就是255 如果是0V就是00000000 如果是2.5V就是125. 有个比例。 
步骤注意是 pcf8591A/D转换时可以将连接在芯片上的AIN0,AIN1,AIN3,AIN2通道等的模拟量转换为数字量。 
而且PCF8591芯片是一个8位的通道上的电压取值范围是0-5v相当于0-255一共256个刻度把5v平均分成了255份那么1v电压对应的数字量就是51。所以我们在进行ad转换的时候不能简单的把读取到的量显示在数码管显示上比如现在某个通道是3.1v的那么它通过pcf8591芯片读取转换之后我们实际上读取到的是3.1*51158.1但是如果题目要求显示电压值的话我们就需要再把读取出来的数字量给处理一下比如除以一个51.0。 
从机等待应答部分的代码即留下空格的部分可省略。 
PCF8591芯片D/A转换时即把数字量转换为模拟量在这里插入代码片 
unsigned char read_in1()
{unsigned char dat;IIC_Start();		 //总线起始信号IIC_SendByte(0x90); //字节写地址IIC_WaitAck();		 //等待应答IIC_SendByte(0x01); //发送控制字IIC_WaitAck();IIC_Start(); IIC_SendByte(0x91); //字节读地址IIC_WaitAck();datIIC_RecByte();IIC_SendAck(1); IIC_Stop(); return   dat;                  //处理读到的AIN的量
}
unsigned char read_in3()
{unsigned char dat;IIC_Start();		 //总线起始信号IIC_SendByte(0x90); //字节写地址IIC_WaitAck();		 //等待应答IIC_SendByte(0x03); //发送控制字IIC_WaitAck();IIC_Start(); IIC_SendByte(0x91); //字节读地址IIC_WaitAck();datIIC_RecByte();IIC_SendAck(1); IIC_Stop(); return   dat;                  //处理读到的AIN的量
}void write_dac(unsigned int dat)
{IIC_Start();IIC_SendByte(0x90);  //pcf8591写操作地址IIC_SendByte(0x40);  //选择dac输出通道第6位为1打开D/AIIC_SendByte(dat);	  //选择要给pcf8591芯片的数字量IIC_WaitAck();	    IIC_Stop();   	      //停止通讯
} 
全部代码啊 
主函数的代码 
#include stc15.h
#include intrins.h
#include iic.h//接口
sbit S7P3^0;
sbit S6P3^1;
sbit S5P3^2;
sbit S4P3^3;
//宏定义
#define     LED       4   //定义主时钟
#define     ULN       5   //定义主时钟
#define     COM       6   //定义主时钟
#define     ABC       7   //定义主时钟
typedef     unsigned char   u8;
typedef     unsigned int    u16;
typedef     unsigned long   u32;
//-----------------------------------------------#define FOSC 11059200L#define T1MS (65536-FOSC/1000)      //1T模式
//#define T1MS (65536-FOSC/12/1000) //12T模式//全局变量
u8 LEDbuf0xFF;
u8 ULNbuf0x00;
u8 SMGbuf[20];
u8 SMGdat[8];//8个数码管所以8个元素u32 tim1ms0;//u32类型几十天才溢出
/*************  本地常量声明   ,这是共阴的 **************/
u8 code table[]{                       //标准字库
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1u8 code T_COM[]{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};      //位码
//函数声明
void delayms(u16 tms);
void Delay1ms();		//11.0592MHz
void sel(u8 x); //选择四个分支哪一个
void sysinit();//系统初始化关闭所有的外部设备
void disp();
//主函数
void main()
{//main局部变量u8 num125;u8 num20;int num31289;int num40;int num4H,num4L;//低位和高位u8 in1dat;u8 in3dat;//外设初始化sysinit();//系统定时器初始化AUXR | 0x40;                   //定时器1为1T模式TMOD  0x00;                    //设置定时器为模式0(16位自动重装载)TL1  T1MS;                     //初始化计时值TH1  T1MS  8;TR1  1;                        //定时器1开始计时ET1  1;                        //使能定时器0中断EA  1;//大循环//这里可以加一点测试代码测试是不是每个外设都成功SMGdat[0]0x77;SMGdat[1] table[num1/10];SMGdat[2] table[num1%10];SMGdat[3]0x40;SMGdat[4]0x40;SMGdat[5] 0x7C;		SMGdat[6] table[0];SMGdat[7] table[0];while(1){if(S70){delayms(10);if(S70){write24byte(0x00,num1);delayms(5);  //等待5ms,等待写入完成}while(S70);}else  if(S60){delayms(10);if(S60){num2read24byte(0x00)20;delayms(5);}while(S60);SMGdat[0]0x77;SMGdat[1] table[num1/10];SMGdat[2] table[num1%10];SMGdat[3]0x40;SMGdat[4]0x40;SMGdat[5] 0x7C;		SMGdat[6] table[num2/10];SMGdat[7] table[num2%10];}if(S50){delayms(10);if(S50){write24byte(0x03,num38); //写高8位到0x03delayms(5);  //等待5ms,等待写入完成write24byte(0x04,num3);//写低八位到0x04delayms(5);  //等待5ms,等待写入完成}while(S50);//松开按键}else	if(S40){delayms(10);if(S40){//读取int类型数据读取高位乘以256再读取低位	num4Hread24byte(0x03);delayms(5);num4Lread24byte(0x04);delayms(5);num4num4H*256num4L;//将低位和高位合并起来}while(S40);//松开按键//分解出个位十位百位千位的方法SMGdat[0] table[num3/1000%10];SMGdat[1] table[num3/100%10];SMGdat[2] table[num3/10%10];SMGdat[3]table[num3%10];SMGdat[4]table[num4/1000%10];;SMGdat[5]table[num4/100%10];;SMGdat[6] table[num4/10%10];;SMGdat[7] table[num4%10];}	if(tim1ms%5000)  //500ms读取一次数据刷新数据{in1datread_in1();in3datread_in3();}SMGdat[0] 0x00;SMGdat[1] table[in1dat/100%10];SMGdat[2] table[in1dat/10%10];SMGdat[3]table[in1dat%10];SMGdat[4]0x00;SMGdat[5]table[in3dat/100%10];SMGdat[6] table[in3dat/10%10];SMGdat[7] table[in3dat%10];}}//函数定义
//-----------------------------------------------/* Timer1 interrupt routine */
void tm1_isr() interrupt 3 using 1
{tim1ms;disp();//1ms显示一次数码管
}
void Delay1ms()		//11.0592MHz
{unsigned char i, j;_nop_();_nop_();_nop_();i  11;j  190;do{while (--j);} while (--i);
}void delayms(u16 tms)
{u16 i0;for(i0;itms;i){Delay1ms();}
}void sel(u8 x)  //选择四个分支哪一个
{//背下来了吗switch(x){case 0:P2P20x1F;break;case LED:P2P20x1F|0x80;break;case ULN:P2P20x1F|0xA0;break;case COM:P2P20x1F|0xC0;break;case ABC:P2P20x1F|0xE0;break;}
}
void sysinit()//系统初始化关闭所有的外部设备
{sel(LED);LEDbuf0xFF;P0LEDbuf;sel(0);sel(ULN);ULNbuf0x00;P0ULNbuf;sel(0);sel(COM);P00x00;sel(0);sel(ABC);P00xFF;sel(0);
}void disp()
{//背下来static u8 i0;//消隐sel(COM);P00x00;sel(0);sel(ABC);P00xFF;sel(0);
//显示sel(COM);P0T_COM[i];sel(0);sel(ABC);P0~SMGdat[i];sel(0);i;if(i8)i0;
} 
iic.c 
/*程序说明: IIC总线驱动程序软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台 805112MHz日    期: 2011-8-9
*/#include stc15.h
#include intrins.h
#include iic.h#define DELAY_TIME 5#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1//总线引脚定义
sbit SDA  P2^1;  /* 数据线 */
sbit SCL  P2^0;  /* 时钟线 */void IIC_Delay(unsigned char i)
{do{_nop_();}while(i--);        
}
//总线启动条件
void IIC_Start(void)
{SDA  1;SCL  1;IIC_Delay(DELAY_TIME);SDA  0;IIC_Delay(DELAY_TIME);SCL  0;	
}//总线停止条件
void IIC_Stop(void)
{SDA  0;SCL  1;IIC_Delay(DELAY_TIME);SDA  1;IIC_Delay(DELAY_TIME);
}//发送应答
void IIC_SendAck(bit ackbit)
{SCL  0;SDA  ackbit;  					// 0应答1非应答IIC_Delay(DELAY_TIME);SCL  1;IIC_Delay(DELAY_TIME);SCL  0; SDA  1;IIC_Delay(DELAY_TIME);
}//等待应答
bit IIC_WaitAck(void)
{bit ackbit;SCL   1;IIC_Delay(DELAY_TIME);ackbit  SDA;SCL  0;IIC_Delay(DELAY_TIME);return ackbit;
}//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{unsigned char i;for(i0; i8; i){SCL   0;IIC_Delay(DELAY_TIME);if(byt  0x80) SDA   1;else SDA   0;IIC_Delay(DELAY_TIME);SCL  1;byt  1;IIC_Delay(DELAY_TIME);}SCL   0;  
}//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{unsigned char i, da;for(i0; i8; i){   SCL  1;IIC_Delay(DELAY_TIME);da  1;if(SDA) da | 1;SCL  0;IIC_Delay(DELAY_TIME);}return da;    
}unsigned char read24byte(unsigned char addrtemp)
{unsigned char temp;IIC_Start();IIC_SendByte(SlaveAddrW); //是地址IIC_WaitAck();IIC_SendByte(addrtemp);IIC_WaitAck();IIC_Start();IIC_SendByte(SlaveAddrR); //读地址IIC_WaitAck();temp  IIC_RecByte();IIC_SendAck(1);          //send no ACKIIC_Stop();return temp;
}
void write24byte(unsigned char addrtemp,unsigned char datatemp)
{IIC_Start();IIC_SendByte(SlaveAddrW);IIC_WaitAck();IIC_SendByte(addrtemp);IIC_WaitAck();IIC_SendByte(datatemp);    IIC_WaitAck();IIC_Stop();
}unsigned char read_in1()
{unsigned char dat;IIC_Start();		 //总线起始信号IIC_SendByte(0x90); //字节写地址IIC_WaitAck();		 //等待应答IIC_SendByte(0x01); //发送控制字IIC_WaitAck();IIC_Start(); IIC_SendByte(0x91); //字节读地址IIC_WaitAck();datIIC_RecByte();IIC_SendAck(1); IIC_Stop(); return   dat;                  //处理读到的AIN的量
}
unsigned char read_in3()
{unsigned char dat;IIC_Start();		 //总线起始信号IIC_SendByte(0x90); //字节写地址IIC_WaitAck();		 //等待应答IIC_SendByte(0x03); //发送控制字IIC_WaitAck();IIC_Start(); IIC_SendByte(0x91); //字节读地址IIC_WaitAck();datIIC_RecByte();IIC_SendAck(1); IIC_Stop(); return   dat;                  //处理读到的AIN的量
}void write_dac(unsigned int dat)
{IIC_Start();IIC_SendByte(0x90);  //pcf8591写操作地址IIC_SendByte(0x40);  //选择dac输出通道第6位为1打开D/AIIC_SendByte(dat);	  //选择要给pcf8591芯片的数字量IIC_WaitAck();	    IIC_Stop();   	      //停止通讯
} 
iic.h 
#define __IIC_Hvoid IIC_Start(void); 
void IIC_Stop(void);  
bit IIC_WaitAck(void);  
void IIC_SendAck(bit ackbit); 
void IIC_SendByte(unsigned char byt); 
unsigned char IIC_RecByte(void); unsigned char read24byte(unsigned char addrtemp);
void write24byte(unsigned char addrtemp,unsigned char datatemp);unsigned char read_in1();
unsigned char read_in3();
void write_dac(unsigned int dat);#endif 文章转载自: http://www.morning.zbtfz.cn.gov.cn.zbtfz.cn http://www.morning.tmjhy.cn.gov.cn.tmjhy.cn http://www.morning.ykqbs.cn.gov.cn.ykqbs.cn http://www.morning.fkmrj.cn.gov.cn.fkmrj.cn http://www.morning.qxmpp.cn.gov.cn.qxmpp.cn http://www.morning.pgzgy.cn.gov.cn.pgzgy.cn http://www.morning.sgbsr.cn.gov.cn.sgbsr.cn http://www.morning.gtnyq.cn.gov.cn.gtnyq.cn http://www.morning.xrwtk.cn.gov.cn.xrwtk.cn http://www.morning.hhxwr.cn.gov.cn.hhxwr.cn http://www.morning.yrdn.cn.gov.cn.yrdn.cn http://www.morning.xrtsx.cn.gov.cn.xrtsx.cn http://www.morning.mjats.com.gov.cn.mjats.com http://www.morning.scjtr.cn.gov.cn.scjtr.cn http://www.morning.rbgwj.cn.gov.cn.rbgwj.cn http://www.morning.rqwmt.cn.gov.cn.rqwmt.cn http://www.morning.rdng.cn.gov.cn.rdng.cn http://www.morning.rpkl.cn.gov.cn.rpkl.cn http://www.morning.hlmkx.cn.gov.cn.hlmkx.cn http://www.morning.rgxll.cn.gov.cn.rgxll.cn http://www.morning.czcbl.cn.gov.cn.czcbl.cn http://www.morning.xnwjt.cn.gov.cn.xnwjt.cn http://www.morning.jcfg.cn.gov.cn.jcfg.cn http://www.morning.rlhh.cn.gov.cn.rlhh.cn http://www.morning.pdxqk.cn.gov.cn.pdxqk.cn http://www.morning.fgkwh.cn.gov.cn.fgkwh.cn http://www.morning.jbctp.cn.gov.cn.jbctp.cn http://www.morning.pybqq.cn.gov.cn.pybqq.cn http://www.morning.gqhgl.cn.gov.cn.gqhgl.cn http://www.morning.fnfxp.cn.gov.cn.fnfxp.cn http://www.morning.yxzfl.cn.gov.cn.yxzfl.cn http://www.morning.xmjzn.cn.gov.cn.xmjzn.cn http://www.morning.zlnf.cn.gov.cn.zlnf.cn http://www.morning.pymff.cn.gov.cn.pymff.cn http://www.morning.lgtcg.cn.gov.cn.lgtcg.cn http://www.morning.wkjzt.cn.gov.cn.wkjzt.cn http://www.morning.glpxx.cn.gov.cn.glpxx.cn http://www.morning.bgbnc.cn.gov.cn.bgbnc.cn http://www.morning.kqrql.cn.gov.cn.kqrql.cn http://www.morning.qnypp.cn.gov.cn.qnypp.cn http://www.morning.nzlsm.cn.gov.cn.nzlsm.cn http://www.morning.flqbg.cn.gov.cn.flqbg.cn http://www.morning.qgjwx.cn.gov.cn.qgjwx.cn http://www.morning.24vy.com.gov.cn.24vy.com http://www.morning.cpctr.cn.gov.cn.cpctr.cn http://www.morning.nftzn.cn.gov.cn.nftzn.cn http://www.morning.pkmcr.cn.gov.cn.pkmcr.cn http://www.morning.hengqilan.cn.gov.cn.hengqilan.cn http://www.morning.tnkwj.cn.gov.cn.tnkwj.cn http://www.morning.lhgqc.cn.gov.cn.lhgqc.cn http://www.morning.trnl.cn.gov.cn.trnl.cn http://www.morning.tsqpd.cn.gov.cn.tsqpd.cn http://www.morning.fdrwk.cn.gov.cn.fdrwk.cn http://www.morning.kqpxb.cn.gov.cn.kqpxb.cn http://www.morning.yptwn.cn.gov.cn.yptwn.cn http://www.morning.fprll.cn.gov.cn.fprll.cn http://www.morning.rfxg.cn.gov.cn.rfxg.cn http://www.morning.zjcmr.cn.gov.cn.zjcmr.cn http://www.morning.dtzxf.cn.gov.cn.dtzxf.cn http://www.morning.rjmb.cn.gov.cn.rjmb.cn http://www.morning.qwmdx.cn.gov.cn.qwmdx.cn http://www.morning.xgzwj.cn.gov.cn.xgzwj.cn http://www.morning.wyctq.cn.gov.cn.wyctq.cn http://www.morning.pcshb.cn.gov.cn.pcshb.cn http://www.morning.lfcfn.cn.gov.cn.lfcfn.cn http://www.morning.grqlc.cn.gov.cn.grqlc.cn http://www.morning.lsmnn.cn.gov.cn.lsmnn.cn http://www.morning.wrlff.cn.gov.cn.wrlff.cn http://www.morning.kjrp.cn.gov.cn.kjrp.cn http://www.morning.slwfy.cn.gov.cn.slwfy.cn http://www.morning.tfzjl.cn.gov.cn.tfzjl.cn http://www.morning.rdng.cn.gov.cn.rdng.cn http://www.morning.ssqrd.cn.gov.cn.ssqrd.cn http://www.morning.mrckk.cn.gov.cn.mrckk.cn http://www.morning.kpnpd.cn.gov.cn.kpnpd.cn http://www.morning.mdnnz.cn.gov.cn.mdnnz.cn http://www.morning.tnqk.cn.gov.cn.tnqk.cn http://www.morning.rkck.cn.gov.cn.rkck.cn http://www.morning.qrqdr.cn.gov.cn.qrqdr.cn http://www.morning.skrrq.cn.gov.cn.skrrq.cn