c51电池电量显示

#include <reg52.h>
#include <stdio.h>

#define REF_VOL 3.3   // 参考电压
#define ADC_RES 4096  // ADC分辨率
#define BAT_PIN P1_0  // 电池电压检测引脚
#define LCD_PIN P2    // LCD引脚

sbit RS = P3^5;      // LCD命令/数据选择引脚
sbit EN = P3^6;      // LCD使能引脚

void delay_ms(unsigned int ms)
{
unsigned int i, j;
for(i=0; i<ms; i++)
    for(j=0; j<110; j++);
}

void lcd_write_cmd(unsigned char cmd)
{
RS = 0;     // RS为0表示写命令
LCD_PIN = cmd;
EN = 1;
delay_ms(1);
EN = 0;
}

void lcd_write_data(unsigned char dat)
{
RS = 1;     // RS为1表示写数据
LCD_PIN = dat;
EN = 1;
delay_ms(1);
EN = 0;
}

void lcd_init()
{
lcd_write_cmd(0x38);    // 设置16x2显示,5x7点阵,8位数据接口
lcd_write_cmd(0x0c);    // 打开显示,关闭光标
lcd_write_cmd(0x06);    // 设置字符输入模式,光标右移不移屏
lcd_write_cmd(0x01);    // 清屏
}

void adc_init()
{
P1ASF = 0x01;   // P1.0作为模拟输入
ADC_RES = 4096; // 设置ADC分辨率为12位
}

unsigned int adc_read()
{
unsigned int adc_val;
    ADC_CONTR = 0x84;   // 启动ADC转换,并设置采样时间
while(!(ADC_CONTR & 0x10));  // 等待转换完成
adc_val = ADC_RES;
adc_val |= (unsigned int)ADC_RESL;   // 获取转换结果

return adc_val;
}

void main()
{
unsigned int adc_val, bat_vol;
float bat_per;
char buf[16];

adc_init();
lcd_init();

while(1)
{
    adc_val = adc_read();
    bat_vol = (unsigned int)((float)adc_val / ADC_RES * REF_VOL * 1000);
    bat_per = (float)(bat_vol - 3100) / (4200 - 3100) * 100;
    if(bat_per > 100) bat_per = 100;

    sprintf(buf, "Battery: %.1f%%", bat_per);
    lcd_write_cmd(0x80);    // 第一行显示
    for(i=0; i<16; i++)
        lcd_write_data(buf[i]);

    delay_ms(1000); // 每隔1秒更新一次显示
}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值