高分求51单片机AD7731实现AD转换C程序代码?

这个我已经调试了很久了,实在没办法,希望做过这个的高手分享下你的代码,先给100分,通过了再加100........万分感谢!!如果方便留下你的联系方式O(∩_∩)O哈哈~
我要的是 AD7731的程序啊 O(∩_∩)O哈哈~

第1个回答  2010-04-11
#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit DS=P3^3; //定义DS18B20接口int temp; uchar flag1; void display(unsigned char *lp,unsigned char lc);//数字的显示函数;lp为指向数组的地址,lc为显示的个数void delay();//延时子函数,5个空指令code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x40,0x39,0x00};//共阴数码管显示数的组成是 "0-9""0-9有小数点的" "-" "C" "空 表"unsigned char l_tmpdate[8]={0,0,10,0,0,0,0,0};//定义数组变量,并赋值1,2,3,4,5,6,7,8,就是本程序显示的八个数int tmp(void);void tmpchange(void);void tmpwritebyte(uchar dat);uchar tmpread(void);bit tmpreadbit(void);void dsreset(void);void delayb(uint count);void main() //主函数{uchar i;int l_tmp; while(1) { tmpchange(); //温度转换 l_tmp=tmp(); //读取温度值 if(l_tmp<0) l_tmpdate[0]=20; //判断温度为负温度,前面加"-" else { l_tmpdate[0]=l_tmp/1000; //显示百位,这里用1000,是因为我们之前乖以10了 if(l_tmpdate[0]==0) l_tmpdate[0]=22;//判断温度为正温度且没有上百,前面不显示,查表第12是空 }l_tmp=l_tmp%1000;l_tmpdate[1]=l_tmp/100;//获取十位l_tmp=l_tmp%100;l_tmpdate[2]=l_tmp/10;//获取个位再l_tmpdate[2]+=10;//加入小数点,查表可得出有小数点的排在后10位,所以加10l_tmpdate[3]=l_tmp%10;//获取小数第一位l_tmpdate[4]=21;for(i=0;i<10;i++){ //循环输出10次,提高亮度display(l_tmpdate,5); } }}void display(unsigned char *lp,unsigned char lc)//显示{ unsigned char i; //定义变量 P2=0; //端口2为输出 P1=P1&0xF8; //将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管 for(i=0;i<lc;i++){ //循环显示 P2=table[lp[i]]; //查表法得到要显示数字的数码段 delay(); //延时5个空指令 if(i==7) //检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据 break; P2=0; //清0端口,准备显示下位 P1++; //下一位数码管 }}void delay(void) //空5个指令{_nop_();_nop_();_nop_();_nop_();_nop_();}void delayb(uint count) //delay{ uint i; while(count) { i=200; while(i>0) i--; count--; }答案补充
}void dsreset(void)//DS18B20初始化{ uint i; DS=0; i=103; while(i>0)i--; DS=1; i=4; while(i>0)i--;}bit tmpreadbit(void) // 读一位{ uint i; bit dat; DS=0;i++; //小延时一下 DS=1;i++;i++; dat=DS; i=8;while(i>0)i--; return (dat);}uchar tmpread(void) //读一个字节{ uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { j=tmpreadbit(); dat=(j<<7)|(dat>>1); } return(dat); } 答案补充
void tmpwritebyte(uchar dat) { uint i; uchar j; bit testb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) { DS=0; i++;i++; DS=1; i=8;while(i>0)i--; } else { DS=0; i=8;while(i>0)i--; DS=1; i++;i++; } }}void tmpchange(void){ dsreset(); delayb(1); tmpwritebyte(0xcc); tmpwritebyte(0x44); }答案补充
int tmp() //获得温度{ float tt; uchar a,b; dsreset(); delayb(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); //发送读取数据命令 a=tmpread(); //连续读两个字节数据 b=tmpread(); temp=b; temp<<=8; temp=temp|a; //两字节合成一个整型变量。 tt=temp*0.0625; //得到真实十进制温度值,因为DS18B20//可以精确到0.0625度,所以读回数据的最低位代表的是//0.0625度。 temp=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位//也转换为可显示数字,同时进行一个四舍五入操作。 return temp; //返回温度值}答案补充
void readrom() //read the serial 读取温度传感器的序列号{ //本程序中没有用到此函数 uchar sn1,sn2; dsreset(); delayb(1); tmpwritebyte(0x33); sn1=tmpread(); sn2=tmpread();}void delay10ms() { uchar a,b; for(a=10;a>0;a--) for(b=60;b>0;b--);}哇!好累啊。。。这个可以用。。。用那个口自己看看就懂了,如果要汇编语言的去看:http://hi.baidu.com/%B6%E0%B9%A6%C4%DC%B3%B4%BB%F5%BB%FA/blog/item/1f4f0ede8776141462279862.html
相似回答