原打算先调试好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采集到的数据直接送显,程序中并没有对数据进行滤波优化,再加之杜帮线连接的原因造成数字跳动较大,这一点是必须要改进的。
|