用C51单片机把只带的ADC(12bit)转换为RS232输出

2020-02-27来源: 51hei关键字:C51  单片机  ADC  RS232输出

#include "reg51.h"         // STC8G1K08A-SOP8  

#include "intrins.h"


/*

  STC8G1K08A-SOP8 

  读取 VCC值 ,先发送出去

  然后 循环开始 读取ch4的 (P55 ,第3脚)值 发送出去 

*/


sfr     ADC_CONTR   =   0xbc;

sfr     ADC_RES     =   0xbd;

sfr     ADC_RESL    =   0xbe;

sfr     ADCCFG      =   0xde;

sbit    EADC        =   IE^5;


sfr P3M1=0xb1;

sfr P3M0=0xb2;

sfr P5M1=0xc9;

sfr P5M0=0xca;


sfr AUXR =0x8e;


unsigned int myADC;

bit bFlag;

int *BGV;

bit busy;  

#define BRT (65536-11059200UL/115200/4)


void ADC_Isr() interrupt 5

{

    ADC_CONTR &= ~0x20;                         //清中断标志

    

        ADCCFG=0x20;        //右对齐


        myADC= (ADC_RES<<8) + ADC_RESL ;

//        P0 = ADC_RES;   //High 2bit

//  P2 = ADC_RESL;   //Low 8bit


        ADC_CONTR |= 0x40; 

        bFlag=1;

}


void UartISR() interrupt 4

{

        if(TI)

        {

                TI=0;

                busy=0;

        }

        if(RI)

                RI=0;


}


void UartInit()

{

        SCON=0x50;

        TMOD=0x0;

        TL1= BRT;

        TH1= BRT>>8;

        TR1=1;

        AUXR=0x40;

        busy=0;

}

void UartSend( char dat)

{

        while(busy);

        busy=1;

        SBUF=dat;

}

void ADCInit()

{

   ADCCFG=0x2f;

   ADC_CONTR=0x8f;// Bandgap voltage

}

int ADCRead()

{

   int res;

   ADC_CONTR|=0x40;

   _nop_();

   _nop_();

   while(!(ADC_CONTR & 0x20));

   ADC_CONTR &=~0x20;

   res=(ADC_RES<<8)|ADC_RESL;

   return res;

}



void main()

{

        int res,vcc,adc,i;

    

        P5M0=0;

        P5M1=0;

        

        BGV=(int idata*)0xef;

        ADCInit();

        UartInit();


        ES=1;

        EA=1;


                ADCRead();

                ADCRead();

                res=0;

                for(i=0;i<8;i++)

                        res+=ADCRead();

                res>>=3;

                vcc=(int)(4095L**BGV/res);


                UartSend(vcc>>8);UartSend(vcc);          //这里先输出VCC电压



        ADCCFG = 0x0f;                          //set sysCLk

    ADC_CONTR = 0x84;          //使能并启动ADC模块 0x84读通道4(P55 ,第3脚),        0x8f读通道F:BGV值

    EADC = 1;                 //使能ADC中断                 //0x85读通道5(P54 ,第1脚)

    EA = 1;                                                                                 //0x83读通道3(P33 ,第8脚)

        ADC_CONTR |= 0x40;                 //Run ADC change         //0x82读通道2(P32 ,第7脚)

                                                                                                 //P30,P31为程序下载口Rx,Tx

        res=0;


    while (1) 

        {

           if(bFlag)

           {

                   i++; 

                   res+=myADC;

                   bFlag=0;

           }

           if(i>=8)

           {

                    res>>=3;

                        adc=(int)(4095L**BGV/res);

                        UartSend(adc>>8);UartSend(adc);         //这里 循环 输出 ADC的电压,

                        res=0;

                        i=0;

           }

        }




}


关键字:C51  单片机  ADC  RS232输出 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic489738.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STC单片机关于舵机pwm控制源程序(单个与多个速度控制都有)
下一篇:单片机C51串口printf的使用方法

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

单片机模拟I2C总线及24C02(I2C EEPROM)读写实例
/*     51系列单片机在使用时,有时需要模拟I2C总线,                      *//*   这里举出一个实例(读写串行EEPROM芯片at2402)                       
发表于 2020-03-10
STM32开发笔记79: 解决C++调用C函数,链接时报L6218E的问题
单片机型号:STM32L053R8T6调试W5500程序,最后生成时报L6218E错误,如下图所示:此错误具体的解释是,一个函数调用另外一个文件中的函数,但是在链接时,找不到那个函数的具体位置。我反复确认此问题,我在dev_w5500中调用ctlnetwork函数,此函数在wizchip_conf.c中已经正确编译,但仍然报此错误。不过,除了调用W5500的wizchip_conf.c、w5500.c和socket.c 3个文件外,调用其它的文件中的函数无此问题。看一下wizchip_conf.c、w5500.c和socket.c 3个文件中相应的头文件开始部分的写法。#ifndef 
发表于 2020-03-10
STM32开发笔记79: 解决C++调用C函数,链接时报L6218E的问题
I2C寄存器控制
    /* 设置寄存器启动传输 */    /* 1. 配置为 master tx mode */    IICCON |= (1<<7); /* TX mode, 在ACK周期释放SDA */    IICSTAT = (1<<4);            /* 2. 把从设备地址写入IICDS */    IICDS = msg->addr<<1;        /*
发表于 2020-03-10
关于软件I2C与MSP430通信的问题
在MSP430作为从设备,主机模拟软件I2C与MSP430通信的时候,一定要注意在发送了8个bit的数据之后,马上将SCLK释放掉。因为MSP430在繁忙的过程中会将SCLK拉低,空闲后才将SCLK释放。所以主机应该先将SCLK交给MSP430,等读到SCLK被MSP430释放后,再发送时钟来接受ACK。对于主机从MSP430读数据的时候也是一样,每次读完了一个字节的数据之后,主机都应该释放掉SCLK,等待MSP430也释放掉了SCLK之后,主机再发送ACK给MSP430。上面一段理解错了,从MSP430读取数据时不需要释放SCLK,而需要在每次读完8个字节之后延时一段时间再发送ACK,等待MSP430处理完毕。主机从MSP430
发表于 2020-03-10
智能厚度测量系统设计
本课题所研究的智能厚度计是基于单片机的成套解决方案,由主控制器、测量传感器、AD转换模块、液晶显示模块以及相应配套硬件组成。通过对测量传感器的运用,对厚度参数进行精确地数据采集,然后通过AD转换模块将测量传感器采集到的模拟信号转换成数字信号,再通过主控制器对AD转换模块输出的数字信号进行相应的数据分析处理,最后通过液晶显示模块对厚度参数进行直观地显示,以完成整个系统的功能需求。1 主控制器电路设计STC89C52单片机最小系统具有体积小、质量轻、功能强、功耗低、性价比高等特点。STC89C52单片机最小系统由芯片、系统时钟、I/O端口设备及复位电路等构成。STC89C52芯片内部结构框图单片机最小系统电路2 电阻式位移传感器
发表于 2020-03-09
智能厚度测量系统设计
pic之I2C设置
在pic中设置i2c:初始化的时候不能把引脚设置为开漏输出,否则在模块使能的时候,两个引脚的电平会一直拉低的。在寄存器I2CxION直接把bit<15> 设置为1,设置波特率,后面的参考资料;
发表于 2020-03-09
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved