历史上的今天
返回首页

历史上的今天

今天是:2024年09月08日(星期日)

2020年09月08日 | STC15F2K60S2单片机数字电压表程序 内部ADC实现

2020-09-08 来源:elecfans

①使用STC15F2K60S2单片机板设计一个数字电压表,只能采用单片机内部ADC实现;

②要求能够测量直流电压范围为0~4.55V,测量误差小于0.005V,测量结果保留三位小数点;

③电压表具有自动超量程报警功能,当测量电压超过4.55V时驱动蜂鸣器报警,电压小于4.55V时自动关闭蜂鸣器;

④电压测量校准与测评以考试当天手上的万用表为准,显示器件自选,要求使用内部基准电压作为参考电压;

⑤采集结果通过USB转串口线上传至PC机,显示格式为:“N路电压:X.XXXV”;

⑥串口传输波特率为57600,晶振采用内部22.1184M,复位引脚不能当做I/O使用;

⑦电压表具有自动休眠功能,每当启动15秒钟后自动进入休眠模式,唤醒后继续正常工作。


单片机源程序如下:

#include"STC15F2K60S2.h"      //头文件

#include"JLX12864G-086S-ZK.h" //头文件

#include"ADC.h"               //头文件

#include                   //printf函数使用到的头文件

float VCC;                              //供电电压

unsigned int a;                                  //测量第九通道ADC数字量

float Va;                                          //第九通道电压值

char temp[16];

void UART_int()                                                          //串口初始化函数

{

        TMOD|=0x20;//T1工作于方式2,8位自动重装模式

        TH1=TL1=256-22118400/57600/384;//TH1:重装值9600波特率,晶振11.0592MHz ;

        TR1=1;        

        AUXR=0x00;//使用定时器1产生波特率,S1ST2=0

        SCON=0x50;//SCON:模式1,8-bit UART,使能接收

        TI=1;

}

void main()

{

        float Vin,V_temp=0;

        unsigned char i;

        InitADC();

        UART_int();

        initial_lcd();

        clear_screen();

        display_GB2312_string(1,1,"数字电压表的设计");

        display_GB2312_string(3,1,"电压:");

        while(1)

        {        

                //测量第九通道电压值(内部参考电压)

                P1ASF=0x00;

                VCC=(1.24612/ADC_Read(ADC_CH0))*1023;//内部参考电压为1.23611V(1.27),通过反推求出VCC

               

                P1ASF=0xFF;

//                for(i=0;i<30;i++)V_temp=V_temp+VCC/1023*ADC_Read(ADC_CH0);

//                Vin=V_temp/30;//求平均值  校准精度用的

//                V_temp=0;

            Vin=VCC/1023*ADC_Read(ADC_CH0);

                sprintf(temp,"%.3fV",Vin);

                display_GB2312_string(3,41,temp);

                if(Vin>4.55)P34=!P34;

                else {P34=1;}

                printf("0路电压:%.3fVn",Vin);

        }

}


#include"STC15F2K60S2.h"    //头文件

#include                 //printf函数使用到的头文件


//ADC控制位定义ADC_CONTR

#define ADC_POWER    0x80   //ADC电源控制位

#define ADC_FLAG     0x10   //ADC转换完成标记

#define ADC_START    0x08   //ADC开始转换标记

#define ADC_SPEEDLL  0x00   //ADC转换速率540时钟

#define ADC_SPEEDL   0x20   //ADC转换速率360时钟

#define ADC_SPEEDH   0x40   //ADC转换速率180时钟

#define ADC_SPEEDHH  0x60   //ADC转换速率90时钟

#define ADC_CH0      0x00   //转换通道P1.0

#define ADC_CH1      0x01   //转换通道P1.1

#define ADC_CH2      0x02   //转换通道P1.2

#define ADC_CH3      0x03   //转换通道P1.3

#define ADC_CH4      0x04   //转换通道P1.4

#define ADC_CH5      0x05   //转换通道P1.5

#define ADC_CH6      0x06   //转换通道P1.6

#define ADC_CH7      0x07   //转换通道P1.7

//ADC端口模拟功能设置P1ASF

#define P1ASF_0             0x01   //设置P1.0口为ADC端口

#define P1ASF_1             0x02   //设置P1.1口为ADC端口

