[通用8051核FLASH系列] 【芯圣SDK-HC89F0541测评】+ 开箱上电ADC

[复制链接]
1771|5
 楼主| masterqqq 发表于 2020-7-6 15:56 | 显示全部楼层 |阅读模式
本帖最后由 芯圣电子官方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封装
具有紧凑结构低功耗和较高性能等特点:
729525f02d3c8b171a.png

  1. #define        ALLOCATE_EXTERN
  2. #include "HC89F0541.h"
  3. #include "string.h"

  4. void Delay_2us(unsigned int fui_i);                //延时函数

  5. unsigned int gui_AdcValue = 0;                        //用于计算ADC的值
  6. unsigned char guc_AdcBufCount = 0;      //ADC缓存数量计数
  7. unsigned int gui_AdcValueBuf[8] = {0x00};//用于存放ADC缓存值
  8. unsigned char guc_i = 0;                //计算缓存值计数
  9. unsigned char guc_AdcFlag  = 0;         //ADC转换完成标志位

  10. /***************************************************************************************
  11.   * @实现效果        对P24口的ADC通道12进行AD转换
  12. ***************************************************************************************/
  13. void main()
  14. {
  15. /************************************系统初始化****************************************/
  16.         CLKSWR = 0x51;                                                //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
  17.         CLKDIV = 0x01;                                                //Fosc 1分频得到Fcpu,Fcpu=16MHz
  18. /**********************************相关配置初始化**************************************/
  19.     P1M4 = 0xC2;                        //P03设置为推挽输出
  20. /************************************ADC初始化*****************************************/
  21.         P2M4 = 0x02;                                        //P24设置为模拟输入
  22.         ADCC0 = 0x80;                                                //打开ADC转换电源
  23.         Delay_2us(10);                                                //延时20us,确保ADC系统稳定
  24.         ADCC1 = 0x0C;                                                //选择外部通道12
  25.         ADCC2 = 0x4B;                                                //转换结果12位数据,数据右对齐,ADC时钟16分频
  26.     SCANCON = 0x6F;                     //单通道带缓存连续模式,扫描8次
  27.     IE1 |= 0x40;                        //打开ADC中断
  28.         EA = 1;                                                                //打开总中断
  29.         ADCC0 |= 0x40;                                            //启动ADC转换
  30.    
  31.         while(1)
  32.         {
  33.         if(guc_AdcFlag==1)              //ADC转换结束
  34.         {
  35.             gui_AdcValueBuf[0] = SCR0;
  36.             gui_AdcValueBuf[1] = SCR1;
  37.             gui_AdcValueBuf[2] = SCR2;
  38.             gui_AdcValueBuf[3] = SCR3;
  39.             gui_AdcValueBuf[4] = SCR4;
  40.             gui_AdcValueBuf[5] = SCR5;
  41.             gui_AdcValueBuf[6] = SCR6;
  42.             gui_AdcValueBuf[7] = SCR7;
  43.             for(guc_i=0;guc_i<8;guc_i++)
  44.             {
  45.                 gui_AdcValue+=gui_AdcValueBuf[guc_i];
  46.             }
  47.             gui_AdcValue /= 8;         //计算平均值
  48.                         if(gui_AdcValue <= 0x10){P1_4 = 1;}
  49.                         else {P1_4 = 0;}
  50.                         guc_AdcFlag = 0;            //标志位清0
  51.             guc_AdcBufCount = 0;        //计数值清0
  52.             memset(gui_AdcValueBuf,0,10);//清空缓存Buf
  53.             IE1 |= 0x40;                //打开ADC中断
  54.         }
  55.         }
  56. }

  57. /***************************************************************************************
  58.   * @说明          ADC中断服务函数
  59.   *        @参数        无
  60.   * @返回值 无
  61.   * @注                无
  62. ***************************************************************************************/
  63. void ADC_Rpt() interrupt ADC_VECTOR
  64. {
  65.     guc_AdcFlag = 1;
  66.     IE1 &=~ 0x40;                       //关闭ADC中断
  67.     ADCC0 &=~ 0x20;                     //清除ADC中断标志位
  68. }

  69. /**
  70.   * @说明          延时函数
  71.   * @参数          fui_i : 延时时间
  72.   * @返回值 无
  73.   * @注         Fcpu = 16MHz,fui_i = 1时,延时时间约为2us
  74.   */
  75. void Delay_2us(unsigned int fui_i)
  76. {
  77.         while(fui_i--);        
  78. }
测试为V (p2_4)>16*5/4096 时P1_4低电位V (p2_4)<16*5/4096 时P1_4变高电位
176125f02d8f993e53.png 992925f02d905015cd.png

