📄 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 + -