打印
[通用8051核FLASH系列]

【芯圣SDK-HC89F0541测评】+ 开箱上电ADC

[复制链接]
1099|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 芯圣电子官方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--);        
}




使用特权

评论回复
沙发
51xlf| | 2020-8-3 16:28 | 只看该作者
这个板子这么精巧吗   

使用特权

评论回复
板凳
i1mcu| | 2020-8-3 16:29 | 只看该作者
HC89F0541支持多大的频率呢     

使用特权

评论回复
地板
pmp| | 2020-8-3 16:29 | 只看该作者
是自带的ADC吗?   

使用特权

评论回复
5
mmbs| | 2020-8-3 16:29 | 只看该作者
内部测温的吗?   

使用特权

评论回复
6
1988020566| | 2020-8-3 16:29 | 只看该作者
增强型 8 位单片机很给力。            

使用特权

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

本版积分规则

个人签名:32MCU单片机查询网 http://www.32mcu.com MCU选型,嵌入式设计辅助,选择最适合的MCU

35

主题

173

帖子

142

粉丝