STC15F2K60S2制作简易的电压表
冯:
参考,别人的别人的,参考链接:参考链接
效果图:
思:
这块简单易制作的0-30V,STC单片机数字电压表,被测电压经限流电阻接到AD检测端并由分流电阻分流,读出8位、2的8次方(256)的AD数据,由AD值计算出AD端电压,即分流点电压,由此电压计算出分流电流,再由此电流计算出输入电压。
如图:(参考链接中的)(链接中的图形,有个电容,可以起到很好的作用)
使用STC15F2K60s2AD单片机,P1段输出加限流电阻,AD为8位,计算方法:5/256=0.0195312V,分流电阻为实测阻值。AD值0.0195312v/对地分流电阻,算出分流电流,然后用分流电流分流电阻与限流电阻之和即为要显示的输入电压值,业余使用,精度已经够用了。
或者可以直接接分压电阻,但是如果是空载的话,就会有些问题。
如图:
当直接接电阻时:(我使用的是STC15F2K系列,是10位AD,但是只用到8位而已,即用高八位,低二位不用)
电压=(5/256=0.019532)*AD值
电流=……
原理图:(15大多系列可以不用晶振,也可以用晶振)
其中:
官方推荐电路:
主函数:
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15F4K60S4 系列 AD转换查询方式举例----------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.GXWMCU.com --------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
//若无特别说明,工作频率一般为11.0592MHz
#include "reg51.h"
#include "intrins.h"#define FOSC 11059200L//晶振大小
#define BAUD 115200//波特率typedef unsigned char BYTE; //重命名 unsigned char 为 BYTE
typedef unsigned int WORD; //重命名 unsigned int 为 WORD#define URMD 0 //0:使用定时器2作为波特率发生器//WORD data dis[5]={0x00,0x00,0x00,0x00,0x00};
WORD ad_data;//记录AD值
float j=0.0;//计算电压值
int sum=0;//将浮点电压值装换成int型//74HC595IO口定义
sbit SRCLK=P2^2;
sbit Rclk=P2^1;
sbit SER=P2^0;//数码管IO口(使用的是共阴)
sbit SMG1=P2^3;
sbit SMG2=P2^4;
sbit SMG3=P2^5;
sbit SMG4=P2^6;//数码管共阴码表
char code smgduan[17]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};//显示0~F的值char Data[4]={0};//记录电压的4位数(Data【0】=高位依次)sfr T2H = 0xd6; //定时器2高8位
sfr T2L = 0xd7; //定时器2低8位sfr AUXR = 0x8e; //辅助寄存器 sfr ADC_CONTR = 0xBC; //ADC控制寄存器
sfr ADC_RES = 0xBD; //ADC高8位结果
sfr ADC_LOW2 = 0xBE; //ADC低2位结果
sfr P1ASF = 0x9D; //P1口第2功能控制寄存器#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟
#define ADC_SPEEDL 0x20 //360个时钟
#define ADC_SPEEDH 0x40 //180个时钟
#define ADC_SPEEDHH 0x60 //90个时钟void InitUart();//串口初始化
void InitADC();//AD初始化
void SendData(BYTE dat);//串发送数据
BYTE GetADCResult(BYTE ch);//获取AD值
void Delay(WORD n);//延时
void ShowResult(BYTE ch);//使用AD中的某一个输入口可以是0~7
void Hc595SendByte(char dat);//void DigDisplay()//显示数据
{char i;for(i=0; i<4; i++){switch(i) //位选,选择点亮的数码管,{case 0://Data【0】SMG1=0;SMG2=1;SMG3=1;SMG4=1;break;case 1://Data【1】SMG1=1;SMG2=0;SMG3=1;SMG4=1;break;case 2://Data【2】SMG1=1;SMG2=1;SMG3=0;SMG4=1;break;case 3://Data【3】SMG1=1;SMG2=1;SMG3=1;SMG4=0;break;}if(i==1){Hc595SendByte(smgduan[Data[i]]|0x80);//第二个数码管加点(.)}else{Hc595SendByte(smgduan[Data[i]]);//发送段码 }Delay(100);Hc595SendByte(0x00);//消影Delay(100);//这里的延时不要太久}
}void main()
{SMG1=0;SMG2=0;SMG3=0;SMG4=0;//初始化数码管四位都开启InitUart(); //初始化串口InitADC(); //初始化ADCwhile (1){char i=0;Delay(100);ShowResult(2); //显示通道3DigDisplay();}
}
/*----------------------------
发送ADC结果到PC
----------------------------*/
void ShowResult(BYTE ch)//数据处理
{SendData(ch); //显示通道号
// SendData(GetADCResult(ch));
// Delay(10000);
// Delay(10000);ad_data=GetADCResult(ch);j=ad_data*19.5312;//由AD数据*19.5312(放大1000倍)=分流后的电压j=j/9890; //j(电压)/接地电阻(实测)9890欧j=j*60190;//j(电流)*(输入限流电阻(实测)60190欧+接地电阻(实测)9890欧) 计算出实际输入电压 如果使用高精度电阻,则直接输入电阻值//SendData(j);sum=j;// Data[0]=sum/10000%10;//(这里是直接接负载电阻的测量电压方法)
// Data[1]=sum/1000%10;
// Data[2]=sum/100%10;
// Data[3]=sum/10%10;Data[0]=sum/10000%10;//十位Data[1]=sum/1000%10;//个位Data[2]=sum/100%10;//十分位Data[3]=sum/10%10;//百分位
}
/*----------------------------
读取ADC结果
----------------------------*/
BYTE GetADCResult(BYTE ch)
{ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;_nop_(); //等待4个NOP_nop_();_nop_();_nop_();while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成ADC_CONTR &= ~ADC_FLAG; //Close ADCreturn ADC_RES; //返回ADC结果
}/*----------------------------
初始化串口
----------------------------*/
void InitUart()
{SCON = 0x5a; //设置串口为8位可变波特率
#if URMD == 0T2L = (65536 - (FOSC/4/BAUD));T2H = (65536 - (FOSC/4/BAUD)) >> 8;AUXR = 0x14; //T2为1T模式, 并启动定时器2AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
#elif URMD == 1AUXR = 0x40; //定时器1为1T模式TMOD = 0x00; //定时器1为模式0(16位自动重载)TL1 = (65536 - (FOSC/4/BAUD));TH1 = (65536 - (FOSC/4/BAUD)) >> 8;TR1 = 1; //定时器1开始启动
#elseTMOD = 0x20; //设置定时器1为8位自动重装载模式AUXR = 0x40; //定时器1为1T模式TH1 = TL1 = (256 - (FOSC/32/BAUD));TR1 = 1;
#endif
}/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{P1ASF = 0xff; //设置P1口为AD口ADC_RES = 0; //清除结果寄存器ADC_CONTR = ADC_POWER | ADC_SPEEDLL;Delay(2); //ADC上电并延时
}/*----------------------------
发送串口数据
----------------------------*/
void SendData(BYTE dat)
{while (!TI); //等待前一个数据发送完成TI = 0; //清除发送标志SBUF = dat; //发送当前数据
}/*----------------------------
软件延时
----------------------------*/
void Delay(WORD n)
{WORD x;while (n--){x = 10;while (x--);}
}void Hc595SendByte(char dat)
{char a;SRCLK = 1;Rclk = 1;for(a=0; a<8; a++) //发送8位数{SER = dat >> 7; //从最高位开始发送dat <<= 1;SRCLK = 0; //发送时序_nop_();_nop_();SRCLK = 1;}Rclk = 0;_nop_();_nop_();Rclk = 1;
}
其实AD的检测的程序是参考了官方的。配置在如下图中参考:
大致就是这样:最后是Keil的一张图:
结语:由于本人技术有限,难免会有错误的地方,如有错误,还望大家多多指教v.
感谢:怡
作者:杏林洁白
STC15F2K60S2制作简易的电压表相关推荐
- 怎么用python自制计算公式_手把手教你用python制作简易计算器,能够记录你使用的情况...
话不多说,首先先看效果图,它能够记录你在使用过程中的历史,方便你查看是否有错: 接下来就仔细分析一下是如何制作的: 简易计算器 第一步:导入资源库 在过程中使用到了tkinter这个资源库,win+R ...
- 利用Unity3D制作简易2D计算器
利用Unity3D制作简易2D计算器 标签(空格分隔): uiniy3D 1. 操作流程 在unity3DD中创建一个新项目 注意选择是2D的(因为默认3D) 在Assets框右键新建C#脚本 在新建 ...
- html range关联文本框,HTML5gt;meter标签与input(type=range)标签结合制作简易范围指示器...
HTML5>meter标签与input(type=range)标签结合制作简易范围指示器 发布时间:2020-03-26 15:41 很多时候我们能看到这样的表示范围的优化工具,能给人带来很好的 ...
- SwiftUI优秀文章经典案例制作简易的新闻列表Demo
SwiftUI制作简易的新闻列表Demo import SwiftUIstruct HomeView: View {@StateObject var newsViewModelVM = NewsVie ...
- python注册系统_Python制作简易注册登录系统
Python制作简易注册登录系统 这篇文章主要为大家详细介绍了 Python 简易注册登录系统的制作方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 Python 是一种面向对象.解释型计算机程 ...
- python random.random 缩短小数点儿后位数_Python random模块制作简易的四位数验证码...
先给大家介绍下python中random模块 random与numpy.random对比: 1.random.random():生成[0,1)之间的随机浮点数: numpy.random.random ...
- Luat Inside | 致敬经典,使用Air724UG制作简易贪吃蛇
作者简介: 打盹的消防车--活跃于Luat社群的新生代全能开发者,东北小伙儿爽朗幽默.好学敏思,更是实力行动派.幼年曾手握火红炽铁而后全然无恙,堪称魔幻经历:如今热衷于各类嵌入式软硬件研究,快意物联江 ...
- 用VC++6.0制作简易浏览器
很好的一个VC++6.0制作简易浏览器,对初学者来说有很大的帮助,但是我在最后遇到点问题,如果有问题请连接http://blog.csdn.net/u013675958/article/details ...
- Unity - 使用Winform制作简易登录器
Unity - 使用Winform制作简易登录器 Resolution Dialog PC.Mac环境下,Unity提供了一个简易的设置分辨率.图形性能的对话框,叫Resolution Dialog, ...
最新文章
- Ajax---使用json数据格式输出数据
- 【搜索引擎】lucene事务
- 【计算机网络】FDM和TDM的传输总时间计算
- python 有限域函数库_深入比特币之有限域运算
- C++之String的find方法,查找一个字符串在另一个字符串的什么位置;leveldb字符串转数字解析办法...
- itsdangerous
- 008-对象—— 对象$this self parent 内存方式及使用方法讲解
- 《python学习手册》目录
- 蓝牙芯片 csr8645 和 qcc3005 哪个比较
- 如何用PS把背景完全扣掉,变成透明
- BT.656标准简介
- 消消乐游戏算法实现(三消乐)
- 双色OLED屏图片点阵转换工具(OledTools)
- 工作日志,常见的统计解决方案
- git把一个分支的commit merge到另外一个分支
- 「技术人生」第7篇:从业务视角谈信息技术与业务的关系
- 各证件号码(身份证、护照、军官证、驾驶证、港澳台湾通行证、户口簿)正则表达式校验 完整正确
- 一句话解决汉诺塔(C语言递归)每日一练
- 微信付费群如何创建?如何搭建教程九块九源码?
- arthas-dashboard
热门文章
- 【通信原理| OFDM技术的最简讲解(下)】DFT 与 OFDM
- NPU架构分析与应用
- 亿智科技获北极光创投数千万天使轮投资,北极光创投领投
- AI CC 2018安装破解详细教程
- 再见 ! 公司的( )系统 ~ 网友:好想给大神当小弟...
- EXCEL表格下拉框设置
- HarmonyOS(鸿蒙系统)物联网开发教程——环境搭建
- 【集成学习】boosting和bagging
- 计算机在财务会计中的应用浅论,浅析excel在会计中的应用(实际应用版).pdf
- Linux查看CPU和内存使用情况(ps、free、htop、atop、nmon、/proc/meminfo等)