本帖最后由 芯圣电子官方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函数我没加比较函数,可以自己添加,发挥自己想象力。
效果图
|