51單片的1 AD采集電位器電壓并顯示代碼值
電路原理圖如下:
0.jpg (37.6 KB, 下載次數: 33)
下載附件
2018-5-5 23:47 上傳
0.jpg (26.5 KB, 下載次數: 30)
下載附件
2018-5-5 23:47 上傳
單片機源程序如下:
- //摘要:
- //四位數碼管顯示采集的電位器AD(代碼值)
- //Designed by Cache.Lee
- #include "STC12C5A60S2.h"
- #include <I2C.H>
- #define uchar unsigned char
- #define uint unsigned int
- #define PCF8591 0x90 //PCF8591 地址
- #define THCO 0xf8 //11.0592MHZ晶振
- #define TLCO 0xcb //定時2ms時間常數值
- unsigned char Data_Buffer[4]={1,2,3,4};
- uchar code Duan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76};
- sbit P24=P2^4; //四個數碼管的位碼口定義
- sbit P25=P2^5;
- sbit P26=P2^6;
- sbit P27=P2^7;
- bit flag=0;
- bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val);
- bit ISendByte(unsigned char sla,unsigned char c);
- unsigned char IRcvByte(unsigned char sla);
- /******************************/
- void main(void) //主程序
- {
- unsigned int v;
- unsigned char AD_CHANNEL=1;
- unsigned int D[5]={0,0,0,0,255};
- TMOD=0x11; //設置定時器0工作模式,16位計數模式
- TH0=THCO;
- TL0=TLCO;
- TR0=1; //啟動定時器
- ET0=1; //使能定時器中斷
- EA=1; //開總中斷
-
- while(1)
- {
- if(flag==1)
- {flag=0;
-
- ISendByte(PCF8591,0x41);
- v=IRcvByte(PCF8591);
- Data_Buffer[0]=0;
- Data_Buffer[1]=v/100%10;
- Data_Buffer[2]=v/10%10;
- Data_Buffer[3]=v%10;
- }
- }
- }
- void timer0() interrupt 1 //定時器中斷服務子程序
- {
- static unsigned int count=0;//軟計時變量定義
- static unsigned char Bit=0; //靜態變量,退出程序后,值保留
- TH0=THCO;
- TL0=TLCO;
- Bit++;
- if(Bit>=4)Bit=0;
- P2|=0xf0; //先關位碼
- P0=Duan[Data_Buffer[Bit]]; //開段碼
- switch(Bit) //送位碼
- {
- case 0: P24=0;break;
- case 1: P25=0;break;
- case 2: P26=0;break;
- case 3: P27=0;break;
- }
- count++;
- if(count>=250) //半S時間到
- {
- count=0;
- flag=1;
- }
- }
- /*******************************************************************
- 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);
- }
- /*******************************************************************
- 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);
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
1 AD采集電位器電壓并顯示代碼值.rar
(204.52 KB, 下載次數: 101)
2018-5-5 14:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|