本帖最后由 芯圣电子官方QQ 于 2023-7-24 14:22 编辑
SDK-HC89F0541
HC89F0541/0531 是一颗增强型 8 位单片机:
32K FLASH ,256 Bytes IRAM 和1K Bytes XRAM
30 I/O ,5*16 bit定时器/计数器 3 *12bit驱动型 PWM
1 * 8bit PWM,2 UART,1 SPI,1 IIC
26 ExTi
2+16ch12bit ADC - VREF 2V/3V/4V可选宽电压输入 2.0V-5.5V
温度范围-40°C-+85°C
LQFP32封装
具有紧凑结构低功耗和较高性能等特点:
#define ALLOCATE_EXTERN
#include "HC89F0541.h"
#include "string.h"
void Delay_2us(unsigned int fui_i); //延时函数
unsigned int gui_AdcValue = 0; //用于计算ADC的值
unsigned char guc_AdcBufCount = 0; //ADC缓存数量计数
unsigned int gui_AdcValueBuf[8] = {0x00};//用于存放ADC缓存值
unsigned char guc_i = 0; //计算缓存值计数
unsigned char guc_AdcFlag = 0; //ADC转换完成标志位
/***************************************************************************************
* @实现效果 对P24口的ADC通道12进行AD转换
***************************************************************************************/
void main()
{
/************************************系统初始化****************************************/
CLKSWR = 0x51; //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
CLKDIV = 0x01; //Fosc 1分频得到Fcpu,Fcpu=16MHz
/**********************************相关配置初始化**************************************/
P1M4 = 0xC2; //P03设置为推挽输出
/************************************ADC初始化*****************************************/
P2M4 = 0x02; //P24设置为模拟输入
ADCC0 = 0x80; //打开ADC转换电源
Delay_2us(10); //延时20us,确保ADC系统稳定
ADCC1 = 0x0C; //选择外部通道12
ADCC2 = 0x4B; //转换结果12位数据,数据右对齐,ADC时钟16分频
SCANCON = 0x6F; //单通道带缓存连续模式,扫描8次
IE1 |= 0x40; //打开ADC中断
EA = 1; //打开总中断
ADCC0 |= 0x40; //启动ADC转换
while(1)
{
if(guc_AdcFlag==1) //ADC转换结束
{
gui_AdcValueBuf[0] = SCR0;
gui_AdcValueBuf[1] = SCR1;
gui_AdcValueBuf[2] = SCR2;
gui_AdcValueBuf[3] = SCR3;
gui_AdcValueBuf[4] = SCR4;
gui_AdcValueBuf[5] = SCR5;
gui_AdcValueBuf[6] = SCR6;
gui_AdcValueBuf[7] = SCR7;
for(guc_i=0;guc_i<8;guc_i++)
{
gui_AdcValue+=gui_AdcValueBuf[guc_i];
}
gui_AdcValue /= 8; //计算平均值
if(gui_AdcValue <= 0x10){P1_4 = 1;}
else {P1_4 = 0;}
guc_AdcFlag = 0; //标志位清0
guc_AdcBufCount = 0; //计数值清0
memset(gui_AdcValueBuf,0,10);//清空缓存Buf
IE1 |= 0x40; //打开ADC中断
}
}
}
/***************************************************************************************
* @说明 ADC中断服务函数
* @参数 无
* @返回值 无
* @注 无
***************************************************************************************/
void ADC_Rpt() interrupt ADC_VECTOR
{
guc_AdcFlag = 1;
IE1 &=~ 0x40; //关闭ADC中断
ADCC0 &=~ 0x20; //清除ADC中断标志位
}
/**
* @说明 延时函数
* @参数 fui_i : 延时时间
* @返回值 无
* @注 Fcpu = 16MHz,fui_i = 1时,延时时间约为2us
*/
void Delay_2us(unsigned int fui_i)
{
while(fui_i--);
}
测试为V (p2_4)>16*5/4096 时P1_4低电位V (p2_4)<16*5/4096 时P1_4变高电位
多通道模式:
P0_0低于5*5/4096 P1_4输出低电平
#define ALLOCATE_EXTERN
#include "HC89F0541.h"
#include "string.h"
void Delay_2us(unsigned int fui_i); //延时函数
#define LED1 P1_4 //LED1端口
#define LED2 P1_5 //LED2端口
unsigned int gui_AdcValueBuf_a[2] = {0x00};//用于存放ADC的值
unsigned char guc_AdcChannelCount = 0; //ADC通道切换
unsigned char guc_AdcFlag = 0; //ADC转换完成标志位
/***************************************************************************************
* @实现效果 对P00和P01口的ADC通道0和1进行AD转换
***************************************************************************************/
void main()
{
/************************************系统初始化****************************************/
CLKSWR = 0x51; //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
CLKDIV = 0x01; //Fosc 1分频得到Fcpu,Fcpu=16MHz
/**********************************相关配置初始化**************************************/
P1M4 = 0xC2; //P14设置为推挽输出
P1M5 = 0xC2; //P15设置为推挽输出
/************************************ADC初始化*****************************************/
P0M1 = 0x02; //P01设置为模拟输入
P0M0 = 0x02; //P00设置为模拟输入
ADCC0 = 0x80; //打开ADC转换电源
Delay_2us(10); //延时20us,确保ADC系统稳定
ADCC2 = 0x4B; //转换结果12位数据,数据右对齐,ADC时钟16分频
SCANCON = 0x19; //多通道扫描模式,扫描两个通道
SCCH0 = 0x10; //第一个扫描AN0,第二个扫描AN1
IE1 |= 0x40; //打开ADC中断
EA = 1; //打开总中断
ADCC0 &=~ 0x20; //清除ADC中断标志位
ADCC0 |= 0x40;
while(1)
{
if(guc_AdcFlag==1) //ADC转换结束
{
gui_AdcValueBuf_a[0] = SCR0;
gui_AdcValueBuf_a[1] = SCR1;
if(gui_AdcValueBuf_a[0]<=5){LED1 = 0;}else{LED1 = 1;}
if(gui_AdcValueBuf_a[1]<=5){LED2 = 0;}else{LED2 = 1;}
guc_AdcFlag = 0; //标志位清0
memset(gui_AdcValueBuf_a,0,2);//清空缓存Buf
IE1 |= 0x40; //打开ADC中断
ADCC0 |= 0x40; //启动转换
}
}
}
/***************************************************************************************
* @说明 ADC中断服务函数
* @参数 无
* @返回值 无
* @注 无
***************************************************************************************/
void ADC_Rpt() interrupt ADC_VECTOR
{
guc_AdcFlag = 1; //ADC转换结束
IE1 &=~ 0x40; //关闭ADC中断
ADCC0 &=~ 0x20; //清除ADC中断标志位
}
/**
* @说明 延时函数
* @参数 fui_i : 延时时间
* @返回值 无
* @注 Fcpu = 16MHz,fui_i = 1时,延时时间约为2us
*/
void Delay_2us(unsigned int fui_i)
{
while(fui_i--);
}
|