📄 p7705.c
字号:
#include<reg51.h>
#include<intrins.h>
#define unchar unsigned char;
sbit A0=P1.0;
sbit A1=P1.1;
sbit A2=P1.2;
sbit DIN=P1.3;
sbit DOUT=P1.4;
sbit DRDY=P1.5;
sbit SCLK=P1.6;
// 通讯寄存器00,读,01写
// 设置寄存器01111010
// 时钟寄存器00000010 100Hz
// 数据寄存器16位
long mask,send_dat;
long data ad_ctrl_word,dat,dat1,wt;
long ad_rd16(); //读16位实际转换的值
void ad_wr8(); //写24位显示的值
//************************************
//*********延时1秒程序****************
//************************************
delay()
{
int data i;
for(i=0;i<5000;i++){}
}
//延时1豪秒程序
delay1ms()
{
int data i;
for(i=0;i<5;i++){}
}
//数字滤波,5次平均
save()
{
char data i;
long sum_temp=0,dat_sub=0;
// wt=dat;
dat_temp[temp_n]=dat;
temp_n++;
if(temp_n==5){ temp_n=0; }
for(i=0;i<5;i++){sum_temp=sum_temp+dat_temp[i];}
wt=sum_temp/5;
}
//写24位控制字
void ad_ctrl_wr(long ctrl_word){ //写24位控制字
long data mask; //确定掩码
char data i,temp;
ad_a0=0; //对控制字进行读写
ad_tfs=1;
ad_rfs=1;
mask=0x00800000; //掩码最高位为1
ad_tfs=0; //先送高位后送低位
for(i=0;i<24;i++){ //送24位
if((ctrl_word&mask)!=0){
ad_sdata=1;
}
else{
ad_sdata=0;
}
delay1ms();
ad_sclk=1;
mask=mask>>1; //延迟,给个下降沿脉冲
delay1ms();
ad_sclk=0;
}
ad_tfs=1;
}
long ad_ctrl_rd(){ //读控制字
long data ddd;
char data i,temp;
ad_a0=0; //读control
ddd=0;
ad_rfs=1;
ad_tfs=1;
ad_rfs=0;
for(i=0;i<24;i++){ //共读24位
ad_sclk=1; //先让时钟为1
if(ad_sdata==1){ ddd++; } //如果为1,则加加
if(i<23){ //如果小于23则左翼、
ddd=ddd<<1;
}
delay1ms();
ad_sclk=0;
delay1ms();
}
ad_rfs=1; ad_a0=0;
return(ddd); // 返回值
}
//读AD输出数据16位
//读校准寄存器数据24位
void ad_cal_rd(){
ad_ctrl_word=0xdc1493; //写控制字
ad_ctrl_wr(ad_ctrl_word); //写控制字1101 1100 0001 0100 1001 0011
dat=ad_rd1624(24); //读校准系数
}
//写校准寄存器数据24位
void ad_cal_wr(){
ad_ctrl_word=0xfc1493; //写 写校准系数控制字
ad_ctrl_wr(ad_ctrl_word); //写控制字1111 1100 0001 0100 1001 0011
ad_wr24(); //写校准系数
}
//从AD7710中读16位或24位数据
long ad_rd1624(char bits){
long data ddd;
char data i;
ad_a0=1; //读数据
ddd=0;
ad_rfs=1; //初始化端口均为1
ad_drdy=1;
while(ad_drdy==1){} //如果该端口为0则为准备好
ad_rfs=0; ad_sclk=0; //始终和接受位先都置低
for(i=0;i<bits;i++){ //读位数
ad_sclk=1;
if(ad_sdata==1){ ddd++; }
if(i<(bits-1)){
ddd=ddd<<1;
}
delay1ms();
ad_sclk=0;
delay1ms();
}
ad_rfs=1; ad_a0=0;
return(ddd);
}
//
void ad_wr24(){
}
convert(long wtt)
{
char data temp;
if(bat=1)
wtt=0xa0a0a0a1|wtt;
else wtt=0xa0a0a0a0|wtt;
}
void time0() interrupt 1 using 2 //前面为中断向量,后面为选用的寄存器组
{
char data temp;
//送定时常数4ms
TH0=0xc3; //置定时器初值
TL0=0x00;
if (mask==0){
ad_send=1;
ET1=1;
TR1=1;
ET0=0;
}
if( mask&send_dat) ad_send=1; // 如果掩码为1则送1否则送0
else ad_send=0;
mask=mask>>1;
}
void time1() interrupt 3 using 3
{
//送时间常数
TH1=0x00;
TL1=0x00;
tt++;
if(tt>4){
tt=0;
ET0=1;
ET1=0;
TR1=0;
mask=0x80000000;
}
}
main(){
ad_ctrl_word=0x003c1493; //写读数据控制字
ad_ctrl_wr(ad_ctrl_word); //先写控制字为0011 1100 0001 0100 1001 0011
//完成一步校准,//全放大,//关电流//双悸性//
delay(); //延时1秒
dat1=ad_ctrl_rd(); //读控制寄存器数据
display_dat(bat); //显示
while(1){
delay(); //延时
dat=ad_rd1624(16);//读数据
save();
disp_n++; //10次显示1次
if(disp_n==10){ disp_n=0;display_dat(dat); }
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -