搜索

[应用方案] 芯圣のHC89S003多路ADC采样代码分享及下载器(hc-link)使用

[复制链接]
70|19
 楼主 | 2021-1-21 23:05 | 显示全部楼层 |阅读模式
因为项目需求以及朋友介绍,偶然接触到了芯圣的这一款国产的hc89s003,主要是需要用到多路ADC转换,stm8s003f4p6只有5x10位ADC,但是hc89s003有(11+2)x12位ADC 、(11路外部+2路内部),一片更比两片强。而且stm8一片是1块多,hc89s003是不到一块(虽然邮费20是真的贵 )。
  

使用特权

评论回复
 楼主 | 2021-1-21 23:06 | 显示全部楼层
774046009986053d98.png  图一、STM8S103F4P6引脚图

使用特权

评论回复
 楼主 | 2021-1-21 23:06 | 显示全部楼层
61283600998886074d.png
图二、HC89S003F4引脚图

使用特权

评论回复
 楼主 | 2021-1-21 23:07 | 显示全部楼层
先是买了芯片以及最小系统,但拿到快递琢磨了2小时我哭了,这玩意必须专门的下载器,不能用ch340、st-link、j-link一类的,买的芯片就这样被我闲置了两个月。

使用特权

评论回复
 楼主 | 2021-1-21 23:08 | 显示全部楼层
暑假的时候听说芯圣淘宝在搞活动,一元送开发版就去白**了一块,就是下图这个玩意,搞到一个免费的下载器、怎么也要给点儿面子用一下他的芯片吧(其实是舍不得之前买的芯片还有最小系统 )

使用特权

评论回复
 楼主 | 2021-1-21 23:09 | 显示全部楼层
按照官方的资料包,又是驱动又目录下的,整了半天连官方给的例程都下载不进去,提示没有连接到下载器,板子根本没有连上下载器,最后发现是数字签证的问题。
我是使用的是WIN7系统,可能win10,winxp有所差异

使用特权

评论回复
 楼主 | 2021-1-21 23:09 | 显示全部楼层
步骤如下:

1. 打开我的电脑,选中控制面板
519316009991ba5819.png

使用特权

评论回复
 楼主 | 2021-1-21 23:10 | 显示全部楼层
2. 找到设备管理器,双击打开
21099600999580f6da.png

使用特权

评论回复
 楼主 | 2021-1-21 23:11 | 显示全部楼层
3. 找到COM端口,你会发现驱动并没有安装成功
5518760099986875e8.png

使用特权

评论回复
 楼主 | 2021-1-21 23:11 | 显示全部楼层
57998600999a0284de.png

使用特权

评论回复
 楼主 | 2021-1-21 23:12 | 显示全部楼层
系统提示,驱动程序的数字签证无法验证。

使用特权

评论回复
 楼主 | 2021-1-21 23:12 | 显示全部楼层
 解决办法有两种,一是关系统的数字签字,二是禁用数字签证。可以根据不同的系统进行百度,一下是win7系统的处理方法。https://jingyan.baidu.com/article/acf728fd495b9ff8e410a377.html
完成修改以后,再接上驱动就会发现神奇的事情发生了…

使用特权

评论回复
 楼主 | 2021-1-21 23:13 | 显示全部楼层
1589960099a060a53a.png

使用特权

评论回复
 楼主 | 2021-1-21 23:14 | 显示全部楼层
红叉叉没了,说明HC-LINK安装上了,这样一来就可以下载代码了。

使用特权

评论回复
 楼主 | 2021-1-21 23:14 | 显示全部楼层
以下是多路AD的程序代码供参考
芯片:hc89s003
下载器:一元白**板
功能:10路AD转换

端口设置—gpio.h

使用特权

