打印
[通用8051核FLASH系列]

HC89S003F4水位测量,串口打印

[复制链接]
1284|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 芯圣电子官方QQ 于 2023-7-20 11:20 编辑

又来了,上一篇还没完,这一篇又开始了


今天讲讲水位那些事说白了就是ADC获得数值,MCU判断相应数值属于什么水位,就这么简单!原理图的话我没有学过就是大家可以搜索一下太阳能热水器水位测点原理图
不多说上代码!




ADC.C
#include "adc.h"

void adc_init(void)
{
                /************************************ADC初始化*****************************************/
                P0M0 = P0M0&0x0F|0x30;                //P01设置为模拟输入
                ADCC0 = 0x80;                                                  //打开ADC转换电源
                Delay_2us(10);                                                 //延时20us,确保ADC系统稳定
                ADCC1 = 0x01;                                                  //选择外部通道1
                ADCC2 = 0x4D;                                                  //转换结果12位数据,数据右对齐,ADC时钟16分频
}

int gADC_ch(void)
{
                  ADCC0 |= 0x40;                                        //启动ADC转换
                while(!(ADCC0&0x20));                //等待ADC转换结束
                ADCC0 &=~ 0x20;                                        //清除标志位
          return ADCR;
}
adc.h
#ifndef __ADC_H_
#define __ADC_H_

#include "HC89S003F4.h"
#include "delay.h"

void adc_init(void);
int gADC_ch(void);

#endif
delay.c
#include "delay.h"

void Delay_2us(unsigned int fui_i)
{
        while(fui_i--);        
}

void Delay_ms(unsigned int fui_i)
{
        unsigned int fui_j;
        for(;fui_i > 0;fui_i --)
        for(fui_j = 1596;fui_j > 0;fui_j --);
}
delay.h
#ifndef __DELAY_H_
#define __DELAY_H_

void Delay_2us(unsigned int fui_i);
void Delay_ms(unsigned int fui_i);

#endif
sys.c
#include "sys.h"

void system_init(void)
{
                WDTCCR = 0x00; //关闭看门狗

                while((CLKCON&0x20)!=0x20); //等待内部高频晶振起振
                CLKDIV = 0x02; //CPU时钟2分频,确保在进行RC32分频时CPU时钟小于20M
                CLKSWR = 0x51; //选择内部高频时钟为主时钟,且内部高频RC2分频
                while((CLKSWR&0xC0)!=0x40); //等待内部高频切换完成
                CLKDIV = 0x00; //CPU时钟4分频

}
sys.h
#ifndef __SYS_H_
#define __SYS_H_


#include "HC89S003F4.h"


void system_init(void);

#endif
uart.c
#include "uart.h"

/**********************************************************************/
//*串口1初始化函数,对HC89S003的两个串口进行初始化和波特率设置
//*参数:baud-1200,2400,4800,9600,19200,57600
//*无返回值
/**********************************************************************/

void UART_Init(u16 baud)
{
        /**********************************UART配置初始化**************************************/
        P2M0 = P2M0&0x0F|0x80;                                //P21设置为推挽输出
        P0M1 = P0M1&0x0F|0x20;                                //P03设置为上拉输入

        TXD_MAP = 0x21;                                                //TXD映射P21
        RXD_MAP = 0x03;                                                //RXD映射P03               
        T4CON = 0x06;                                                //T4工作模式:UART1波特率发生器
        TH4 = (65536 - (1000000/baud))>>8;
        TL4 = (65536 - (1000000/baud));                                                //波特率9600
        SCON2 = 0x02;                                                //8位UART,波特率可变
        SCON = 0x10;                                                //允许串行接收
        IE |= 0X10;                                                        //使能串口中断
        
        EA = 1;
        TI = 1;        //使用printf需要发送标志位TI=1;
}

void UART_Send(u8 buf)
{
                IE &=~ 0x10; //失能UART1中断
                SBUF = buf;
                while(!(SCON & 0x02));
                SCON &=~ 0x02; //清除发送中断标志位
                IE |= 0x10;  //UART1中断使能
                SCON |= 0x10; //UART1接收使能
}

void UART_Sends(u8 *buf)
{
                        while(*buf)
                        {
                                                UART_Send(*buf++);
                        }
}

//重定向putchar函数
char putchar(char c)
{
        UART_Send(c);
        return c;
}

uart.h
#ifndef __UART_H_
#define __UART_H_

#include "HC89S003F4.h"

void UART_Init(u16 baud);
void UART_Send(u8 buf);
void UART_Sends(u8 *buf);

#endif
main.c
#define        ALLOCATE_EXTERN
#include "sys.h"
#include "stdio.h"
#include "delay.h"
#include "uart.h"
#include "adc.h"


unsigned int gui_AdcValue = 0;//用于存放ADC的值

/***************************************************************************************
  * @实现效果        对P00口的ADC通道0进行AD转换,串口显示
***************************************************************************************/
void main()
{
                system_init();
          UART_Init(9600);
                adc_init();

                while(1)
                {
                                gui_AdcValue = gADC_ch();                 //获取ADC的值

                          printf("ADC:%d\n",gui_AdcValue);//通过printf打印获取到的ADC数值
                          UART_Sends("abcdefg");

                                Delay_ms(500);
                }
}

main函数我没加比较函数,可以自己添加,发挥自己想象力。
效果图

]YRD7~2T2HP1%QS5E06O%JQ.png (48.14 KB )

]YRD7~2T2HP1%QS5E06O%JQ.png

使用特权

评论回复
沙发
jiaisr123|  楼主 | 2020-3-8 08:34 | 只看该作者
自己沙发吧

使用特权

评论回复
板凳
598330983| | 2020-3-19 17:58 | 只看该作者
代码漂亮。

使用特权

评论回复
地板
wanduzi| | 2020-3-24 16:24 | 只看该作者
操作很棒,水位传感器是专门买的?

使用特权

评论回复
5
jiaisr123|  楼主 | 2020-3-24 18:48 | 只看该作者
本帖最后由 jiaisr123 于 2020-3-24 18:49 编辑
wanduzi 发表于 2020-3-24 16:24
操作很棒,水位传感器是专门买的?

自己做也可以,原理也很简单。纯水不导电,但是生活水不是纯水,这样就可以把几个电阻串起来。水位越高电阻被短路的就越多,跟第一个电阻的比值就越小,分到的电压就越小,相反第一个电阻电压越高。ADC值就越高

QQ截图20200324184509.png (60.04 KB )

QQ截图20200324184509.png

使用特权

评论回复
6
天灵灵地灵灵| | 2020-3-24 19:32 | 只看该作者
理论如此,水里面的盐分越多是不是电阻越小。

使用特权

评论回复
7
jiaisr123|  楼主 | 2020-3-24 21:04 | 只看该作者
天灵灵地灵灵 发表于 2020-3-24 19:32
理论如此,水里面的盐分越多是不是电阻越小。

你说得对,各种盐类在水里面是离子的形式存在,有电压的话,就会形成电流,这就是所谓的导电

使用特权

评论回复
8
jiaisr123|  楼主 | 2020-3-24 21:05 | 只看该作者
jiaisr123 发表于 2020-3-24 21:04
你说得对,各种盐类在水里面是离子的形式存在,有电压的话,就会形成电流,这就是所谓的导电 ...

凡事都有绝对,一瓶盐放一滴水,它就不导电了

使用特权

评论回复
9
1123506| | 2022-3-18 14:43 | 只看该作者
芯圣一级代理商 出芯圣ic  价格优势  需要联系企鹅号  2914373240

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

33

帖子

0

粉丝