|
PCF8591模數(shù)轉(zhuǎn)換及1602LCD顯示應(yīng)用程序
單片機(jī)源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define Delay4us(){_nop_();_nop_();_nop_();_nop_();}
- sbit LCD_RS=P2^2;
- sbit LCD_RW=P2^1;
- sbit LCD_EN=P2^0;
- sbit SCL=P1^0; //I2C時(shí)鐘引腳
- sbit SDA=P1^1; //I2C數(shù)據(jù)輸入輸出引腳
- uchar Recv_Buffer[4]; //數(shù)據(jù)接收緩沖
- uint Voltage[]={'0','0','0','0','0','0'}; //數(shù)據(jù)分解為電壓x.xx
- bit bdata IIC_ERROR; //I2C錯(cuò)誤標(biāo)志位
- uchar LCD_Line_1[]={"DQ . ppm "};
- //延時(shí)
- void delay(int ms)
- {
- uchar i;
- while(ms--) for(i=0;i<250;i++) Delay4us();
- }
- //LCD忙檢測(cè)
- 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_Check());
- LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();
- P0=cmd;Delay4us();
- LCD_EN=1;Delay4us();LCD_EN=0;
- }
- // 寫數(shù)據(jù)
- 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_Command(0x38);delay(5);
- LCD_Write_Command(0x0c);delay(5);
- LCD_Write_Command(0x06);delay(5);
- LCD_Write_Command(0x01);delay(5);
- LCD_Write_Command(0x03);delay(5);
- LCD_Write_Command(0x02);delay(5);
- }
- //設(shè)置顯示位置
- 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;i<16;i++)LCD_Write_Data(s[i]);
- }
- // 將模數(shù)轉(zhuǎn)換后得到的值分解存入緩存
- void Convert_To_Voltage(uchar val)
- {
- uchar Tmp; //最大值為255,對(duì)應(yīng)5V
- Voltage[2]=val/100+'0'; //整數(shù)部分
- Voltage[3]=val/10%10+'0' ;
- Voltage[4]=val%10+'0' ;
- Tmp=val*10; // 第一位小數(shù)
- Voltage[1]=Tmp%10+'0';
- Tmp=Tmp*10;
- Voltage[0]=Tmp%10+'0';
- }
- //啟動(dòng)I2C總線
- void IIC_Start()
- {
- SDA=1;SCL=1;Delay4us();SDA=0;Delay4us();SCL=0;
- }
- //停止I2C總線
- void IIC_Stop()
- {
- SDA=0;SCL=1;Delay4us();SDA=1; Delay4us();SCL=0;
- }
- // 從機(jī)發(fā)送應(yīng)答位
- void Slave_ACK()
- {
- SDA=0;SCL=1;Delay4us();SCL=0;SDA=1;
- }
- // 從機(jī)發(fā)送非應(yīng)答位
- void Slave_NOACK()
- {
- SDA=1;SCL=1;Delay4us();SCL=0;SDA=0;
- }
- //發(fā)送一字節(jié)
- void IIC_SendByte(uchar wd)
- {
- uchar i;
- for(i=0;i<8;i++) //循環(huán)移入8位
- {
- SDA=(bit)(wd&0x80);_nop_();_nop_();
- SCL=1;Delay4us();SCL=0;wd<<=1;
- }
- Delay4us();
- SDA=1; //釋放總線并準(zhǔn)備讀取應(yīng)答
- SCL=1;
- Delay4us();
- IIC_ERROR=SDA; //IIC_ERROR=1表示無應(yīng)答
- SCL=0;
- Delay4us();
- }
- //接收一字節(jié)
- uchar IIC_ReceiveByte()
- {
- uchar i,rd=0x00;
- for(i=0;i<8;i++)
- {
- SCL=1;rd<<=1;rd|=SDA;Delay4us();SCL=0;Delay4us();
- }
- SCL=0;Delay4us();
- return rd;
- }
- //連續(xù)讀入4路通道的A/D轉(zhuǎn)換結(jié)果并保存到Recv_Buffer
- void ADC_PCF8591(uchar CtrlByte)
- {
- uchar i;
- IIC_Start();
- IIC_SendByte(0x90); // 發(fā)送寫地址
- if(IIC_ERROR==1)return;
- // IIC_SendByte(CtrlByte); //發(fā)送控制字節(jié)
- //if(IIC_ERROR==1)return;
- IIC_Start(); //重新發(fā)送開始命令
- IIC_SendByte(0x91); // 發(fā)送讀地址
- if(IIC_ERROR==1)return;
- IIC_ReceiveByte(); //空讀一次,調(diào)整讀順序
- Slave_ACK(); //收到一字節(jié)后發(fā)送一個(gè)應(yīng)答位
- for(i=0;i<4;i++)
- {
- Recv_Buffer[i++]=IIC_ReceiveByte();
- Slave_ACK(); //收到一個(gè)字節(jié)后發(fā)送一個(gè)應(yīng)答位
- }
- Slave_NOACK();
- IIC_Stop(); //收到一個(gè)字節(jié)后發(fā)送一個(gè)非應(yīng)答位
- }
- // 向 PCF8591發(fā)送1字節(jié)進(jìn)行AD轉(zhuǎn)換
- //主程序
- void main()
- {
- LCD_Initialise();
- while(1)
- {
- ADC_PCF8591(0x04);
- Convert_To_Voltage(Recv_Buffer[0]);
- LCD_Line_1[5]=Voltage[2];
- LCD_Line_1[6]=Voltage[3];
- LCD_Line_1[7]=Voltage[4];
- LCD_Line_1[9]=Voltage[1];
- LCD_Line_1[10]=Voltage[0];
- LCD_Display_A_Line(0x00, LCD_Line_1);
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
PCF8591 LCD1602AD采集程序.zip
(35.69 KB, 下載次數(shù): 46)
2018-3-29 11:06 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|