- #include<reg51.h>
- #include<intrins.h>
- #include "STC_NEW_8051.H"
-
- #define uchar unsigned char
- #define uint unsigned int
- //以下选择 ADC 转换速率,只能选择其中一种
- // SPEED1 SPEED0 A/D转换所需时间
- //#define AD_SPEED 0x60 // 0110,0000 1 1 70 个时钟周期转换一次,
- // CPU工作频率21MHz时 A/D转换速度约 300KHz
- //#define AD_SPEED 0x40 //0100,0000 1 0 140 个时钟周期转换一次
- //#define AD_SPEED 0x20 //0010,0000 0 1 280 个时钟周期转换一次
- #define AD_SPEED 0x00 //0000,0000 0 0 420 个时钟周期转换一次
- code unsigned char digit[]={'0','1','2','3','4','5','6','7','8','9' };
-
- /******************************************************************/
- /* 定义端口 */
- /******************************************************************/
-
- sbit rs=P1^0; //显示数据端口P2
- sbit rw=P1^1;
- sbit en=P1^2;
-
- /******************************************************************/
- /* 函数声明 */
- /******************************************************************/
- void write_order(uchar order);
-
- void write_date(uchar date);
- void write_address(uchar x);
- unsigned int get_AD_result_10F(unsigned char channel);
-
- //延时
- void delay(uchar m)
- {
- uchar i=100;
- while(m--)
- {
- while(i--);
- }
- }
-
- /******************************************************************/
- /* 写命令 */
- /******************************************************************/
- void write_order(uchar order)
- {
- rs=0;
- P2=order;
- delay(4);
- en=1;
- delay(4);
- en=0;
- }
- /******************************************************************/
- /* 写数据 */
- /******************************************************************/
- void write_data(uchar date)
- {
- rs=1;
- P2=date;
- delay(4);
- en=1;
- delay(4);
- en=0;
- }
- /******************************************************************/
- /* 写地址 */
- /******************************************************************/
- void write_address(uchar x)
- {
- write_order(0x80+x);
- }
- /******************************************************************/
- /* 1602 初始化 */
- /******************************************************************/
- void init_lcd()
- {
- rw=0;
- en=0;
- write_order(0x38);
- write_order(0x0c);
- write_order(0x06);
- write_order(0x01);
- }
-
- /******************************************************************/
- /* 主函数 */
- /******************************************************************/
- void main()
- {
- unsigned char ADC_result ;
- unsigned long int gg ;
- uchar g,s,b ;
- P1ASF = 0x80; //1000 0000选择P1^7作为模拟输入口
-
-
- //ADRJ = AUXR1^2:
- // 0: 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器
- // 1: 10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在
- AUXR1 &= ~0x04; //0000,0100, 令 ADRJ=0
- ADC_CONTR |= 0x80; //1000,0000 打开 A/D 转换电源
- delay(10);
- init_lcd(); //lcd初始化
- delay(15);
-
- while(1)
- { /*
- ADC_result = get_AD_result_10F(7); //P1.7为 A/D 当前通道, 接电压源进行测量
- gg=(unsigned long int)((unsigned long int)ADC_result*465)/256; //“470”根据实际情况而定
- b=(gg%1000)/100;
- s=(gg%100)/10;
- g=gg%10;
- write_address(0x40);
- write_data(digit[b]);
- write_data('.');
- write_data(digit[s]);
- write_data(digit[g]); */
- ADC_result = get_AD_result_10F(7); //P1.7为 A/D 当前通道, 接电压源进行测量
- gg=(unsigned long int)((unsigned long int)ADC_result*485)/256; //“470”根据实际情况而定
- b=(gg%1000)/100;
- s=(gg%100)/10;
- g=gg%10;
- if(g>=5){
- s++;
- if(s==10)
- {
- s=0;
- b++;
- }
-
- }
-
- write_address(0x40);
- write_data(digit[b]);
- write_data('.');
- write_data(digit[s]);
-
-
-
- }
-
- }
- /****************************************************************************/
- /* 10位AD带均值滤波转换 */
- /*****************************************************************************/
- unsigned int get_AD_result_10F(unsigned char channel)
- {
- unsigned char AD_finished=0; //存储 A/D 转换标志
- unsigned int out=0;
- unsigned int N=40;
- unsigned int sum=0;
- unsigned char m;
- ADC_RES = 0;
- ADC_RESL = 0;
- channel &= 0x07; //0000,0111 清0高5位
- ADC_CONTR = AD_SPEED;
- _nop_();
- ADC_CONTR |= channel; //选择 A/D 当前通道
- _nop_();
- ADC_CONTR |= 0x80; //启动 A/D 电源
- delay(1); //使输入电压达到稳定
- for(m=0;m<N;m++)
- { //均值滤波
- ADC_CONTR |= 0x08; //0000,1000 令 ADCS = 1, 启动A/D转换,
- AD_finished = 0;
- while (AD_finished ==0 ) //等待A/D转换结束
- {
- AD_finished = (ADC_CONTR & 0x10); //0001,0000 测试A/D转换结束否
- }
- ADC_CONTR &= 0xE7; //1110,0111 清 ADC_FLAG 位, 关闭A/D转换,
- out= ADC_RES;
- // out=(out<<2)+(ADC_RESL&0xfc);
- sum=sum+out;
- } //带均值滤波
- return (sum/N); //返回 A/D 高 8 位转换结果
- }
复制代码
头文件:
- /**************************************************************************
- STC_NEW_8051.H
- ************************************************************************/
- sfr P1ASF = 0x9D; //P1 analog special function
- sfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS 0000,0000
- //-----------------------------------
- sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ - DPS 0000,0000
- sfr ADC_CONTR = 0xBC; //A/D 转换控制寄存器 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000
- sfr ADC_RES = 0xBD; //A/D 转换结果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2 0000,0000
- sfr ADC_RESL = 0xBE; //A/D 转换结果低2位 ADCV.1 ADCV.0 0000,0000
- sfr BRT = 0x9C; //S2 Baud-Rate Timer 0000,0000
-
复制代码
|