光控数字温度时钟课程设计报告.docx
- 文档编号:8754354
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:23
- 大小:24.70KB
光控数字温度时钟课程设计报告.docx
《光控数字温度时钟课程设计报告.docx》由会员分享,可在线阅读,更多相关《光控数字温度时钟课程设计报告.docx(23页珍藏版)》请在冰豆网上搜索。
光控数字温度时钟课程设计报告
序号:
20
光电技术课程设计
题目:
光控数字温度时钟
学生
王较军
班级
电子2011-2BF
学号
物理与电子学院
专业
电子科学与技术
指导老师
梅孝安
职称
副教授
完成时间
2015年6月12日
(湖南理工学院物理与电子学院)
整体设计思想
本次实验采用通用51单片机(AT89C51)。
DS1302作为基本时钟,并带有蜂鸣器模块,实现报时闹铃功能。
使用TLC1543芯片(10位串行A/D)作为温度光强采集模块。
温度采集采用热敏电阻、光强采集采用光敏电阻。
亮度控制采用D/A输出(DAC0808),采用LED数码管动态显示。
出于方便、高效考虑,设置两个按钮一为功能键,一为加键。
系统硬件电路设计(
本设计硬件总设计图如图1所示。
温度由热敏电阻采集经处理后转换为温度显示,光强每经过一段时间间隔由光敏电阻采集一次,转换为数字信号后通过DACO8O8芯片控制(D\A输出)达到调节LED数码管显示亮度的目的。
图1设计总电路图
DS1302模块
DS1302模块以DS1302时钟芯片为主体构成,用于基本的时间显示。
其硬件结构图如图2所示。
DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,,且具有闰年补偿等多种功能。
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。
工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
缺点是时钟精度不高,易受环境影响,出现时钟混乱。
模块软件设计见设计报告系统程序设计部分。
图2DS1302模块电路图
数码管及数码管驱动模块
(1)数码管模块如图3所示:
图3数码管模块
在数码管显示上将第三个数码管反向安置,使得第二、第三个数码管的小数点位组成一对,实现时钟的秒显示功能。
第三个数码管译码表:
0xc0,0xcf,0xa4,0x86,0x8b,0x92,0x90,0xc7,0x80,0x82,0x70
(2)数码管驱动模块,如图4,图5所示:
图4数码管驱动模块
图5数码管驱动模块
其中,DAC0808用于实现亮度调节(D\A转换),
温度光强采集模块
模块结构如图6所示
图6温度光强采集模块
采集温度用热明电阻,热敏电阻的主要特点是:
①灵敏度较高,其电阻温度系数要比金属大10~100倍以上,能检测出10-6℃的温度变化;②工作温度范围宽,常温器件适用于-55℃~315℃,高温器件适用温度高于315℃(目前最高可达到2000℃),低温器件适用于-273℃~-55℃;③体积小,能够测量其他温度计无法测量的空隙、腔体及生物体内血管的温度;④使用方便,电阻值可在0.1~100kΩ间任意选择;⑤易加工成复杂的形状,可大批量生产;⑥稳定性好、过载能力强。
采集光强使用光敏电阻,光敏电阻的工作原理是基于内光电效应。
在半导体光敏材料两端装上电极引线,将其封装在带有透明窗的管壳里就构成光敏电阻,为了增加灵敏度,两电极常做成梳状。
用于制造光敏电阻的材料主要是金属的硫化物、硒化物和碲化物等半导体。
通常采用涂敷、喷涂、烧结等方法在绝缘衬底上制作很薄的光敏电阻体及梳状欧姆电极,接出引线,封装在具有透光镜的密封壳体内,以免受潮影响其灵敏度。
入射光消失后,由光子激发产生的电子—空穴对将复合,光敏电阻的阻值也就恢复原值。
在光敏电阻两端的金属电极加上电压,其中便有电流通过,受到一定波长的光线照射时,电流就会随光强的增大而变大,从而实现光电转换。
光敏电阻没有极性,纯粹是一个电阻器件,使用时既可加直流电压,也加交流电压。
半导体的导电能力取决于半导体导带内载流子数目的多少。
蜂鸣器和按键模块
图7为蜂鸣器模块实现闹铃,整点报时功能。
图8为按键模块,K1为加键用于调节数据的大小,K2为功能键用于实现不同功能的转换。
图7为蜂鸣器模块
图8按键模块
系统软件设计
(1)主程序
#include
#include"shu_ma_guan.h"
#include"myds1302.h"
#include"key.h"
#include"naozhong.h"
#include"TLC1543.h"
#include
uinttemperature_convert(void);
voidbrilliance_control(void);
intmain(void)
{
uinttemporary_temp=0;
TMOD=0x11;//T0,T1均工作于方式1(16位定时/计数),软件启动
TH0=(65535-50000)/256;//一次中断时间为50ms(12MHz下)
TL0=(65535-50000)%256;
TH1=(65535-50000)/256;//一次中断时间为50ms(12MHz下)
TL1=(65535-50000)%256;
EA=1;//开总中断
ET0=1;//开定定时器T0中断
ET1=1;//开定定时器T1中断
TR1=1;//打开定时器T1,隔一段时间调节一次亮度
TLC1543_Init();//初始化TLC1543
Read_Time();
Write_Time();//设置初始时间
brilliance_control();//亮度初始设置
while
(1)//while
{
alarm_clock();//闹钟判别,与撤消
set_key_scan();//设置键扫描,获取状态state信息
switch(state)
{
case0:
//显示时间
Read_Time();//读取时间信息,存放在全局calendar结构对象Time中
if((Time.DS1302_miao<0x25&&Time.DS1302_miao>=0x20)
||(Time.DS1302_miao<0x50&&Time.DS1302_miao>=0x45))//20-25/45-50秒间显示温度
{
temporary_temp=temperature_convert();//将TLC1543转换的数字是转换成对应的温度
xianshi_num(temporary_temp);
}
else
{
shijian_xianshi(Time.DS1302_shi,Time.DS1302_feng);//显示时间
}
break;
case1:
//调整闹钟
case2:
case3:
tiao_naozhong();
break;
case4:
//调整时间
case5:
tiaoshi();
break;
default:
break;
}//endswitch
}//endwhile
return0;
}
//将TLC1543转换的数字是转换成对应的温度
//参数:
//返回:
参数对应的温度
uinttemperature_convert(void)
{
floattemp_num=0;
TR1=0;
temp_num=TLC1543_ReadADC(0x00);
TR1=1;
//对采集到的数字量作处理
temp_num=10*temp_num*5.0/1024;//10倍电压
//matlabpolyfit最小二乘法曲线拟合(4阶)
temp_num=0.000035*pow(temp_num,4)-0.005092*pow(temp_num,3)+0.262544*pow(temp_num,2)-7.884431*temp_num+123.031448;
return(uint)(temp_num*10);
}
//亮度控制
//说明:
调用TLC1543_ReadADC
(1)通道1获取光敏电阻的AD转换值,
//TLC5615_WriteDAC(xxx)进行DA转换
//参数:
无
//返回:
无
voidbrilliance_control(void)
{
uinttemp=0;
temp=TLC1543_ReadADC(0x01);
//对获取的AD值处理
temp=temp/4;//将10位数字量转换为8位数字量
temp=100*temp*5.0/256;//100倍采集到的电压值
if(temp>59)//弱光
P3=125;
elseif(temp>28)//一般光强
P3=175;
else
P3=255;
P3=(uchar)temp;//送到DAC0808转换,控制亮度
}
voidTimer_T1(void)interrupt3//T1中断服务程序
{
staticuintnum_time=0;//计数器
TR1=0;
TH1=(65535-50000)/256;//一次中断时间为50ms(12MHz下)
TL1=(65535-50000)%256;
num_time++;
if(num_time%10==0)//控制时间显示时小数点的闪烁
{
twinkle=!
twinkle;
}
if(num_time>=20)//中断20次,每1s调节一次亮度
{
num_time=0;
brilliance_control();//亮度控制
}
TR1=1;
}
(2)DS1302程序
#include"myds1302.h"
#include"shu_ma_guan.h"
sbitSDA=P1^5;//DS1302双向数据线
sbitSCLK=P1^6;//时钟线
sbitRST=P1^7;//控制线
//以BCD码存放时间信息
structcalendarTime={0x05,0x59,0x50};
/***********************/
//从DS1302读出一个字节
//参数:
无
//返回:
读取的字节
ucharDS1302ReadByte(void)
{
uchari=0;
uchardate=0;//读取的字节
_nop_();
for(i=0;i<8;i++)
{
date=date>>1;//从低位至高位读入
if(SDA)//读出1
{
date|=0x80;
}
SCLK=1;//产生上升沿
_nop_();
SCLK=0;
_nop_();
}
returndate;
}
/***********************/
//向DS1302写入一个字节
//参数:
uchardat要写入的字节
//返回:
无
voidDS1302WriteByte(uchardat)
{
uchari=0;
SCLK=0;
_nop_();
for(i=0;i<8;i++)
{
SDA=dat&0x01;//DS1302数据是从低位开始传输的
_nop_();
SCLK=1;//产生上升沿
_nop_();
SCLK=0;
dat=dat>>1;//将高位移至低位
}
}
/***********************/
//从DS1302读数据
//说明:
先写要读数据地址,再读数据
//参数:
ucharcmd要写入的控制字(数据所在的地址)
//返回:
读取的数据
ucharDS1302Read(ucharcmd)
{
uchardat=0;
RST=0;//初始CE线置为0
SCLK=0;//时钟拉低
_nop_();
RST=1;//CE线拉高,开始传输
DS1302WriteByte(cmd);//传输命令字,要操作的时间/日历的地址
dat=DS1302ReadByte();//读取数据
SCLK=1;
RST=0;//读取结束,CE置为0,结束数据传输
returndat;
}
/***********************/
//向DS1302写数据
//说明:
先写地址,再写数据
//参数:
ucharcmd要写入的控制字,uchardat要写入的数据
//返回:
无
voidDS1302Write(ucharcmd,uchardat)
{
RST=0;//初始CE线置为0
SCLK=0;//时钟拉低
_nop_();
RST=1;//CE线拉高,开始传输
DS1302WriteByte(cmd);//传输命令字,要写入的时间/日历的地址
DS1302WriteByte(dat);//要写入的日期/时间
SCLK=1;//时钟拉高
RST=0;//读取结束,CE置为0,结束数据传输
}
//从DS1302读出时间参量
//说明:
全局结构体变量Time用于存放时间参量
//参数:
无
//返回:
无
voidRead_Time(void)
{
Time.DS1302_shi=DS1302Read(READ_Hour);//读取小时
Time.DS1302_feng=DS1302Read(READ_Minutes);//读取分钟
Time.DS1302_miao=DS1302Read(READ_Seconds);//读取秒数
//对读取的时间进行有效处理(去除掉与时间信息无关的位的影响)
if(Time.DS1302_shi>0x23)Time.DS1302_shi=0;//如果使用12小时制,则需要对读取的时间进行处理
if(Time.DS1302_feng>0x59)Time.DS1302_feng=0;
if(Time.DS1302_miao>0x59)Time.DS1302_miao-=0x80;//暂停模式下秒的最高位为1
}
//将Time结构中的时间参量写入DS1302
//说明:
全局结构体变量Time用于存放时间参量
//参数:
无
//返回:
无
voidWrite_Time(void)
{
if(Time.DS1302_shi>0x23)Time.DS1302_shi=0;
if(Time.DS1302_feng>0x59)Time.DS1302_feng=0;
if(Time.DS1302_miao>0x59)Time.DS1302_miao=0;
DS1302Write(WRITE_WP,WP_OFF);//写保护关,(否则不能写入)
DS1302Write(WRITE_Hour,Hour_24(Time.DS1302_shi));//设置小时
DS1302Write(WRITE_Minutes,Time.DS1302_feng);//设置分钟
DS1302Write(WRITE_Seconds,Time.DS1302_miao);//设置秒
DS1302Write(WRITE_WP,WP_ON);//写保护开
}
(3)数码管模块程序
#defineLED_OFF1#include"shu_ma_guan.h"
#include"myds1302.h"
#defineLED_ON0
sbitT_shi_s=P2^0;
sbitT_shi_g=P2^1;
sbitT_feng_s=P2^2;
sbitT_feng_g=P2^3;
//0~9共阳极字形码(不带点),减0x80对应数值表示显示小数点
ucharcodetable0[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//0~9共阳极字形倒码(不带点)
ucharcodetable1[]={0xc0,0xcf,0xa4,0x86,0x8b,0x92,0x90,0xc7,0x80,0x82,0x70};//'*C'
uchartwinkle=1;//控制时间显示时小数点的闪烁
/*************************/
//功能显示一位数据
//参数:
ucharnum要显示的数据,ucharzf是否带点(0不带,1带)
//ucharliangdu显示时间用于控制亮度取(共NUMms,显示liangdu,灭NUM-liangdu)
//返回:
无
voidxianshi_yiwei(ucharnum,ucharzf,ucharliangdu)
{
if(zf)//带点显示
{
P0=table0[num]-0x80;
}
else//不带点显示
{
P0=table0[num];
}
delay_ms(liangdu);
P0=0xff;//关闭显示,消影
delay_ms(NUM-liangdu);
}
/*************************/
//功能显示一位数据(用倒置的数码管)
//参数:
ucharnum要显示的数据,ucharzf是否显示点(0--不显示,1--显示),
//ucharliangdu显示时间用于控制亮度取(共NUMms,显示liangdu,灭NUM-liangdu)
//返回:
无
voidxianshi_yiwei_dao(ucharnum,ucharzf,ucharliangdu)
{
if(zf!
=0)//带点显示
{
P0=table1[num]-0x80;
}
else//不带点显示
{
P0=table1[num];
}
delay_ms(liangdu);
P0=0xff;//关闭显示,消影
delay_ms(NUM-liangdu);
}
/**************************/
//功能:
显示时间
//参数:
ucharshi小时,ucharfen分钟,ucharmiao
//返回:
无
voidshijian_xianshi(ucharshi,ucharfen)
{
uchartemp=0;//分离个十位
//显示小时
if(Time.DS1302_shi>0x09)
{
temp=shi/16;//十进制转换为BCD码
T_shi_s=LED_ON;//数码管小时十位开
xianshi_yiwei(temp,0,NUM);
T_shi_s=LED_OFF;//数码管小时十位关
}
T_shi_g=LED_ON;
temp=shi%16;
xianshi_yiwei(temp,twinkle,NUM);
T_shi_g=LED_OFF;
//显示分钟
T_feng_s=LED_ON;
temp=fen/16;
xianshi_yiwei_dao(temp,twinkle,NUM);
T_feng_s=LED_OFF;
T_feng_g=LED_ON;
temp=fen%16;
xianshi_yiwei(temp,alarm_on_off,NUM);
T_feng_g=LED_OFF;
}
/**************************/
//功能:
显示调整状态时的时间(要调的两位闪烁--调时,要调的一位闪烁--调闹钟)
//参数:
ucharshi小时,ucharfen分钟,ucharmiao秒,ucharclock_alarm调的是时间还是闹钟
//返回:
无
voidxianshi_shijian_adjust(ucharshi,ucharfen,ucharclock_alarm)
{
staticucharfrequency=0;//用于闪烁控制
uchartemp=0;//分离个十位
ucharliang_mie_shi=NUM;//默认亮
ucharliang_mie_feng=NUM;//默认亮
frequency++;
if(frequency>40)//如果闪烁太快人眼可能看起来是一直亮的
{
frequency=0;
}
else
{
if(frequency>25)//frequency不要用于控制秒闪烁,秒闪烁频率小于点
switch(state)//根据状态控制不同的位闪烁
{
case1:
//闹钟的小时
case4:
//时间的小时
liang_mie_shi=0;
break;
case2:
//闹钟的分钟
case5:
//时间的分钟
liang_mie_feng=0;
break;
default:
break;
}
}
if(Time.DS1302_shi>0x09)
{
//显示小时
temp=shi/16;//十进制转换为BCD码
T_shi_s=LED_ON;
if(clock_alarm==ADJUS_CLOCK)
xianshi_yiwei(temp,0,liang_mie_shi);//调时间闪烁
else
if(clock_alarm==ADJUS_ALARM)//调闹钟不闪烁
xianshi_yiwei(temp,0,NUM);
T_shi_s=LED_OFF;
}
T_shi_g=LED_ON;
temp=shi%16;
xianshi_yiwei(temp,1,liang_mie_shi);
T_shi_g=LED_OFF;
//显示分钟
T_feng_s=LED_ON;
temp=fen/16;
if(clock_alarm==
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 光控 数字 温度 时钟 课程设计 报告