历史上的今天
今天是: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 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 //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; //返回电压数字量 }
上一篇:单片机双机串口通信原理图
史海拾趣
|
1 引言 随着航天技术和集成电路设计、制造技术的快速发展,越来越多的超大规模集成电路被应用到各类航天器和卫星的通讯和控制系统中。CMOS电路由于具有低功耗、宽电源电压范围和输出摆幅大、抗干扰能力强、集成度高、工艺成熟以及成本相对较 ...… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:56 编辑 描述:把Flash放在焊盘上面 图片: 描述:方法一:焊盘和引脚都要上好锡,将烙铁上的锡清理干净,焊接的时候,除了将引脚上的焊锡加热熔化外,还要用力压将底板的焊锡也熔化,同时还要往外 ...… 查看全部问答> |
|
最近一个朋友在研究纸张电池,化学方向的,问我这方面的应用都有哪些,我一时也说不出来,就来问问大家,看有没有这方面的了解,或者是否有已经成型的产品和应用的?… 查看全部问答> |
|
/*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 ...… 查看全部问答> |




