|
為了讓后來者少走彎路,分享一個(gè)51單片機(jī)AD四路采集PCF8591實(shí)時(shí)采集的例程。雙IIC接口,還附上Proteus防真。
地址:AD四路采集串口顯示雙IIC
單片機(jī)源程序如下:
- #include "main.h"
- // 變量定義
- u32 V0=0,V1=0,V2=0,V3=0;
- u8 num;
- //******************************************************************/
- main()
- {
- OLED_Init();
- OLED_ColorTurn(0); //0正常顯示,1 反色顯示
- OLED_DisplayTurn(0); //0正常顯示 1 屏幕翻轉(zhuǎn)顯示
- OLED_DrawBMP(0,0,128,64,BMP1);
-
- Uart_Init();
- Timer0_Init();
-
- delayms(500);
- OLED_Clear();
-
- OLED_ShowChinese(24,1,0,16);//祝
- OLED_ShowChinese(40,1,1,16);//你
- OLED_ShowChinese(56,1,2,16);//好
- OLED_ShowChinese(72,1,3,16);//運(yùn)
- OLED_ShowChinese(88,1,4,16);//!
- delayms(500);
- OLED_Clear();
-
- OLED_ShowString(0,0,"CHANNEL1:",16);
- OLED_ShowString(0,2,"CHANNEL2:",16);
- OLED_ShowString(0,4,"CHANNEL3:",16);
- OLED_ShowString(0,6,"CHANNEL4:",16);
-
- while(1)
- {
- if(num==10)
- {
- V0=ADC(0x40);
- delayms(10);
- V1=ADC(0x41);
- delayms(10);
- V2=ADC(0x42);
- delayms(10);
- V3=ADC(0x43);
- delayms(10);
- DAC(V1);
- delayms(10);
-
- UartPrintASCII(V0);
- delayms(2);
- UartPrintASCII(V1);
- delayms(2);
- UartPrintASCII(V2);
- delayms(2);
- UartPrintASCII(V3);
- UartPrintf("OK !");
-
- V0=V0*50000/255;
- V1=V1*50000/255;
- V2=V2*50000/255;
- V3=V3*50000/255;
-
- num=0;
-
- OLED_ShowNum(80,0,V1/10000,1,16);
- OLED_ShowString(88,0,".",16);
- OLED_ShowNum(96,0,V1%10000,4,16);
-
- OLED_ShowNum(80,2,V2/10000,1,16);
- OLED_ShowString(88,2,".",16);
- OLED_ShowNum(96,2,V2%10000,4,16);
-
- OLED_ShowNum(80,4,V3/10000,1,16);
- OLED_ShowString(88,4,".",16);
- OLED_ShowNum(96,4,V3%10000,4,16);
-
- OLED_ShowNum(80,6,V0/10000,1,16);
- OLED_ShowString(88,6,".",16);
- OLED_ShowNum(96,6,V0%10000,4,16);
-
- }
-
- }
- }
- //*******************************************************************
- void Timer0_Isr() interrupt 1
- {
- TF0 = 0; /*清除中斷標(biāo)志*/
- TR0 = 0; /*關(guān)中斷*/
-
- num++;
-
- TL0 = 0x00; //設(shè)置定時(shí)初始值
- TH0 = 0x4C; //設(shè)置定時(shí)初始值
- TR0 = 1; /*開中斷*/
- }
- //*******************************************************************
復(fù)制代碼
- #include "ADC.h"
- //*****串口初始化函數(shù)***********
- //******************************
- void Uart_Init(void)
- {
- REN = 1; //允許串行口接收數(shù)據(jù)
- PCON &= 0x7F; //波特率不倍速
- SCON = 0x50; //8位數(shù)據(jù),可變波特率
- AUXR &= 0xBF; //定時(shí)器時(shí)鐘12T模式
- AUXR &= 0xFE; //串口1選擇定時(shí)器1為波特率發(fā)生器
- TMOD &= 0x0F; //設(shè)置定時(shí)器模式
- TMOD |= 0x20; //設(shè)置定時(shí)器模式
- TL1 = 0xFD; //設(shè)置定時(shí)初始值
- TH1 = 0xFD; //設(shè)置定時(shí)重載值
- EA = 1; //打開全局中斷控制
- ES = 0; //打開串行口中斷
- ET1 = 0; //禁止定時(shí)器中斷
- TR1 = 1; //定時(shí)器1開始計(jì)時(shí)
- }
- void UartPrintASCII(u8 dat) //發(fā)送一個(gè)字符
- {
- TI=0;
- SBUF=dat;
- while(TI==0);
- TI=0;
- }
- void UartPrintf(u8 *p) //發(fā)送字符串
- {
- while(*p)
- {
- SBUF=*(p++);
- while(TI==0)
- {
- };
- TI=0;
- }
- }
- void Timer0_Init(void) //50毫秒@11.0592MHz
- {
- EA=1;
- ET0 = 1; /*允許定時(shí)中斷*/
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TMOD |= 0x01; //設(shè)置定時(shí)器模式
- TL0 = 0x00; //設(shè)置定時(shí)初始值
- TH0 = 0x4C; //設(shè)置定時(shí)初始值
- TR0 = 1; /*啟動(dòng)定時(shí)中斷*/
- }
- /*******************************************************************
- 起動(dòng)總線函數(shù)
- 函數(shù)原型: void IIcStart();
- 功能: 啟動(dòng)I2C總線,即發(fā)送I2C起始條件.
- ********************************************************************/
- void IIcStart()
- {
- SCL=1;
- SDA=1; /*發(fā)送起始條件的數(shù)據(jù)信號(hào)*/
- delay5us();
- SDA=0; /*發(fā)送起始信號(hào)*/
- delay5us();
- }
- /*******************************************************************
- 結(jié)束總線函數(shù)
- 函數(shù)原型: void IIcStop();
- 功能: 結(jié)束I2C總線,即發(fā)送I2C結(jié)束條件.
- ********************************************************************/
- void IIcStop()
- {
- SCL=1 ;
- SDA=0; /*發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)*/
- delay5us();
- SDA=1; /*發(fā)送I2C總線結(jié)束信號(hào)*/
- delay5us();
- }
- /********************************************************************
- 發(fā)送應(yīng)答
- 函數(shù)原型: IIc_ACK(bit a);
- 功能: 主控器進(jìn)行應(yīng)答信號(hào)(注意:0表示發(fā)送應(yīng)答,1表示發(fā)送非應(yīng)答)
- ********************************************************************/
- void IIc_Ack(bit ack)
- {
- SCL=1;
- delay5us();
- SDA=ack; /*清時(shí)鐘線,鉗住I2C總線以便繼續(xù)接收*/
- delay5us();
- SCL=0;
- }
- /********************************************************************
- 等待應(yīng)答
- 函數(shù)原型: IIc_WaitACK(void);
- 功能: 主控器進(jìn)行應(yīng)答信號(hào)(0是就幫答)
- ********************************************************************/
- bit IIc_WaitAck(void)
- {
- SCL=0;
- delay5us();
- SCL=1;
- delay5us();
- if(SDA==1)
- {
- SCL=0;
- return 0;
- }
- else
- {
- SCL=0;
- return 1;
- }
- }
- /*******************************************************************
- 字節(jié)數(shù)據(jù)發(fā)送函數(shù)
- 函數(shù)原型: void SendByte(UCHAR c);
- 功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對(duì)
- 此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0)
- 發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應(yīng)答或損壞。
- ********************************************************************/
- void SendByte(unsigned char date)
- {
- unsigned char temp,i; //用于探測(cè)字節(jié)內(nèi)某一位值的掩碼變量
- temp=date;
- for (i=0; i<8; i++) //從高位到低位依次進(jìn)行
- {
- temp=temp<<1;
- SCL=0 ;
- delay5us();
- SDA = CY;
- delay5us();
- SCL = 1; //拉高SCL
- delay5us();
- }
- SCL = 0;
- SDA = 1; //8位數(shù)據(jù)發(fā)送完后,主機(jī)釋放SDA,以檢測(cè)從機(jī)應(yīng)答
- }
- /*******************************************************************
- 字節(jié)數(shù)據(jù)接收函數(shù)
- 函數(shù)原型: UCHAR RcvByte();
- 功能: 用來接收從器件傳來的數(shù)據(jù),并判斷總線錯(cuò)誤(不發(fā)應(yīng)答信號(hào)),
- 發(fā)完后請(qǐng)用應(yīng)答函數(shù)應(yīng)答從機(jī)。
- ********************************************************************/
- unsigned char RcvByte(void)
- {
- unsigned char i,j,k;
- SCL=0;
- delay5us();
- for(i=0;i<8;i++)
- {
- SCL=1;
- delay5us();
- j=SDA;
- k=(k<<1)|j;
- SCL=0;
- delay5us();
- }
- return k;
- }
- /*******************************************************************
- D/A 變換, 轉(zhuǎn)化函數(shù)
- *******************************************************************/
- void DAC(unsigned char dat)
- {
- IIcStart(); //啟動(dòng)總線
- SendByte(0x90); //發(fā)送器件地址0x90是寫,0x91是讀
- IIc_WaitAck();
- SendByte(0x41); //發(fā)送控制字節(jié)//允許DA輸出
- IIc_WaitAck();
- SendByte(dat); //發(fā)送DAC的數(shù)值
- IIc_WaitAck();
- IIcStop(); //結(jié)束總線
- }
- /*******************************************************************
- ADC讀字節(jié)數(shù)據(jù)函數(shù)
- *******************************************************************/
- unsigned char ADC(unsigned char addr)
- {
- unsigned char temp;
- IIcStart(); //啟動(dòng)總線
- SendByte(0x90); //發(fā)送器件地址0x90是寫,0x91是讀
- IIc_WaitAck();
- SendByte(addr); //控制字節(jié):選擇光敏電阻(0x41)還是滑動(dòng)變阻器(0x43
- IIc_WaitAck();
- IIcStart();
- SendByte(0x91);
- IIc_WaitAck();
- temp=RcvByte();
- IIc_Ack(1); //0表示發(fā)送應(yīng)答,1表示發(fā)送非應(yīng)答
- IIcStop();
- return temp;
- }
復(fù)制代碼 Proteus8.15版本的仿真:
Proteus8.15版本的仿真.7z
(133.22 KB, 下載次數(shù): 50)
2023-11-6 23:00 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|