|
花了一個(gè)人月的時(shí)間用51單片機(jī)來(lái)讀取AD7746芯片的電容采集程序
本人已作出調(diào)試成功,歡迎下載
0.png (59.75 KB, 下載次數(shù): 127)
下載附件
2017-2-25 01:34 上傳
完整程序代碼下載:
AD7746數(shù)碼管.zip
(73 KB, 下載次數(shù): 140)
2017-2-24 10:31 上傳
點(diǎn)擊文件名下載附件
采集到的電容值通過(guò)數(shù)碼管顯示 下載積分: 黑幣 -5
部分源碼預(yù)覽:
- #include <reg52.h>
- #include <intrins.h>
- #define MAIN_Fosc 11059200UL //宏定義主時(shí)鐘HZ
- /*位聲明*/
- sbit SCL=P1^0;
- sbit SDA=P1^1;
- //sbit RDY=P3^3;
- sbit DU=P2^1; //數(shù)碼管段選
- sbit WE=P2^3; //數(shù)碼管位選
- #define CAPDAC 0
- unsigned long int H,M,L;//
- unsigned char MRD[3]={0,0,0};
- /*自定義類型名*/
- typedef unsigned char INT8U;
- typedef unsigned char uchar;
- typedef unsigned int INT16U;
- typedef unsigned int uint;
- float cfvalue; //得到的溫度值
- /*************************數(shù)碼管程序**************************/
- /*數(shù)碼管毫秒級(jí)延時(shí)函數(shù)*/
- void Delay_Ms(INT16U ms)
- {
- INT16U i;
- do{
- i = MAIN_Fosc / 96000;
- while(--i); //96T per loop
- }while(--ms);
- }
- /*共陰極數(shù)碼管段選碼*/
- uchar code table[]={
- //0 1 2 3 4 5 6 7 8
- 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F,
- //9 A B C D E F - . 關(guān)顯示
- 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x40, 0x80, 0x00
- };
- /*共陰極數(shù)碼管顯示函數(shù)*/
- void Display(uchar cfvalue)
- {
- //------------------------------
- DU = 1;
- P0 = table[cfvalue/100]|0x80; //管顯示百位
- DU = 0;
- P0 = 0xff; //清除斷碼
- WE = 1;
- P0 = 0xfe; //第一位數(shù)碼管
- WE = 0;
- Delay_Ms(5);
- //-------------------------------
- DU = 1;
- P0 = table[cfvalue%100/10]; //顯示十位
- DU = 0;
- P0 = 0xff; //清除斷碼
- WE = 1;
- P0 = 0xfd; //第二位數(shù)碼管
- WE = 0;
- Delay_Ms(5);
- //-------------------------------
- DU = 1;
- P0 = table[cfvalue%10]; //顯示個(gè)位
- DU = 0;
-
- P0 = 0xff; //清除斷碼
- WE = 1;
- P0 = 0xfb; //第三位數(shù)碼管
- WE = 0;
- Delay_Ms(5);
- }
- /*************************IIC程序**************************/
- /*IIC延時(shí)函數(shù)*/
- void delay( )//微秒延時(shí)
- {;;}
- //開(kāi)始信號(hào)
- void start()
- {
- SDA=1;
- delay();
- SCL=1;
- delay();
- SDA=0;
- delay();
- }
- //停止
- void stop()
- {
- SDA=0;
- delay();
- SCL=1;
- delay();
- SDA=1;
- delay();
- }
- //應(yīng)答
- void respons()
- {
- uchar i;
- SCL=1;
- delay();
- while((SDA==1)&&(i<250));
- SCL=0;
- delay();
- }
- //初始化
- void init()
- {
- SDA=1;
- delay();
- SCL=1;
- delay();
- }
- //IIC寫入一個(gè)字節(jié)
- void write_byte(uchar date)//II2給AD7746 寫一個(gè)字節(jié) 例如電容
- {
- uchar i,temp;
- temp=date;
- for(i=0;i<8;i++)
- {
- temp=temp<<1;
- SCL=0;
- delay();
- SDA=CY;
- delay();
- SCL=1;
- delay();
- }
- SCL=0;
- delay();
- SDA=1;
- delay();
- }
- //IIC讀取一個(gè)字節(jié)
- uchar read_byte()//讀一個(gè)字節(jié) 把AD7746中的數(shù)據(jù)讀送給II2總線
- {
- uchar i,k;
- SCL=0;
- delay();
- SDA=1;
- delay();
- for(i=0;i<8;i++)
- {
- SCL=1;
- delay();
- k=(k<<1)|SDA;
- SCL=0;
- delay();
- }
- return k;
- }
- /*************************AD7746程序**************************/
- //重置AD7746
- void AD7746_reset()
- {
- start();
- write_byte(0xBF); //AD7746重置
- stop();
- }
- //AD7756指定地址寫
- void write_add(uchar addr,uchar date)
- {
- start();
- write_byte(0x90);
- respons();
- write_byte(addr);
- respons();
- write_byte(date);
- respons();
- stop();
- }
- //讀取AD7746的值
- void read_add(uchar *p,uchar n)
- {
- uchar i;
- start();
- write_byte(0x90);
- respons();
- write_byte(0x01);
- respons();
- start();
- write_byte(0x91);
- respons();
- for(i=0;i<n;i++)
- {
- *p=read_byte();
- p++;
- }
- stop();
- }
- //總初始化
- void initt()
- {
- init(); //初始化
- AD7746_reset(); //重置
- write_add(0x07,0x80);//地址0x07,設(shè)置成0x80使能電容通道,單端輸入
- write_add(0x09,0x2B);//EXC設(shè)置
- write_add(0x0A,0xA1);//配置寄存器 地址指針0x0A,設(shè)置成0xA1(連續(xù)轉(zhuǎn)換模式)
- write_add(0x0B,0x80);//電容DAC A
- write_add(0x0C,0x80);//電容DAC B
- }
- void main()
- {
- initt();
- while(1)
- {
- read_add(MRD,3);//讀取的值共有3個(gè)字節(jié)24位
- H=MRD[0];//讀取高8位數(shù)據(jù)
- H<<=16;
- L=MRD[1];//讀取中8位數(shù)據(jù)
- L<<=8;
- M=MRD[2];//讀取低8位數(shù)據(jù)
- H=H+L+M;//將讀取到的3個(gè)字節(jié)合并
- cfvalue=(float)((H-0x800000)*4.096/0x800000+CAPDAC)*100;//將十六進(jìn)制轉(zhuǎn)化為10進(jìn)制表
- Delay_Ms(5);
- …………余下內(nèi)容下載附件……
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|