简易电压表仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
使用方法:
打开电路图并运行
按键值1,可进入一倍分压模式
按键值2,可进入2.5倍分压模式
按键值3,可进入10倍分压模式
按键值4,可进入25倍分压模式
(注:最终1602显示的结果是分压后的电压再乘以倍数,也即1602会显示真实的电压值)
单片机源程序如下:
- #include <reg52.H>
- #include "iic_driver.h"
- #include "lcd1602_middle_layer.h"
- #include "keypad_driver.h"
- #include "tim_1680.h"
- #include "main.h"
- #include <string.h>
- #include "pfc8591.h"
- #include <stdio.h>
- void P_Vinit()
- {
- P_1 = 1;
- P_2_5 = 1;
- P_10 =1;
- P_25 = 1;
- P_250 = 1;
- P_500 = 1;
- P_1000 = 1;
- }
- void ChangeV(float *ucData)
- {
- if(P_1 == 0 )
- {
- *ucData = *ucData;
- }
- else if(P_2_5 == 0)
- {
- *ucData = (*ucData) * 2.5;
- }
- else if(P_10 == 0)
- {
- *ucData = (*ucData) * 10;
- }
- else if(P_25 == 0)
- {
- *ucData = (*ucData) * 25;
- }
- else if(P_250 == 0)
- {
- *ucData = (*ucData) * 250;
- }
- else if(P_500 == 0)
- {
- *ucData = (*ucData) * 500;
- }
- else if(P_1000 == 0)
- {
- *ucData = (*ucData) * 1000;
- }
- else
- {
-
- }
-
- }
- void main()
- {
- unsigned char i;
- float Vt;
- float ucData;
- char Str[20];
- vTim_Initialization();
- vLCD1602_Initialization();
- P_Vinit();
- P_1 = 0;
- while(1)
- {
- if(ucKeyData_main <= '9' && ucKeyData_main >= '0')
- {
- switch(ucKeyData_main)
- {
- case '1': P_Vinit();P_1 = 0; break;
- case '2': P_Vinit();P_2_5 = 0;break;
- case '3': P_Vinit();P_10 = 0;break;
- case '4': P_Vinit();P_25 = 0;break;
- case '5': P_Vinit();P_250 = 0;break;
- case '6': P_Vinit();P_500 = 0;break;
- case '7': P_Vinit();P_1000 =0;break;
- default:break;
- }
- while(ucKeyData_main != NOKEYDATA);
- }
-
- ucData = ucReadADC(CHL);
- ChangeV(&ucData);
- Vt = ((float)ucData/255)*5;
- sprintf(Str,"% 16d",(int)ucData);
- vLCD1602_write_string(0,0,Str);
- sprintf(Str,"% 15gV",Vt);
- vLCD1602_write_string(0,1,Str);
-
- }
- }
复制代码
所有资料51hei提供下载:
简易电压表设计.rar
(165.55 KB, 下载次数: 35)
|