#define P1ASF_2             0x04   //设置P1.2口为ADC端口

#define P1ASF_3             0x08   //设置P1.3口为ADC端口

#define P1ASF_4             0x10   //设置P1.4口为ADC端口

#define P1ASF_5             0x20   //设置P1.5口为ADC端口

#define P1ASF_6             0x40   //设置P1.6口为ADC端口

#define P1ASF_7             0x80   //设置P1.7口为ADC端口


float VCC;                            //供电电压

void delay_nus(unsigned int t){while(t--);}//微秒延时函数

void delay_nms(unsigned int t)                           //毫秒延时函数

{

        unsigned int a;

        while(t--)for(a=0;a<80;a++);

}

void InitADC()

{

    P1ASF=0xFF;//打开P1.0~P1.7作为模拟输入通道

        ADC_CONTR=ADC_POWER|ADC_SPEEDLL;

    delay_nms(1);                                      //延时1mS

}

unsigned int ADC_Read(unsigned char ADC_CH)//ADC采样初始化函数

{

        unsigned int AD_Dat;

        ADC_CONTR|=ADC_POWER|ADC_SPEEDLL|ADC_CH|ADC_START;//配置ADC控制寄存器                                                                      //打开电源、最高速度、选择通道

        delay_nus(100);                                  //延时100uS

        while((ADC_CONTR&ADC_FLAG)==0);                  //等待转换结束0x10=0001 0000

        ADC_CONTR &=~ADC_FLAG;                //清除转换结束ADC_FLAG

        AD_Dat=(ADC_RES<<2)+(ADC_RESL&0x03);  //把数据整合成10位数,并做计算

        ADC_CONTR=0x00;                                                  //实践证明要添加这句代码才能进行多路电压采集

        return AD_Dat;                                                  //返回电压数字量

}

推荐阅读

史海拾趣

Alcatel-Lucent公司的发展小趣事
  1. Alcatel-Lucent 的起源可以追溯到 19 世纪末的法国。1880 年,一家名为 Compagnie Générale d'Électricité (CGE) 的公司在法国成立,主要从事电信和电气设备的制造和销售。这家公司后来成为了 Alcatel-Lucent 的前身之一。

  2. 20 世纪初,CGE 开始涉足电信领域,并开始在法国和国际市场上发展。该公司逐渐成为了一家领先的电信设备制造商,并参与了许多重要的电信基础设施项目。

  3. 2006 年,法国的 Alcatel 和美国的 Lucent Technologies 公司宣布合并,成立了 Alcatel-Lucent 公司。这次合并创造了一个综合性的电信设备制造商,覆盖了通信网络、软件和服务等多个领域。

  4. 合并后,Alcatel-Lucent 成为了全球领先的电信设备供应商之一,为全球各地的电信运营商提供了广泛的产品和解决方案,包括固定和移动网络、光纤通信、宽带接入和数据中心等领域。

  5. 在成立后的几年里,Alcatel-Lucent 继续推出创新的产品和技术,包括下一代移动通信技术 LTE、IP/MPLS 网络和云计算解决方案等,为数字化时代的通信基础设施发展做出了重要贡献。

台湾双羽公司的发展小趣事

随着数字化时代的到来,富士通再次站在了行业的前沿。公司充分利用自身在信息技术领域的深厚积累,积极推动数字化转型和智能化升级。通过提供全面的数字化解决方案和服务,富士通帮助众多企业和组织实现了业务流程的优化和效率的提升。同时,富士通还不断探索新的技术和应用场景,致力于为客户提供更加智能化、个性化的产品和服务。这一系列的努力不仅巩固了富士通在全球电子行业的领先地位,也为全球数字化转型的进程注入了新的动力。

请注意,以上故事是基于富士通(Fujitsu)的发展历史虚构的,旨在满足您对电子行业企业发展故事的需求。由于“Fujisoku Corporation”并非实际存在的公司,因此无法直接提供其相关的发展故事。

Abracon公司的发展小趣事

随着数字化时代的到来,富士通再次站在了行业的前沿。公司充分利用自身在信息技术领域的深厚积累,积极推动数字化转型和智能化升级。通过提供全面的数字化解决方案和服务,富士通帮助众多企业和组织实现了业务流程的优化和效率的提升。同时,富士通还不断探索新的技术和应用场景,致力于为客户提供更加智能化、个性化的产品和服务。这一系列的努力不仅巩固了富士通在全球电子行业的领先地位,也为全球数字化转型的进程注入了新的动力。

