资源描述:
《STC12C5A60S2.AD转换用数码管显示.docx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、#include"stc12c5a.h"#include"stdio.h"#include"intrins.h"//------------------------------------------------------------------------------voidAD_init();voidserial_init();voiddelay(unsignedinta);floatAD_work(unsignedcharchannel);unsignedintAD_get(unsignedcharc
2、hannel);voidchu(long);unsignedcharcodetable[]={0x06,0x7e,0x25,0x64,0x5c,0xc4,0x84,0x76,0x04,0x44};//带点的0-9,由于我的数码管连法不一样所以代码不一样unsignedcharcodetable1[]={0x02,0x7a,0x21,0x60,0x58,0xc0,0x80,0x72,0x00,0x40};//不带点unsignedcharshi,ge,fen1;longR;sbitfeng=P0^1;sbitj
3、i=P0^7;sbitdian=P0^6;//------------------------------------------------------------------------------voiddisplay(){shi=R/1000;ge=R%1000/100;fen1=R%100/10;P2=0X08;P3=table[ge];delay(5);P2=0X04;P3=table[fen1];delay(5);P2=0X02;P3=table1[shi];delay(5);}voidmain
4、(){chark;intb=0;P0=0X00;AD_init();//A/D转换初始化serial_init();//串口初始化while(1){unsignedchari;i=0;//P10口,i=n则是P1n口TI=1;chu(AD_work(i));if(b!=0)R=b;for(k=100;k>0;k--)//使用printf函数前须先将发送标志位TI置1display();TI=0;if((R>=8000)&(R<=8500)){b=R;P0=0XF2;delay(200);P0=0xf0;del
5、ay(200);}if((R>=6000)&(R<=6500)){b=R;P0=0XF2;delay(200);P0=0xf0;delay(200);}}}//------------------------------------------------------------------------------unsignedintAD_get(unsignedcharchannel){ADC_CONTR=0x88
6、channel;//开启AD转换10001000即POWERSPEED1SPEED0ADC
7、_FLAGADC_STARTCHS2CHS1CHS0_nop_();_nop_();_nop_();_nop_();//要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR寄存器while(!(ADC_CONTR&0x10));//等待转换完成ADC_CONTR&=0xe7;//关闭AD转换,ADC_FLAG位由软件清0return(ADC_RES*4+ADC_RESL);//返回AD转换完成的10位数据(16进制)}//------------------------------------
8、------------------------------------------floatAD_work(unsignedcharchannel){doubleAD_val,AD_vale;//定义处理后的数值AD_val为浮点数unsignedchari;for(i=0;i<100;i++)AD_val+=AD_get(channel);//转换100次求平均值(提高精度)AD_val/=100;AD_vale=(AD_val*5000)/1024;//AD的参考电压是单片机上的5v,所以乘5000,实
9、际电压值为N,就乘NX1000;returnAD_vale;}voidchu(longa){R=a;}//------------------------------------------------------------------------------voiddelay(unsignedinta)//延时约1ms{unsignedinti;while(--a!=0)for(i=600;i>