1、PCF8591模数与数模转换实验源程序:#include #include #define uint unsigned int#define uchar unsigned char#define Delay4us() _nop_();_nop_();_nop_();_nop_();sbit LCD_RS = P20;sbit LCD_RW = P21;sbit LCD_EN = P22;sbit SCL = P10;sbit SDA = P11;uchar Recv_Buffer4;uint Voltage=0,0,0,0;bit bdata IIC_ERROR;uchar LCD_Line_
2、1 = 1- . V 2- . V;uchar LCD_Line_2 = 3- . V 4- . V;void Delay(uint ms) uchar i; while(ms-) for(i=0;i120;i+)Delay4us(); bit LCD_Busy_Check() bit Result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; Delay4us(); Result = (bit)(P0&0x80); LCD_EN = 0; return Result;void LCD_Write_Command(uchar cmd) while(LCD_Busy_
3、Check(); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; Delay4us(); LCD_EN = 1; Delay4us(); LCD_EN = 0;void LCD_Write_Data(uchar dat) while(LCD_Busy_Check(); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; Delay4us(); LCD_EN = 1; Delay4us(); LCD_EN = 0; void LCD_Initialise() LCD_Write
4、_Command(0x38);Delay(5); LCD_Write_Command(0x0c);Delay(5); LCD_Write_Command(0x06);Delay(5); LCD_Write_Command(0x01);Delay(5); void LCD_Set_Position(uchar pos) LCD_Write_Command(pos | 0x80); void LCD_Display_A_Line(uchar Line_Addr,uchar s) uchar i; LCD_Set_Position(Line_Addr); for(i=0;i16;i+) LCD_Wr
5、ite_Data(si); / 将模数转换后得到的值分解存入缓存void Convert_To_Voltage(uchar val) uchar Tmp; /最大值为255,对应5V,255/5=51 Voltage2 = val/51+0; /整数部分 Tmp = val%51*10; /第一位小数 Voltage1 = Tmp/51+0; Tmp = Tmp%51*10; Voltage0 = Tmp/51+0;void IIC_Start() SDA = 1; SCL = 1; Delay4us(); SDA = 0; Delay4us(); SCL = 0;void IIC_Stop(
6、) SDA = 0; SCL = 1; Delay4us(); SDA = 1; Delay4us(); SCL = 0;void Slave_ACK() SDA = 0; SCL = 1; Delay4us(); SCL = 0; SDA = 1;void Slave_NOACK() SDA = 1; SCL = 1; Delay4us(); SCL = 0; SDA = 0;void IIC_SendByte(uchar wd) uchar i; for(i=0;i8;i+) SDA=(bit)(wd&0x80); _nop_(); _nop_(); SCL = 1; Delay4us()
7、; SCL=0; wd=1; Delay4us(); SDA = 1; SCL = 1; Delay4us(); IIC_ERROR = SDA; /IIC_ERROR=1表示无应答 SCL = 0; Delay4us();uchar IIC_ReceiveByte() uchar i,rd = 0x00; for(i=0;i8;i+) SCL = 1; rd = 1; rd |= SDA; Delay4us(); SCL = 0; Delay4us(); SCL = 0; Delay4us(); return rd;/连续读入4路通道的A/D转换结果并保存到Recv_Buffervoid A
8、DC_PCF8591(uchar CtrlByte) uchar i; IIC_Start();/PCF8591地址定义1001*,高四位固定1001/第3,2,1位对应A2,A1,A0第0位为读写标志位,1为读0为写/下面代码中0x90,0x91分别为10010000,10010001 IIC_SendByte(0x90); if(IIC_ERROR = 1) return; IIC_SendByte(CtrlByte); if(IIC_ERROR = 1) return; IIC_Start(); IIC_SendByte(0x91); if(IIC_ERROR = 1) return;
9、IIC_ReceiveByte(); Slave_ACK(); for(i=0;i4;i+) Recv_Bufferi = IIC_ReceiveByte(); Slave_ACK(); Slave_NOACK(); IIC_Stop();void DAC_PCF8591(uchar CtrlByte,uchar dat) IIC_Start(); Delay4us(); IIC_SendByte(0x90);/发送地址字节 if(IIC_ERROR = 1) return; IIC_SendByte(CtrlByte);/发送控制字节 if(IIC_ERROR = 1) return; II
10、C_SendByte(dat);/发送待转换为模拟量的数值 if(IIC_ERROR = 1) return; IIC_Stop(); Delay4us(); Delay4us();/*PCF8591控制字节定义:0*0*,第3,7位固定为0第6位取0时为模拟输入,取1时为模拟输出第4,5位为00表示4路单端的模拟输入第二位为自动递增标志,取1时自动递增第0,1位取值为00,01,10,11分别表示通道0,1,2,3调用ADC_PCF8591时参数为00000100,即0x04调用DAC_PCF8591时参数为01000000,即0x40*/void main() LCD_Initialise
11、(); while(1) ADC_PCF8591(0x04); Convert_To_Voltage(Recv_Buffer0); LCD_Line_12=Voltage2; LCD_Line_14=Voltage1; LCD_Line_15=Voltage0; Convert_To_Voltage(Recv_Buffer1); LCD_Line_110=Voltage2; LCD_Line_112=Voltage1; LCD_Line_113=Voltage0; Convert_To_Voltage(Recv_Buffer2); LCD_Line_22=Voltage2; LCD_Line_24=Voltage1; LCD_Line_25=Voltage0; Convert_To_Voltage(Recv_Buffer3); LCD_Line_210=Voltage2; LCD_Line_212=Voltage1; LCD_Line_213=Voltage0; LCD_Display_A_Line(0x00, LCD_Line_1); LCD_Display_A_Line(0x40, LCD_Line_2); DAC_PCF8591(0x40,Recv_Buffer0);
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2