[活动专区] 8003硬件板+(三)ADC(LM35)+6位段式液晶(HT1621)

[复制链接]
 楼主| lisingch 发表于 2018-9-28 01:37 | 显示全部楼层 |阅读模式
       原打算先调试好UART模块后再进行后续的其它实验,但上次实验(UART)过程中出现了不少问题,主要表现为SC-LINK无法在开启UART0串口后下载程序。开始时在串口助手软件中将串口关闭能够下载,但后面的过程中时好时坏;必须将USB转TTL模块拔下后才能下载,同时SC-LINK上的红色LED会莫名其妙地熄灭,也必须重新拔插后才能工作,更为严重的是还出现过三次蓝屏。不知道是不是我的电脑有什么问题,最后放弃了利用UART进行实验而改为使用手头上的一块由HT1621驱动的6位段式液晶屏进行交互。本实验通过SC92F8003的ADC输入口AIN3对LM35随温度变化的电压值进行采样,并同时出液晶屏时行显示。
一、实验环境
1、Keil MDK51 9.59
2、SC-LINK
3、SC92F8003的DEMO硬件板
4、自制LM35模块
5、6位段式液晶屏(HT1621)


二、实验过程
1、利用SC92F8003的P2.2、P2.3、P2.4分别对HT1621的CS、WR、DATA进行控制,要注意的是将此三个端口设置为输出状态;
  1. //HT1621控制位(液晶模块接口定义,根据自已的需要更改)
  2. sbit HT1621_CS  = P2^2;    //HT1621使能引脚
  3. sbit HT1621_WR  = P2^3;    //HT1621时钟引脚
  4. sbit HT1621_DAT = P2^4;    //HT1621数据引脚
  1. void Ht1621PortInit(void)
  2. {
  3.         P2CON |= 0X1C;
  4. }


2、LM35是一只温度传感器,之前买来一直没用上,这次将其固定在一小块洞洞板上并加了一只104的电容在电源脚;
IMG_20180922_095438.jpg
IMG_20180922_095518.jpg

它的输出端接在了芯片的PIN20(AIN3),利用片内的ADC模块对其随温度变化输出的电压值进行采集,程序是在官方DEMO的基础上进行了小调整;
  1. #include "adc.h"

  2. unsigned int ADCValue=0x0000;//ADC转换结果全局变量
  3. bit AdcFlag = 0;

  4. /*****************************************************
  5. *函数名称:void GetAdcData(void)
  6. *函数功能:获取ADC端口采集到的数据
  7. *入口参数:void
  8. *出口参数:void
  9. *****************************************************/
  10. unsigned int GetAdcData(void)
  11. {
  12.         ADCCON |= 0X40;                                                                           //开始ADC转换
  13.         while(!AdcFlag);                                                                                //等待 ADC转换完成;
  14.         AdcFlag = 0;
  15.         return ADCValue = ((unsigned int)ADCVH<<4)+(ADCVL>>4); //取得 AD转换值
  16. }


  17. /*****************************************************
  18. *函数名称:void AdcInit(void)
  19. *函数功能:ADC初始化
  20. *入口参数:void
  21. *出口参数:void
  22. *****************************************************/
  23. void AdcInit(void)
  24. {
  25.         ADCCON  |= 0X83;                        //开启ADC,选择AIN3为ADC采样口0X9F;//
  26.         ADCCFG0 |= 0x08;           //设置Channel作为采样口
  27.         ADCCFG1  = 0x04;            //设置ADC时钟频率为Fosc/8
  28.         IE = 0X40;          //开启ADC中断
  29.         EA = 1;
  30. }


  31. void AdcInterrupt(void) interrupt 6
  32. {
  33.         ADCCON &= ~(0X20);  //清中断标志位
  34.         AdcFlag = 1;
  35. }


3、在主函数中,将通过AIN3采集由LM35输出的数据并出段式液晶进行显示;
  1. #include <SC92F8003_C.H>
  2. #include "adc.h"
  3. #include "ht1621.h"


  4. void main(void)
  5. {
  6.         AdcInit();       
  7.         Ht1621_Init();     
  8.         DelayMS(1000);   
  9.         Ht1621WrAllData(0,Ht1621Tab,16);        //清屏

  10.         //LcdDisplay(123456);           //测试LCD
  11.         while(1)
  12.         {
  13.                 GetAdcData();
  14.                 LcdDisplay(GetAdcData());
  15.                 DelayMS(3000);
  16.         }
  17. }


4、实验现象
1、液晶显示测试
IMG_20180928_000025.jpg

2、最终显示
IMG_20180928_000142.jpg

三、总结
      本次实验中只是简单地将从LM35采集到的数据直接送显,程序中并没有对数据进行滤波优化,再加之杜帮线连接的原因造成数字跳动较大,这一点是必须要改进的。

沃利贝尔 发表于 2020-8-31 10:09 | 显示全部楼层
请问楼主,adc.h是自己编辑的吗?
 楼主| lisingch 发表于 2020-9-1 12:15 | 显示全部楼层
沃利贝尔 发表于 2020-8-31 10:09
请问楼主,adc.h是自己编辑的吗?

时间长了记不太清楚了,好像自己编写的
里面就这几句:
#ifndef _ADC_H_
#define _ADC_H_

#include <SC92F8003_C.H>

extern unsigned int ADCValue;
void AdcInit(void);
unsigned int GetAdcData(void);                               

#endif
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

15005

帖子

19

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