冯:
参考,别人的别人的,参考链接:参考链接

效果图:

思:
这块简单易制作的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制作简易的电压表相关推荐

  1. 怎么用python自制计算公式_手把手教你用python制作简易计算器,能够记录你使用的情况...

    话不多说,首先先看效果图,它能够记录你在使用过程中的历史,方便你查看是否有错: 接下来就仔细分析一下是如何制作的: 简易计算器 第一步:导入资源库 在过程中使用到了tkinter这个资源库,win+R ...

  2. 利用Unity3D制作简易2D计算器

    利用Unity3D制作简易2D计算器 标签(空格分隔): uiniy3D 1. 操作流程 在unity3DD中创建一个新项目 注意选择是2D的(因为默认3D) 在Assets框右键新建C#脚本 在新建 ...

  3. html range关联文本框,HTML5gt;meter标签与input(type=range)标签结合制作简易范围指示器...

    HTML5>meter标签与input(type=range)标签结合制作简易范围指示器 发布时间:2020-03-26 15:41 很多时候我们能看到这样的表示范围的优化工具,能给人带来很好的 ...

  4. SwiftUI优秀文章经典案例制作简易的新闻列表Demo

    SwiftUI制作简易的新闻列表Demo import SwiftUIstruct HomeView: View {@StateObject var newsViewModelVM = NewsVie ...

  5. python注册系统_Python制作简易注册登录系统

    Python制作简易注册登录系统 这篇文章主要为大家详细介绍了 Python 简易注册登录系统的制作方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 Python 是一种面向对象.解释型计算机程 ...

  6. python random.random 缩短小数点儿后位数_Python random模块制作简易的四位数验证码...

    先给大家介绍下python中random模块 random与numpy.random对比: 1.random.random():生成[0,1)之间的随机浮点数: numpy.random.random ...

  7. Luat Inside | 致敬经典,使用Air724UG制作简易贪吃蛇

    作者简介: 打盹的消防车--活跃于Luat社群的新生代全能开发者,东北小伙儿爽朗幽默.好学敏思,更是实力行动派.幼年曾手握火红炽铁而后全然无恙,堪称魔幻经历:如今热衷于各类嵌入式软硬件研究,快意物联江 ...

  8. 用VC++6.0制作简易浏览器

    很好的一个VC++6.0制作简易浏览器,对初学者来说有很大的帮助,但是我在最后遇到点问题,如果有问题请连接http://blog.csdn.net/u013675958/article/details ...

  9. Unity - 使用Winform制作简易登录器

    Unity - 使用Winform制作简易登录器 Resolution Dialog PC.Mac环境下,Unity提供了一个简易的设置分辨率.图形性能的对话框,叫Resolution Dialog, ...

最新文章

  1. Ajax---使用json数据格式输出数据
  2. 【搜索引擎】lucene事务
  3. 【计算机网络】FDM和TDM的传输总时间计算
  4. python 有限域函数库_深入比特币之有限域运算
  5. C++之String的find方法,查找一个字符串在另一个字符串的什么位置;leveldb字符串转数字解析办法...
  6. itsdangerous
  7. 008-对象—— 对象$this self parent 内存方式及使用方法讲解
  8. 《python学习手册》目录
  9. 蓝牙芯片 csr8645 和 qcc3005 哪个比较
  10. 如何用PS把背景完全扣掉,变成透明
  11. BT.656标准简介
  12. 消消乐游戏算法实现(三消乐)
  13. 双色OLED屏图片点阵转换工具(OledTools)
  14. 工作日志,常见的统计解决方案
  15. git把一个分支的commit merge到另外一个分支
  16. 「技术人生」第7篇:从业务视角谈信息技术与业务的关系
  17. 各证件号码(身份证、护照、军官证、驾驶证、港澳台湾通行证、户口簿)正则表达式校验 完整正确
  18. 一句话解决汉诺塔(C语言递归)每日一练
  19. 微信付费群如何创建?如何搭建教程九块九源码?
  20. arthas-dashboard

热门文章

  1. 【通信原理| OFDM技术的最简讲解(下)】DFT 与 OFDM
  2. NPU架构分析与应用
  3. 亿智科技获北极光创投数千万天使轮投资,北极光创投领投
  4. AI CC 2018安装破解详细教程
  5. 再见 ! 公司的( )系统 ~ 网友:好想给大神当小弟...
  6. EXCEL表格下拉框设置
  7. HarmonyOS(鸿蒙系统)物联网开发教程——环境搭建
  8. 【集成学习】boosting和bagging
  9. 计算机在财务会计中的应用浅论,浅析excel在会计中的应用(实际应用版).pdf
  10. Linux查看CPU和内存使用情况(ps、free、htop、atop、nmon、/proc/meminfo等)