多通道模式: 477525f02df5e76ddd.png 333455f02dfad6b421.png
P0_0低于5*5/4096  P1_4输出低电平

  1. #define        ALLOCATE_EXTERN
  2. #include "HC89F0541.h"
  3. #include "string.h"

  4. void Delay_2us(unsigned int fui_i);                //延时函数

  5. #define LED1        P1_4                                        //LED1端口
  6. #define LED2        P1_5                                        //LED2端口        

  7. unsigned int gui_AdcValueBuf_a[2] = {0x00};//用于存放ADC的值
  8. unsigned char guc_AdcChannelCount = 0;  //ADC通道切换
  9. unsigned char guc_AdcFlag  = 0;         //ADC转换完成标志位

  10. /***************************************************************************************
  11.   * @实现效果        对P00和P01口的ADC通道0和1进行AD转换
  12. ***************************************************************************************/
  13. void main()
  14. {
  15. /************************************系统初始化****************************************/
  16.         CLKSWR = 0x51;                                                //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
  17.         CLKDIV = 0x01;                                                //Fosc 1分频得到Fcpu,Fcpu=16MHz
  18. /**********************************相关配置初始化**************************************/
  19.     P1M4 = 0xC2;                        //P14设置为推挽输出
  20.     P1M5 = 0xC2;                        //P15设置为推挽输出
  21. /************************************ADC初始化*****************************************/
  22.         P0M1 = 0x02;                                        //P01设置为模拟输入
  23.         P0M0 = 0x02;                                        //P00设置为模拟输入
  24.         ADCC0 = 0x80;                                                //打开ADC转换电源
  25.         Delay_2us(10);                                                //延时20us,确保ADC系统稳定
  26.         ADCC2 = 0x4B;                                                //转换结果12位数据,数据右对齐,ADC时钟16分频
  27.     SCANCON = 0x19;                     //多通道扫描模式,扫描两个通道
  28.     SCCH0 = 0x10;                             //第一个扫描AN0,第二个扫描AN1
  29.     IE1 |= 0x40;                        //打开ADC中断
  30.         EA = 1;                                                                //打开总中断
  31.         ADCC0 &=~ 0x20;                                                //清除ADC中断标志位
  32.     ADCC0 |= 0x40;
  33.    
  34.         while(1)
  35.     {
  36.         if(guc_AdcFlag==1)              //ADC转换结束
  37.         {
  38.             gui_AdcValueBuf_a[0] = SCR0;
  39.             gui_AdcValueBuf_a[1] = SCR1;
  40.             if(gui_AdcValueBuf_a[0]<=5){LED1 = 0;}else{LED1 = 1;}
  41.             if(gui_AdcValueBuf_a[1]<=5){LED2 = 0;}else{LED2 = 1;}
  42.             guc_AdcFlag = 0;            //标志位清0
  43.             memset(gui_AdcValueBuf_a,0,2);//清空缓存Buf
  44.             IE1 |= 0x40;                //打开ADC中断
  45.             ADCC0 |= 0x40;              //启动转换
  46.         }
  47.     }
  48. }

  49. /***************************************************************************************
  50.   * @说明          ADC中断服务函数
  51.   *        @参数        无
  52.   * @返回值 无
  53.   * @注                无
  54. ***************************************************************************************/
  55. void ADC_Rpt() interrupt ADC_VECTOR
  56. {
  57.     guc_AdcFlag = 1;                    //ADC转换结束
  58.     IE1 &=~ 0x40;                       //关闭ADC中断
  59.     ADCC0 &=~ 0x20;                                                //清除ADC中断标志位
  60. }

  61. /**
  62.   * @说明          延时函数
  63.   * @参数          fui_i : 延时时间
  64.   * @返回值 无
  65.   * @注         Fcpu = 16MHz,fui_i = 1时,延时时间约为2us
  66.   */
  67. void Delay_2us(unsigned int fui_i)
  68. {
  69.         while(fui_i--);        
  70. }




51xlf 发表于 2020-8-3 16:28 | 显示全部楼层
这个板子这么精巧吗   
i1mcu 发表于 2020-8-3 16:29 | 显示全部楼层
HC89F0541支持多大的频率呢     
pmp 发表于 2020-8-3 16:29 | 显示全部楼层
是自带的ADC吗?   
mmbs 发表于 2020-8-3 16:29 | 显示全部楼层
内部测温的吗?   
1988020566 发表于 2020-8-3 16:29 | 显示全部楼层
增强型 8 位单片机很给力。            
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

35

主题

173

帖子

146

粉丝
快速回复 在线客服 返回列表 返回顶部