评论回复
 楼主 | 2021-1-21 23:15 | 显示全部楼层
  1. #define P00  0
  2. #define P01  1
  3. #define P02 2
  4. #define P03 3
  5. #define P04 4
  6. #define P05 5
  7. #define P06 6
  8. #define P07 7
  9. #define P20 20
  10. #define P21 21
  11. #define P22 22
  12. #define P23 23
  13. #define P24 24
  14. #define P25 25
  15. #define P26 26
  16. #define P27 27
  17. #define P10 10
  18. #define P11 11

  19. #define IO_IN_FL_NO_SMT 0x00   //!<0000输入(无SMT)
  20. #define IO_IN_PD_NO_SMT 0x01   //!<0001带下拉输入(无SMT) P2.3/P2.4/P2.5/P2.7不支持此功能
  21. #define IO_IN_PU_NO_SMT 0x02   //!<0010带上拉输入(无SMT) P2.3/P2.4/P2.5/P2.7不支持此功能
  22. #define IO_IN_AN  0x03   //!<0011带模拟输入
  23. #define IO_IN_SMT  0x04   //!<0100输入(SMT)
  24. #define IO_IN_PD_SMT  0x05   //!<0101带下拉输入(SMT)
  25. #define IO_IN_PU_SMT  0x06   //!<0110带上拉输入(SMT)
  26. #define IO_IN_AN_PU_PD 0x07   //!<0111带上下拉模拟输入  仅P2.3/P2.4/P2.5/P2.7支持此功能
  27. #define IO_OUT_PP  0x08   //!<1x00推挽输出
  28. #define IO_OUT_OD  0x09   //!<1x01开漏输出
  29. #define IO_OUT_PU  0x0A   //!<1x10带上拉开漏输出

  30. void GPIO(u8 m,u8 n)  //HC89S003F4管脚快速设置函数by abin 。 m为管脚 P0.1=01  P1.0=10 等,n为管脚状态,见上面或数据手册说明
  31. {
  32.         switch (m)
  33.         {
  34.                 case 00:P0M0 = P0M0&0xF0|n;break;
  35.                 case 01:P0M0 = P0M0&0x0F|(n*16);break;
  36.                 case 02:P0M1 = P0M1&0xF0|n;break;
  37.                 case 03:P0M1 = P0M1&0x0F|(n*16);break;
  38.                 case 04:P0M2 = P0M2&0xF0|n;break;
  39.                 case 05:P0M2 = P0M2&0x0F|(n*16);break;
  40.                 case 06:P0M3 = P0M3&0xF0|n;break;
  41.                 case 07:P0M3 = P0M3&0x0F|(n*16);break;
  42.                 case 20:P2M0 = P2M0&0xF0|n;break;
  43.                 case 21:P2M0 = P2M0&0x0F|(n*16);break;
  44.                 case 22:P2M1 = P2M1&0xF0|n;break;
  45.                 case 23:P2M1 = P2M1&0x0F|(n*16);break;
  46.                 case 24:P2M2 = P2M2&0xF0|n;break;
  47.                 case 25:P2M2 = P2M2&0x0F|(n*16);break;
  48.                 case 26:P2M3 = P2M3&0xF0|n;break;
  49.                 case 27:P2M3 = P2M3&0x0F|(n*16);break;
  50.                 case 10:P1M0 = P1M0&0xF0|n;break;
  51.                 case 11:P1M0 = P1M0&0x0F|(n*16);break;
  52.                 default:break;
  53.         }
  54. }
复制代码

使用特权

评论回复
 楼主 | 2021-1-21 23:15 | 显示全部楼层
串口重定义-----uart.h

  1. /**********************************发送一个ASCII码*************************************/
  2. void Printascii(char buf)
  3. {
  4.   SBUF = buf;
  5.   while(!(SCON & 0x02));
  6.   SCON &= ~ 0x02;
  7. }

  8. /**********************************发送一个字符串´®**************************************/
  9. void PrintString(char* buf)
  10. {
  11. int i;
  12.   int sub = 0;
  13.     while(buf[sub] != 0)
  14.     {               
  15.         SBUF = buf[sub];                  //将需要发送的字符载入寄存器
  16.         while(!(SCON & 0x02));                          //判断发送完成?
  17.         SCON &=~ 0x02;                    //清标志位
  18.         sub++;
  19.                 i=20; while(i>1) i--;
  20.     }
  21. }

  22. char putchar(char c)//重定义putchar
  23. {
  24.   char i=10;
  25.    Printascii(c);
  26.    while(i>1)i--;
  27.    return c;
  28. }

  29. void Delay_ms(unsigned int fui_i)//毫秒延时
  30. {
  31.         unsigned int fui_j;
  32.         for(;fui_i > 1;fui_i --)
  33.         for(fui_j = 1596;fui_j > 1;fui_j --);
  34. }


  35. void Delay_2us(unsigned int fui_i)//微秒延时
  36. {
  37.         while(fui_i--);       
  38. }
复制代码

使用特权

评论回复
 楼主 | 2021-1-21 23:16 | 显示全部楼层
主程序----main.c

使用特权

