[应用方案] 基于HC89F003的电压检测与显示

[复制链接]
490|6
 楼主 | 2017-12-1 09:14 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2017-12-1 09:16 编辑

HC89F003内部具有A/D转换单元,使用它可进行模拟信号的采集,使用新近得到的一个spi接口的OLED屏则能充当采样数据的显示器,其构成如图所示。

电压检测构成及执行效果

spi接口的OLED显示屏共有7个引脚,其引脚排列及用途如下:
1.   GND 电源地
2.   VCC3.3v~5.0V
3.   SCLK 时钟信号端
4.   SDIN 数据信号端
5.   CS   片选信号端
6.   RST  复位信号端
7.   DC   指令/数据选择端

在使用中它与HC89F003的连接关系如下:
SCLK--P07   SDIN--P06  CS--P22  RST--P20   DC--P02

为与OLED的例程相衔接,对效果引脚的高低电平输出定义如下:
#define OLED_SCLK_Clr() GPIO_WriteLow(GPIOT0,GPIO_PIN_7);  
#define OLED_SCLK_Set() GPIO_WriteHigh(GPIOT0,GPIO_PIN_7);
#define OLED_SDIN_Clr() GPIO_WriteLow(GPIOT0,GPIO_PIN_6);  
#define OLED_SDIN_Set() GPIO_WriteHigh(GPIOT0,GPIO_PIN_6);
#define OLED_CS_Clr()   GPIO_WriteLow(GPIOT2,GPIO_PIN_2);  
#define OLED_CS_Set()   GPIO_WriteHigh(GPIOT2,GPIO_PIN_2);
#define OLED_RST_Clr()  GPIO_WriteLow(GPIOT2,GPIO_PIN_0);  
#define OLED_RST_Set()  GPIO_WriteHigh(GPIOT2,GPIO_PIN_0);
#define OLED_DC_Clr()   GPIO_WriteLow(GPIOT0,GPIO_PIN_2);  
#define OLED_DC_Set()   GPIO_WriteHigh(GPIOT0,GPIO_PIN_2);

    在利用单通道A/D采集例程的基础上,实现采样值显示的主程序如下:
  1. void main(void)
  2. {
  3.         u16 s;
  4.         u8 n;
  5.         System_Init();                                                        
  6.         GPIO_Init(GPIOT0,GPIO_PIN_0,GPIO_MODE_IN_AN);
  7.         ADC_Cmd(ENABLE);                                                
  8.         ADC_Init(DATA10,RIGHT_ALIGN,ADC_CLOCK_OSC_16);        
  9.         ADC_VrefConfig(VREF_IN_VDD);                          
  10.         ADC_ChannelConfig(ADC_AN0);
  11.         GPIO_Init(GPIOT0,GPIO_PIN_6, GPIO_MODE_OUT_PP);
  12.         GPIO_Init(GPIOT0,GPIO_PIN_7, GPIO_MODE_OUT_PP);
  13.         GPIO_Init(GPIOT2,GPIO_PIN_2, GPIO_MODE_OUT_PP);
  14.         GPIO_Init(GPIOT2,GPIO_PIN_0, GPIO_MODE_OUT_PP);
  15.         GPIO_Init(GPIOT0,GPIO_PIN_2, GPIO_MODE_OUT_PP);
  16.         OLED_Init();                        
  17.         OLED_Clear();
  18.         OLED_ShowString(8,2,"ADC TEST");        
  19.         OLED_ShowString(8,4,"A/D:");
  20.         OLED_ShowString(8,6,"V=  ");
  21.         while(1)
  22.         {
  23.                 ADC_StartConversion();                                   
  24.                 while(ADC_GetITFlag() != SET);               
  25.                 ADC_ClearITFlag();
  26.                 s=ADC_GetResault();
  27.                 n=s/1000+'0';
  28.                 OLED_ShowChar(40,4,n);
  29.                 n=s%1000/100+'0';
  30.                 OLED_ShowChar(48,4,n);
  31.                 n=s%100/10+'0';
  32.                 OLED_ShowChar(56,4,n);
  33.                 n=s%10+'0';
  34.                 OLED_ShowChar(64,4,n);
  35.                 s=s*33/1024;
  36.                 n=s%100/10+'0';
  37.                 OLED_ShowChar(40,6,n);
  38.                 OLED_ShowChar(48,6,'.');
  39.                 n=s%10+'0';
  40.                 OLED_ShowChar(56,6,n);
  41.                 OLED_ShowChar(64,6,'V');
  42.                 delay_ms(500);
  43.          }
  44. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2017-12-6 14:38 | 显示全部楼层
支持,不错
| 2017-12-7 09:47 | 显示全部楼层
顶一下
 楼主 | 2017-12-7 10:57 | 显示全部楼层

多谢!!!
| 2017-12-7 13:53 | 显示全部楼层
不错
| 2018-1-8 21:41 | 显示全部楼层
检测电压准吗?我做的用数码管显示为什么一直相差0.2伏啊!
| 2018-1-17 17:49 | 显示全部楼层
顶一下
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

分享 快速回复 返回顶部 返回列表