?? admp.c
字號:
/*******MAX186串行A/D采樣程序********/
#include<reg51.h>
#include<stdio.h>
#include<absacc.h>
/****定義與碼盤地址****/
#define BYTE0 XBYTE[0x1E00]
#define BYTE1 XBYTE[0x1D00]
#define BYTE2 XBYTE[0x1B00]
#define BYTE3 XBYTE[0x1700]
#define CLC XBYTE[0x0F00]
/****定義與MAX186相關的I/O口****/
sbit max186_sclk = P1^2;
sbit max186_cs = P1^3;
sbit max186_din = P1^4;
sbit max186_sstrb = P1^5;
sbit max186_dout = P1^6;
/*****函數聲明****/
unsigned int max186_ad(unsigned char);
void send_cb(unsigned char);//控制字發送函數
unsigned int receive(void);//數據接收函數
void delay(unsigned long);//延時函數
void T0_ISR(void);
void t0_init();
void init_serialcomm(void); //串口初始化
void serial ();
void send_char_com(unsigned char ch);
unsigned long Globtime;
unsigned char Ctl186; //186控制字
int volt_yz; //啟動 閾值
/*****主函數****/
void main()
{
unsigned int ad_result;
unsigned char DAT0,DAT1;
unsigned char MP[4];
unsigned char i;
unsigned int Adrslt; //ad結果
unsigned int UItemp ;
int volt_cur; //當前電壓值
int Itemp;
Globtime=0;
t0_init();
init_serialcomm();
DAT0 = CLC;
EA=1;
Ctl186=0x85;
volt_yz=-50; //啟動 閾值 -50mv
while (1)
{
if(Globtime>99)
{
//向串口發送數據
Globtime=0;
Adrslt=0;
//Ctl186=0xBE;
Itemp=0;
/* for(i=0;i<5;i++)
{
// Adrslt= Adrslt+ max186_ad(Ctl186)/16;
Itemp= Itemp + max186_ad(Ctl186);
} */
Adrslt= Itemp/5;
Adrslt= max186_ad(Ctl186);
DAT0 = Adrslt/256;
DAT1 = Adrslt%256;
// send_char_com(DAT0);
// send_char_com(DAT1);
MP[0] = BYTE3;
MP[1] = BYTE2;
MP[2] = BYTE1;
MP[3] = BYTE0;
//計算電壓值
UItemp = Adrslt;
if(UItemp>=0x8000) // 負數
{
UItemp =UItemp&0x7ff0;
UItemp =UItemp/16;
UItemp =UItemp-1;
UItemp =~UItemp;
UItemp =UItemp&0x7ff;
volt_cur= -(int)UItemp;
}
else
{
UItemp =UItemp/16;
volt_cur= (int)UItemp;
}
if( volt_cur> volt_yz) //如果大于閾值則
{
send_char_com(0xff);
send_char_com(0x00);
send_char_com(0xff);
send_char_com(0x00);
send_char_com(DAT0);
send_char_com(DAT1);
for(i=0;i<4;i++) { send_char_com(MP[i]);}
}
}
}
}
//串口中斷函數
void serial () interrupt 4 using 3
{
unsigned char ch;
unsigned char tmp;
static unsigned char cnt;
static unsigned char recchar[4];
if(RI)
{
RI = 0;
ch=SBUF;
if(cnt>=6) cnt=0;
if(ch==0xff) cnt=0; //幀頭
else if(ch==0xfe&&cnt==4) //幀尾
{
if (recchar[0]==0x00) Ctl186 = 0x85; //通道0
else if(recchar[0]==0x01) Ctl186 = 0xc5; //通道1
else if(recchar[0]==0x02) Ctl186 = 0x95; //通道2
else if(recchar[0]==0x03) tmp=CLC; //碼盤清零
else if(recchar[0]==0x05) //啟動閾值
{
volt_yz= (int)(recchar[2]/16)*1000+(int)(recchar[2]&0x0f)*100
+(int)(recchar[3]/16)*10 +(int)(recchar[3]&0x0f);
if( recchar[1]==1) volt_yz=-volt_yz;
}
}
else
{
recchar[cnt]=ch;
cnt++;
}
}
}
//延時函數
void delay(unsigned long dly_time) //延時
{
while ( (dly_time--) > 0 )
{ ; }
}/***********************
串口初始化
/**********************/
void init_serialcomm(void) //串口初始化
{
SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x00; //SMOD=1;
TH1 = 0xFD; //Baud:9600 fosc=11.0592MHz
// TH1 = 0xF3; //6M wei 2400bps
IE |= 0x91; //Enable Serial Interrupt
TR1 = 1; // timer 1 run
// TI=1;
}
/**********************
串口發送一個字符
/*********************/
void send_char_com(unsigned char ch)
{
SBUF=ch;
do{}while(TI==0);
TI=0;
}
void t0_init()
{
TMOD=0x01; //T0工作在方式1,16位定時器
TH0=0XFC;
TL0=0X18;
ET0=1; //T0中斷允許
PT0=1; //T0為高優先級中斷
TR0=1;
}
void T0_ISR(void) interrupt 1 using 1
{
TH0=0xFC;
TL0=0x1F;
//TR0=1;
Globtime++;
}
/****MAX186服務函數****/
unsigned int max186_ad(unsigned char ctrl_byte)
{
unsigned int ad_data;
max186_cs = 1;
max186_sclk = 0;
max186_din = 0;
max186_cs = 0;
send_cb(ctrl_byte);//發出控制字
//max186_cs = 1;
do
{} while (!max186_sstrb);//等待轉換完畢
max186_cs = 0;
max186_sclk = 1;
ad_data = receive();//接收轉換后的數據
max186_sclk = 0;
max186_cs = 1;
return(ad_data);
}
/****控制字發送函數****/
void send_cb(unsigned char cb_buffer)
{
unsigned char gate;
for ( gate = 0x80 ; gate >= 1 ; gate >>= 1 )
{
max186_sclk=0; delay(1);
if ( (gate & cb_buffer) == 0 )//判斷控制字中所要發送位的值
max186_din = 0;
else
max186_din = 1;
delay(1);
max186_sclk = 1; //給出SCLK的上升沿
}
delay(1);
max186_din = 0;
delay(1);
max186_sclk = 0;
}
/****數據接收函數****/
unsigned int receive(void) //讀轉換后的數據
{
unsigned int ad_buffer = 0;
unsigned int gate;
for ( gate = 0x8000 ; gate >= 0x0010; gate >>= 1 )
{
max186_sclk = 1;
max186_sclk = 0; //給出下降沿
if ( max186_dout == 1) //接收數據
ad_buffer += gate;
}
return(ad_buffer);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -