?? 7738.c
字號(hào):
//--------------------------------------------------------------------------------------------
//程序作用:用AD7738采集數(shù)據(jù),由單片機(jī)將數(shù)據(jù)送往上位機(jī)
//2006.3 FDY 每個(gè)通道連續(xù)采樣6次,求平均數(shù)
//作為本次采集的有效數(shù)據(jù)
//---------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
//頭文件以及全局變量定義
//---------------------------------------------------------------------------------------------
#include <reg51.h>
#include <intrins.h>
#include <math.h>
sbit SCK=P1^1; // 將p1.1口模擬時(shí)鐘輸出
sbit MOSI=P1^2; // 將p1.2口模擬主機(jī)輸出
sbit MISO=P1^3; // 將p1.3口模擬主機(jī)輸入
sbit RDY=P3^2; // 數(shù)據(jù)準(zhǔn)備好標(biāo)志
unsigned long tdata,a,b,c;
float v,d;
float pdata kk;
float v0,v1,v2,v3,v4,v5,v6,v7;
float m1,m2,m3,m4,m5,m6;
float e[6],x;
#define delayNOP(); {_nop_();_nop_();_nop_();};
//---------------------------------------------------------------------------------------------
// 函數(shù)名稱: delay
// 入口參數(shù): N
// 函數(shù)功能: 延時(shí)16*N+24
//---------------------------------------------------------------------------------------------
void delay(int N)
{
int i;
for(i=0;i<N;i++);
}
//---------------------------------------------------------------------------------------------
// 函數(shù)名稱: Write7738
// 入口參數(shù): ch
// 函數(shù)功能: 向AD7738發(fā)送一個(gè)字節(jié)
//---------------------------------------------------------------------------------------------
void Write7738(unsigned char ch)
{
unsigned char idata n=8; // 向SDA上發(fā)送一位數(shù)據(jù)字節(jié),共八位
SCK = 1 ; //時(shí)鐘置高
while(n--)
{
delayNOP();
//delay(3);
SCK = 0 ; //時(shí)鐘置低
if((ch&0x80) == 0x80) // 若要發(fā)送的數(shù)據(jù)最高位為1則發(fā)送位1
{
MOSI = 1; // 傳送位1
}
else
{
MOSI = 0; // 否則傳送位0
}
delayNOP();
//delay(3);
ch = ch<<1; // 數(shù)據(jù)左移一位
SCK = 1 ; //時(shí)鐘置高
}
}
//---------------------------------------------------------------------------------------------
// 函數(shù)名稱: Reset7738
// 入口參數(shù): 無(wú)
// 函數(shù)功能: 復(fù)位AD7738,使其恢復(fù)到向通信寄存器寫狀態(tài)
//---------------------------------------------------------------------------------------------
void Reset7738(void)
{
Write7738(0x00);
Write7738(0xFF);
Write7738(0xFF);
Write7738(0xFF);
Write7738(0xFF);
}
//---------------------------------------------------------------------------------------------
// 函數(shù)名稱: Comp
// 入口參數(shù):
// 函數(shù)功能: 按從小到大排列
//---------------------------------------------------------------------------------------------
void Comp(void)
{
int j,i;
e[0]=m1;e[1]=m2;e[2]=m3;e[3]=m4;e[4]=m5;e[5]=m6;
for(j=0;j<=4;j++)
{
for(i=0;i<=5-j;i++)
{
if(e[i]>e[i+1])
{x=e[i];e[i]=e[i+1];e[i+1]=x;}
}
}
}
//---------------------------------------------------------------------------------------------
// 函數(shù)名稱: Init7738
// 入口參數(shù): 通道數(shù)n
// 函數(shù)功能: 初始化AD7738各寄存器,設(shè)置AD轉(zhuǎn)換相關(guān)參數(shù)
//---------------------------------------------------------------------------------------------
void Init7738(int n)
{
Reset7738( );
Write7738(0x30+n);
Write7738(0xFF); //設(shè)定通道n轉(zhuǎn)換時(shí)間,實(shí)驗(yàn)中若將通轉(zhuǎn)換時(shí)間設(shè)為零,則輸出為滿量程
Write7738(0x01);
Write7738(0x30); //設(shè)置RDY引腳在任何一個(gè)通道轉(zhuǎn)換結(jié)束時(shí)變低
Write7738(0x28+n);
Write7738(0x05); //設(shè)置模擬輸入基準(zhǔn)為AINCOM,輸入電壓范圍0--+2.5V,單轉(zhuǎn)換模式
}
//---------------------------------------------------------------------------------------------
// 函數(shù)名稱: Read7738
// 入口參數(shù): 通道數(shù)z為整型,分別為0,1,2,3,4,5,6,7以表示讀取相應(yīng)通道的A/D轉(zhuǎn)換結(jié)果
// 函數(shù)功能: 啟動(dòng)A/D轉(zhuǎn)換,讀取第z通道轉(zhuǎn)換值并存入單片機(jī)
//---------------------------------------------------------------------------------------------
void Read7738(int z)
{
int i,j;
for(j=0;j<5;j++)
{
Write7738(0x38+z);
Write7738(0x43); //設(shè)置模式為單轉(zhuǎn)換模式,數(shù)據(jù)為24位,啟動(dòng)第z通道A/D轉(zhuǎn)換
while(RDY); //查詢本通道轉(zhuǎn)換是否結(jié)束,RDY=0時(shí)表明轉(zhuǎn)換結(jié)束,數(shù)據(jù)可用
Write7738(0x48+z);
SCK=1;
MOSI=0;
for(i=0;i<8;i++)
{
delayNOP();
SCK=0;
delayNOP();
tdata=tdata<<1;
if(MISO==1)
tdata=tdata|0x01;
else
tdata=tdata&0xFE;
SCK=1;
}
a=tdata; //接受高8位數(shù)據(jù)并賦給a
for(i=0;i<8;i++)
{
delayNOP();
SCK=0;
delayNOP();
tdata=tdata<<1;
if(MISO==1)
tdata=tdata|0x01;
else
tdata=tdata&0xFE;
SCK=1;
}
b=tdata; //接受中8位數(shù)據(jù)并賦給b
for(i=0;i<8;i++)
{
delayNOP();
SCK=0;
delayNOP();
tdata=tdata<<1;
if(MISO==1)
tdata=tdata|0x01;
else
tdata=tdata&0xFE;
SCK=1;
}
c=tdata; //接受低8位數(shù)據(jù)并賦給c
d = ((a<<16)&0x00ff0000)+((b<<8)&0x0000ff00)+(c&0x000000FF);
v=d*2.50000000/0xFFFFFF; //注意此處0xFFFFFF若寫成十進(jìn)制數(shù),則得到的最高電壓值2.4999998不等于滿量程2.5V
switch(j)
{
case 0:m1=v;break;
case 1:m2=v;break;
case 2:m3=v;break;
case 3:m4=v;break;
case 4:m5=v;break;
case 5:m6=v;break;
}
}
Comp();
v=(e[2]+e[3]+e[4])/3;
switch(z)
{
case 0:v0=v*409.6;break;
case 1:v1=v*409.6;break;
case 2:v2=v*409.6;break;
case 3:v3=v*409.6;break;
case 4:v4=v*409.6;break;
case 5:v5=v*409.6;break;
case 6:v6=v*409.6;break;
case 7:v7=v*409.6;break;
}
}
//---------------------------------------------------------------------------------------------
// 函數(shù)名稱: SbufIN()
// 入口參數(shù): 無(wú)
// 函數(shù)功能: 串口初始化子程序,假設(shè)單片機(jī)晶振為12M
//---------------------------------------------------------------------------------------------
void SbufIN(void)
{
TMOD=0x20; //設(shè)置波特率300,定時(shí)器1八位自動(dòng)重裝方式
TL1=0x98;
TH1=0x98; //裝載TH1和TL1
SCON=0x50; //設(shè)置串行口工作方式1,10位異步通信方式
PCON=0x00; //波特率不加倍
TR1=1; //啟動(dòng)定時(shí)器1
}
//---------------------------------------------------------------------------------------------
// 函數(shù)名稱: Send7738
// 入口參數(shù): 通道數(shù)m
// 函數(shù)功能: 通過(guò)串行通信送通道m(xù)轉(zhuǎn)換數(shù)據(jù)到上位機(jī)
//---------------------------------------------------------------------------------------------
void Send7738(int m)
{
switch(m)
{
case 0:SBUF='{';while(TI==0);TI=0;
SBUF='d';while(TI==0);TI=0;
SBUF='|';while(TI==0);TI=0;
SBUF=(int)(v0/100);while(TI==0);TI=0;
SBUF='|';while(TI==0);TI=0;
SBUF=(int)(v0-(int)(v0/100)*100);while(TI==0);TI=0;
SBUF='}';while(TI==0);TI=0; break;
case 1:SBUF='{';while(TI==0);TI=0;
SBUF='g';while(TI==0);TI=0;
SBUF='|';while(TI==0);TI=0;
SBUF=(int)(v1/100);while(TI==0);TI=0;
SBUF='|';while(TI==0);TI=0;
SBUF=(int)(v1-(int)(v1/100)*100);while(TI==0);TI=0;
SBUF='}';while(TI==0);TI=0;break;
case 2:SBUF='{';while(TI==0);TI=0;
SBUF='j';while(TI==0);TI=0;
SBUF='|';while(TI==0);TI=0;
SBUF=(int)(v2/100);while(TI==0);TI=0;
SBUF='|';while(TI==0);TI=0;
SBUF=(int)(v2-(int)(v2/100)*100);while(TI==0);TI=0;
SBUF='}';while(TI==0);TI=0; break;
case 3:SBUF='{';while(TI==0);TI=0;
SBUF='m';while(TI==0);TI=0;
SBUF='|';while(TI==0);TI=0;
SBUF=(int)(v3/100);while(TI==0);TI=0;
SBUF='|';while(TI==0);TI=0;
SBUF=(int)(v3-(int)(v3/100)*100);while(TI==0);TI=0;
SBUF='}';while(TI==0);TI=0;break;
case 4:SBUF='{';while(TI==0);TI=0;
SBUF='p';while(TI==0);TI=0;
SBUF='|';while(TI==0);TI=0;
SBUF=(int)(v4/100);while(TI==0);TI=0;
SBUF='|';while(TI==0);TI=0;
SBUF=(int)(v4-(int)(v4/100)*100);while(TI==0);TI=0;
SBUF='}';while(TI==0);TI=0; break;
case 5:SBUF='{';while(TI==0);TI=0;
SBUF='s';while(TI==0);TI=0;
SBUF='|';while(TI==0);TI=0;
SBUF=(int)(v5/100);while(TI==0);TI=0;
SBUF='|';while(TI==0);TI=0;
SBUF=(int)(v5-(int)(v5/100)*100);while(TI==0);TI=0;
SBUF='}';while(TI==0);TI=0;break;
case 6:SBUF='{';while(TI==0);TI=0;
SBUF='v';while(TI==0);TI=0;
SBUF='|';while(TI==0);TI=0;
SBUF=(int)(v6/100);while(TI==0);TI=0;
SBUF='|';while(TI==0);TI=0;
SBUF=(int)(v6-(int)(v6/100)*100);while(TI==0);TI=0;
SBUF='}';while(TI==0);TI=0; break;
case 7:SBUF='{';while(TI==0);TI=0;
SBUF='y';while(TI==0);TI=0;
SBUF='|';while(TI==0);TI=0;
SBUF=(int)(v7/100);while(TI==0);TI=0;
SBUF='|';while(TI==0);TI=0;
SBUF=(int)(v7-(int)(v7/100)*100);while(TI==0);TI=0;
SBUF='}';while(TI==0);TI=0;break;
}
}
//---------------------------------------------------------------------------------------------
// 主程序入口
//---------------------------------------------------------------------------------------------
void main(void)
{
int k;
SbufIN();
while(1)
{
for(k=0;k<8;k++)
{
Init7738(k); //初始化各通道
Read7738(k); //讀取第k通道轉(zhuǎn)換值
Send7738(k);
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -