_白也 2023-04-10 19:13 采纳率: 50%
浏览 67
已结题

蓝桥杯单片机读取外部电压

请问我想用蓝桥杯的单片机读取外部输入的电压,应该怎么做呢(不是读取光敏和电位器的电压,就是AIN0输入的外部电压),比如我有一个电池,该怎么通过AIN0读取其电压,请给出电路接法和代码

  • 写回答

8条回答 默认 最新

  • Zyb0627 2023-04-10 22:49
    关注

    引用chatGPT作答,要使用蓝桥杯单片机读取外部输入的电压,需要将外部电压接到单片机的模拟输入端口,通常是AIN0。下面是一个简单的电路接法和代码示例。

    电路接法:
    将待测电压接到单片机的AIN0输入引脚上,同时要将其它引脚分别接好。

    代码示例:
    这是一个使用C语言编写的简单程序,它会读取AIN0输入端口上的电压,并将其显示在LCD屏幕上。请注意,此代码示例仅供参考,具体实现可能需要进行适当的修改以适应您的具体情况。

    #include <reg52.h>
    #include <intrins.h>
    
    sbit LCD_RS = P2^6;     //LCD1602控制端口定义
    sbit LCD_RW = P2^5;
    sbit LCD_EN = P2^7;
    sbit LCD_D4 = P0^0;
    sbit LCD_D5 = P0^1;
    sbit LCD_D6 = P0^2;
    sbit LCD_D7 = P0^3;
    
    void Delay1ms()     //延时函数
    {
        unsigned char a,b;
        for(b=2;b>0;b--)
            for(a=246;a>0;a--);
    }
    
    void LCD_Write_Cmd(unsigned char cmd)     //写指令
    {
        LCD_RS = 0;
        LCD_RW = 0;
        LCD_EN = 1;
        LCD_D7 = cmd & 0x80;
        LCD_D6 = cmd & 0x40;
        LCD_D5 = cmd & 0x20;
        LCD_D4 = cmd & 0x10;
        Delay1ms();
        LCD_EN = 0;
        Delay1ms();
        LCD_EN = 1;
        LCD_D7 = cmd & 0x08;
        LCD_D6 = cmd & 0x04;
        LCD_D5 = cmd & 0x02;
        LCD_D4 = cmd & 0x01;
        Delay1ms();
        LCD_EN = 0;
        Delay1ms();
    }
    
    void LCD_Write_Data(unsigned char dat)     //写数据
    {
        LCD_RS = 1;
        LCD_RW = 0;
        LCD_EN = 1;
        LCD_D7 = dat & 0x80;
        LCD_D6 = dat & 0x40;
        LCD_D5 = dat & 0x20;
        LCD_D4 = dat & 0x10;
        Delay1ms();
        LCD_EN = 0;
        Delay1ms();
        LCD_EN = 1;
        LCD_D7 = dat & 0x08;
        LCD_D6 = dat & 0x04;
        LCD_D5 = dat & 0x02;
        LCD_D4 = dat & 0x01;
        Delay1ms();
        LCD_EN = 0;
        Delay1ms();
    }
    
    void LCD_Init()     //LCD1602初始化
    {
        LCD_Write_Cmd(0x38);
        LCD_Write_Cmd(0x08);
        LCD_Write_Cmd(0x01);
        LCD_Write_Cmd(0x06);
        LCD_Write_Cmd(0x0c);
    }
    
    void main()
    {
        unsigned char a, b;
        unsigned int vol;
        char str[17];
    
        TMOD = 0x01;
        TH0 = 0;      //计时器0初始化
        TL0 = 0;
        TR0 = 1;
        LCD_Init();    //LCD1602初始化
    
        while(1)
        {
            ADC_CONTR = 0x80;    //启动ADC转换
            while(!ADC_CONTR & 0x20);    //等待转换完成
            ADC_CONTR &= ~0x20;    //清除ADC转换完成标志位
            vol = ADC_RES;    //读取转换结果
    
            vol = vol * 0.00488;   //计算电压值
    
            sprintf(str, "Voltage: %dmV", vol);    //格式化输出
            for(a = 0; a < 16; a++)
            {
                LCD_Write_Cmd(0x80 + a);   //在第一行显示
                LCD_Write_Data(str[a]);
            }
    
            for(b = 0; b < 16; b++)
            {
                LCD_Write_Cmd(0xc0 + b);    //在第二行显示
                LCD_Write_Data(str[a + b]);
            }
        }
    }
    
    

    该程序中使用了定时器0来进行ADC转换的间隔控制,ADC_RES用于存储ADC转换结果。ADC转换后通过计算转换值来得出对应电压值,并使用sprintf函数进行格式化输出,最终将结果显示在LCD上。请注意,程序中的计算电压值的代码需要根据具体硬件电路进行修改。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 4月19日
  • 已采纳回答 4月11日
  • 修改了问题 4月10日
  • 赞助了问题酬金15元 4月10日
  • 展开全部

悬赏问题

  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计