打印
[活动专区]

8003硬件板+(三)ADC(LM35)+6位段式液晶(HT1621)

[复制链接]
12147|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
       原打算先调试好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进行控制,要注意的是将此三个端口设置为输出状态;
//HT1621控制位(液晶模块接口定义,根据自已的需要更改)
sbit HT1621_CS  = P2^2;    //HT1621使能引脚
sbit HT1621_WR  = P2^3;    //HT1621时钟引脚
sbit HT1621_DAT = P2^4;    //HT1621数据引脚
void Ht1621PortInit(void)
{
        P2CON |= 0X1C;
}


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



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

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

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


/*****************************************************
*函数名称:void AdcInit(void)
*函数功能:ADC初始化
*入口参数:void
*出口参数:void
*****************************************************/
void AdcInit(void)
{
        ADCCON  |= 0X83;                        //开启ADC,选择AIN3为ADC采样口0X9F;//
        ADCCFG0 |= 0x08;           //设置Channel作为采样口
        ADCCFG1  = 0x04;            //设置ADC时钟频率为Fosc/8
        IE = 0X40;          //开启ADC中断
        EA = 1;
}


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


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


void main(void)
{
        AdcInit();       
        Ht1621_Init();     
        DelayMS(1000);   
        Ht1621WrAllData(0,Ht1621Tab,16);        //清屏

        //LcdDisplay(123456);           //测试LCD
        while(1)
        {
                GetAdcData();
                LcdDisplay(GetAdcData());
                DelayMS(3000);
        }
}


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


2、最终显示


三、总结
      本次实验中只是简单地将从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

主题

14990

帖子

17

粉丝