找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3286|回复: 0
收起左侧

单片机+pfc8591电压表(可选分压模式)Proteus仿真+代码设计

[复制链接]
ID:443049 发表于 2018-12-10 09:52 | 显示全部楼层 |阅读模式
简易电压表仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png 0.png

使用方法:
打开电路图并运行
按键值1,可进入一倍分压模式
按键值2,可进入2.5倍分压模式
按键值3,可进入10倍分压模式
按键值4,可进入25倍分压模式

(注:最终1602显示的结果是分压后的电压再乘以倍数,也即1602会显示真实的电压值)

单片机源程序如下:
  1. #include <reg52.H>
  2. #include "iic_driver.h"
  3. #include "lcd1602_middle_layer.h"
  4. #include "keypad_driver.h"
  5. #include "tim_1680.h"
  6. #include "main.h"
  7. #include <string.h>  
  8. #include "pfc8591.h"
  9. #include <stdio.h>
  10. void P_Vinit()
  11. {
  12.         P_1 = 1;
  13.         P_2_5 = 1;
  14.         P_10 =1;
  15.         P_25 = 1;
  16.         P_250 = 1;
  17.         P_500 = 1;
  18.         P_1000 = 1;
  19. }
  20. void ChangeV(float *ucData)
  21. {
  22.           if(P_1 == 0 )
  23.                 {
  24.                         *ucData = *ucData;
  25.                 }
  26.                 else if(P_2_5 == 0)
  27.                 {
  28.                         *ucData = (*ucData) * 2.5;
  29.                 }
  30.                 else if(P_10 == 0)
  31.                 {
  32.                         *ucData = (*ucData) * 10;
  33.                 }
  34.                 else if(P_25 == 0)
  35.                 {
  36.                         *ucData = (*ucData) * 25;
  37.                 }
  38.                 else if(P_250 == 0)
  39.                 {
  40.                   *ucData = (*ucData) * 250;
  41.                 }               
  42.                 else if(P_500 == 0)
  43.                 {
  44.                         *ucData = (*ucData) * 500;
  45.                 }               
  46.                 else if(P_1000 == 0)
  47.                 {
  48.             *ucData = (*ucData) * 1000;
  49.                 }       
  50.                 else
  51.                 {
  52.                        
  53.                 }
  54.        
  55. }
  56. void main()
  57. {
  58.   unsigned char i;
  59.         float Vt;
  60.         float ucData;
  61.         char Str[20];
  62.         vTim_Initialization();
  63.         vLCD1602_Initialization();
  64.         P_Vinit();
  65.         P_1 = 0;
  66.         while(1)
  67.         {
  68.                 if(ucKeyData_main <= '9' && ucKeyData_main >= '0')
  69.                 {
  70.                         switch(ucKeyData_main)
  71.                         {
  72.                                 case '1': P_Vinit();P_1 = 0;  break;
  73.                                 case '2': P_Vinit();P_2_5 = 0;break;
  74.                                 case '3': P_Vinit();P_10 = 0;break;
  75.                                 case '4': P_Vinit();P_25 = 0;break;
  76.                                 case '5': P_Vinit();P_250 = 0;break;
  77.                                 case '6': P_Vinit();P_500 = 0;break;
  78.                                 case '7': P_Vinit();P_1000 =0;break;
  79.                                 default:break;
  80.                         }
  81.                         while(ucKeyData_main != NOKEYDATA);
  82.                 }
  83.                
  84.                 ucData = ucReadADC(CHL);
  85.                 ChangeV(&ucData);

  86.                 Vt = ((float)ucData/255)*5;

  87.                 sprintf(Str,"% 16d",(int)ucData);
  88.                 vLCD1602_write_string(0,0,Str);
  89.                 sprintf(Str,"% 15gV",Vt);
  90.                 vLCD1602_write_string(0,1,Str);
  91.                
  92.         }
  93. }
复制代码

所有资料51hei提供下载:
简易电压表设计.rar (165.55 KB, 下载次数: 35)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表