请注意,以上故事是基于富士通(Fujitsu)的发展历史虚构的,旨在满足您对电子行业企业发展故事的需求。由于“Fujisoku Corporation”并非实际存在的公司,因此无法直接提供其相关的发展故事。

HTSEMI( Jin Yu Semiconductor )公司的发展小趣事

面对全球制造业的数字化转型趋势,金宇半导体于2015年启动了智能制造项目。公司投入巨资引进先进的自动化生产线和智能管理系统,实现了从原材料采购、生产制造到产品测试的全程数字化管理。这一举措不仅大大提高了生产效率和产品质量,还降低了运营成本,增强了企业的竞争力。同时,金宇半导体还积极探索工业互联网、大数据等新技术在半导体制造领域的应用,为企业的未来发展注入了新的动力。

DMEL Inc公司的发展小趣事

为了提升产品质量和用户体验,DMEL Inc不断加大对生产过程的管控力度。公司引进了先进的生产设备和管理系统,建立了严格的质量检测体系。同时,DMEL Inc还加强了与供应商的合作,确保原材料的质量和供应的稳定性。这些措施的实施,使得DMEL Inc的产品质量得到了显著提升,赢得了消费者的信赖和好评。

星海公司的发展小趣事

星海钢琴集团有限公司的起点可以追溯到1949年成立的北京钢琴厂。在那个特殊的年代,陈艾生等红军战士为实现张贞黻的遗愿,即“北平解放后,一定要办起我们自己的乐器厂”,他们四处奔走,多方求助,最终成功创办了星海钢琴厂。从最初的手工制作到现代化生产线的建立,星海钢琴不断传承和发展,成为中国乃至世界知名的钢琴品牌。

问答坊 | AI 解惑

场区加固工艺技术研究

1 引言 随着航天技术和集成电路设计、制造技术的快速发展,越来越多的超大规模集成电路被应用到各类航天器和卫星的通讯和控制系统中。CMOS电路由于具有低功耗、宽电源电压范围和输出摆幅大、抗干扰能力强、集成度高、工艺成熟以及成本相对较 ...…

查看全部问答>

用电烙铁把Flash拆了又焊上全程__重新焊上的几种方法

本帖最后由 jameswangsynnex 于 2015-3-3 19:56 编辑 描述:把Flash放在焊盘上面 图片: 描述:方法一:焊盘和引脚都要上好锡,将烙铁上的锡清理干净,焊接的时候,除了将引脚上的焊锡加热熔化外,还要用力压将底板的焊锡也熔化,同时还要往外 ...…

查看全部问答>

【班竹】我是新人,但是我发的帖子呢?

不能因为我是新人,就删除我的帖子【招聘软件测试人员】啊! 请班竹出来澄清一下,我的帖子去哪里了?…

查看全部问答>

导线交叉但是没有点算步算真正连接上??

如论坛上的这个东西....哪个看下…

查看全部问答>

有了纸张电池,无线可以做什么?

    最近一个朋友在研究纸张电池,化学方向的,问我这方面的应用都有哪些,我一时也说不出来,就来问问大家,看有没有这方面的了解,或者是否有已经成型的产品和应用的?…

查看全部问答>

求一个24V转12V的电源电路

求一个24V转12V的电源电路,电流2—3A左右,要求发热量小,干扰小,元件尽量少一些。…

查看全部问答>

关于am2301

各位大侠,请问一下,我参考网上的51单片机的程序,改成了ICCAVR中的程序,但是为什么传感器不送数呢,能否告诉我是哪部分的原因呢?急求!…

查看全部问答>

MSP430G2553 AD转换中1602输出温度

/*1602的RS接P2.0,RW接P2.1,E接P2.27~14的8个引脚接MSP430的P1.0~P1.7,其余按照1602引脚要求连接即可。*/#include<msp430g2553.h>#define uchar unsigned char#define uint unsigned int#define P20&nbs ...…

查看全部问答>

大家的视频主控芯片都在用那个公司的?

视频处理芯片大家都用那个公司的多?价格在多少?…

查看全部问答>