1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 单片机-模数AD转换-TLC549芯片

单片机-模数AD转换-TLC549芯片

时间:2021-01-27 14:55:58

相关推荐

单片机-模数AD转换-TLC549芯片

#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define unit unsigned intchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x90};//数字0-9sbit fir=P3^0;//控制第一个数码管sbit sec=P3^1;//第二个sbit thr=P3^2;//第三个sbit fur=P3^3;//第四个sbit dian=P2^7;//实际模拟电压存在小数点,因此另外定义小数点sbit ADO=P1^0;sbit ADCS= P1^1;sbit ADCLK=P1^2;void delay(int t){int x,y;for(x=t;x>0;x--)for(y=30;y>0;y--);}//有返回函数,负责转换数据unsigned char TLC549ADC(void){unsigned char i,num=0;ADCLK=0;ADO=1;ADCS=0;//开始转换信号for(i=0;i<8;i++){ADCLK=1; //时钟高电平_nop_(); //延时1us_nop_(); //延时1usnum <<=1; //左移一点,后面补0if(ADO==1) num=num+1;//判断每一位的数据0或者1,如果是1就加1,//如果是0,那么还是保持0ADCLK=0;//时钟低电平}ADCS=1;//停止转换return(num);//转换数据全部融合在num(0-255)}void main()//主函数{int tmp;float num,tmp1;ADCS=1;while(1){num=TLC549ADC(); //执行转换,并且把结果赋值给numtmp1=num*100/51; //这里用了除法运算,一定要定义浮点型//除以51的因为斜率k=1/51,y=k-x,此时num是x,本来tmp1=num/51 (y=x/51)//为什么要乘以100?当num/51以后,这个数据0-5之间,例如显示2.35V*100=235,//为了方便后续的数据分离tmp=(int)tmp1; //强制变成整形,因为后面要用百位数,十位数以及个位数的分离P2=table[tmp/100]; //获得百位数,本质上是真实电压的个位数dian=0;//采用的是共阳数码管,如果要让小数点亮,那么就应该给0fir=1;//打开第一个数码管的三极管delay(60);fir=0;//关闭dian=1;//小数点也是关闭P2=table[tmp%100/10]; //获得十位数,小数点后面的第一位sec=1;//打开第二个数码管的三极管delay(60);sec=0;P2=table[tmp%10]; //获得十位数,小数点后面的第二位thr=1;delay(60);thr=0;P2=table[0];//最后一个永远都是显示0fur=1;delay(60);fur=0;}}

#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define unit unsigned intchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x90};//数字0-9sbit fir=P3^0;//控制第一个数码管sbit sec=P3^1;//第二个sbit thr=P3^2;//第三个sbit fur=P3^3;//第四个sbit dian=P2^7;//实际模拟电压存在小数点,因此另外定义小数点sbit ADO=P1^0;sbit ADCS= P1^1;sbit ADCLK=P1^2;sbit led=P1^7;void delay(int t){int x,y;for(x=t;x>0;x--)for(y=30;y>0;y--);}//有返回函数,负责转换数据unsigned char TLC549ADC(void){unsigned char i,num=0;ADCLK=0;ADO=1;ADCS=0;//开始转换信号for(i=0;i<8;i++){ADCLK=1; //时钟高电平_nop_(); //延时1us_nop_(); //延时1usnum <<=1; //左移一点,后面补0if(ADO==1) num=num+1;//判断每一位的数据0或者1,如果是1就加1,//如果是0,那么还是保持0ADCLK=0;//时钟低电平}ADCS=1;//停止转换return(num);//转换数据全部融合在num(0-255)}void main()//主函数{int tmp;float num,tmp1;ADCS=1;while(1){num=TLC549ADC(); //执行转换,并且把结果赋值给numtmp1=num*100/51; //这里用了除法运算,一定要定义浮点型//除以51的因为斜率k=1/51,y=k-x,此时num是x,本来tmp1=num/51 (y=x/51)//为什么要乘以100?当num/51以后,这个数据0-5之间,例如显示2.35V*100=235,//为了方便后续的数据分离tmp=(int)tmp1; //强制变成整形,因为后面要用百位数,十位数以及个位数的分离if(tmp>333)//指的是实际电压大于3.33V,光源比较充足,需要关闭灯{led=1;}else{led=0;}P2=table[tmp/100]; //获得百位数,本质上是真实电压的个位数dian=0;//采用的是共阳数码管,如果要让小数点亮,那么就应该给0fir=1;//打开第一个数码管的三极管delay(60);fir=0;//关闭dian=1;//小数点也是关闭P2=table[tmp%100/10]; //获得十位数,小数点后面的第一位sec=1;//打开第二个数码管的三极管delay(60);sec=0;P2=table[tmp%10]; //获得十位数,小数点后面的第二位thr=1;delay(60);thr=0;P2=table[0];//最后一个永远都是显示0fur=1;delay(60);fur=0;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。