评论回复
 楼主 | 2021-1-21 23:16 | 显示全部楼层
  1. #define        ALLOCATE_EXTERN
  2. #include "HC89S003F4.h"
  3. #include "stdio.h"
  4. #include "gpio.h"
  5. #include "uart.h"

  6. #define AD_num 10         //通道数                       
  7. unsigned int  gui_AdcValue_a[AD_num] = {0x00};                              
  8. //存放转换后的数值  
  9. unsigned char guc_AdcChannel_a[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};        
  10. //ADC通道预设置
  11. unsigned char guc_Count = 0;                                                            //通道计数

  12. char sendbuf[] = " I'm the Id ";
  13. char getbuf[20];
  14. unsigned int flag=0,num=5,i=0,mode=0;

  15. /***************************************************
  16.                      主程序
  17. ****************************************************/
  18. void main()
  19. {               


  20.     WDTCCR = 0x00;
  21.     CLKSWR = 0x51;
  22.     CLKDIV = 0x01;

  23.   
  24. /**********************************UART端口设置¯**************************************/
  25. //   P2M0 = P2M0&0x0F|0x80;     //P21TX
  26.          GPIO(P10,IO_OUT_OD);       //P10TX
  27. //   P0M1 = P0M1&0x0F|0x20;     //P03RX
  28.      GPIO(P11,IO_IN_FL_NO_SMT); //P11TX
  29.       


  30. //    TXD_MAP = 0x21; //TX端口映射到P21
  31.           TXD_MAP = 0x10; //TX端口映射到P10
  32. //    RXD_MAP = 0x03; //RX端口映射到P03
  33.       RXD_MAP = 0x11; //RX端口映射到P11     

  34.     T4CON = 0x06;   //模式6
  35.    
  36.     //波特率   38400---FFE6
  37.     //波特率   9600---FF98
  38.     TH4 = 0xFF;
  39.     TL4 = 0xE6;                                    
  40.     SCON2 = 0x02;                                    
  41.     SCON = 0x10;                                    
  42.     IE |= 0X10;                                    
  43.     EA = 1;                                       

  44. /************************************ADC设置*****************************************/
  45.         GPIO(P00,IO_IN_AN);
  46.            GPIO(P01,IO_IN_AN);
  47.         GPIO(P02,IO_IN_AN);
  48.         GPIO(P03,IO_IN_AN);
  49.         GPIO(P04,IO_IN_AN);
  50.         GPIO(P05,IO_IN_AN);
  51.         GPIO(P06,IO_IN_AN);
  52.     GPIO(P07,IO_IN_AN);
  53.         GPIO(P20,IO_IN_AN);
  54.         GPIO(P21,IO_IN_AN);

  55.     ADCC0 = 0x80;                                               
  56.         Delay_2us(10);                                               
  57.         ADCC1 = 0x00;                                                 
  58.         ADCC2 = 0x4D;                                                 
  59.         IE1 |= 0x20;                                                                                 
  60.         EA = 1;                                                          
  61.         ADCC0 &=~ 0x20;                                               
  62.         Delay_2us(10);                                               
  63.         ADCC0 |= 0x40;                                               

  64.         while(1)
  65.         {
  66.                         printf("AD_a");
  67.                         for(i=0;i<AD_num;i++)       
  68.                         {
  69.                          printf("  %d  ",gui_AdcValue_a[i]);
  70.                         }
  71.                         printf("\r\n");
  72.                         Delay_ms(500);                        
  73.                  }
  74.         }
  75. }


  76. void adc_do(unsigned int ad_value)
  77. {
  78.     gui_AdcValue_a[guc_Count] = ad_value;
  79.         guc_Count++;       
  80.         if(guc_Count >=AD_num)guc_Count=0;
  81.     ADCC1 = (ADCC1&(~0x0f))|(guc_AdcChannel_a[guc_Count]);  
  82.     Delay_2us(10);                                                                    
  83. }

  84. /*******************************ADC中断**************************************/
  85. void ADC_Rpt() interrupt ADC_VECTOR
  86. {
  87.         ADCC0 &=~ 0x20;                                                                     
  88.         adc_do(ADCR);
  89.         ADCC0 |= 0x40;                                                                    
  90. }


  91. /**********************************串口中断**************************************/
  92. void UART1_Rpt(void) interrupt UART1_VECTOR
  93. {
  94.   char temp;
  95.     if(SCON & 0x01)
  96.     {       
  97.         temp= SBUF;         
  98.         //        if(flag==0) uart_do(temp);       
  99.         SCON &=~ 0x01;
  100.     }                                   
  101. }






复制代码

使用特权

评论回复
 楼主 | 2021-1-21 23:17 | 显示全部楼层
以上为部分修改以后的代码,其中AD转换部分没有修改,可以直接使用,主要添加AD_set()函数 ,用于对通道的选择,之所以没有使用全部引脚打开而选择通道切换,是因为同时打开10个通道会出现前8个引脚失效,使用单通道切换就可以完成10路的ADC 转换,有兴趣的可以修改一下试一试第11路(P22)的ADC啊,但是同时开启不能实现转换的具体原因本人才学薄浅,还望巨佬指点 。
询问客服以后是官方历程的问题,修改以后就能同时使用了!!!
其中使用gpio.h快捷端口配置来自博客https://blog.csdn.net/silno/article/details/80412869

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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