光控数字温度时钟课程设计报告

上传人:b**** 文档编号:70891751 上传时间:2022-04-06 格式:DOC 页数:24 大小:3.35MB
返回 下载 相关 举报
光控数字温度时钟课程设计报告_第1页
第1页 / 共24页
光控数字温度时钟课程设计报告_第2页
第2页 / 共24页
光控数字温度时钟课程设计报告_第3页
第3页 / 共24页
点击查看更多>>
资源描述
WORD 序号:20光电技术课程设计题 目:光控数字温度时钟学生王较军班级电子2011-2BF学号物理与电子学院专 业电子科学与技术指导老师梅孝安职 称副教授完成时间2015年6月12日( 理工学院物理与电子学院 )整体设计思想 本次实验采用通用51单片机(AT89C51)。DS1302作为基本时钟,并带有蜂鸣器模块,实现报时闹铃功能。使用TLC1543芯片(10位串行A/D)作为温度光强采集模块。温度采集采用热敏电阻、光强采集采用光敏电阻。亮度控制采用D/A输出(DAC0808),采用LED数码管动态显示。出于方便、高效考虑,设置两个按钮一为功能键,一为加键。系统硬件电路设计(本设计硬件总设计图如图1所示。温度由热敏电阻采集经处理后转换为温度显示,光强每经过一段时间间隔由光敏电阻采集一次,转换为数字信号后通过DACO8O8芯片控制(DA输出)达到调节LED数码管显示亮度的目的。 图1 设计总电路图DS1302模块 DS1302模块以DS1302时钟芯片为主体构成,用于基本的时间显示。其硬件结构图如图2所示。DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,且具有闰年补偿等多种功能。DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。工作电压为2.5V5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302部有一个318的用于临时性存放数据的RAM寄存器。缺点是时钟精度不高,易受环境影响,出现时钟混乱。模块软件设计见设计报告系统程序设计部分。图2 DS1302模块电路图数码管与数码管驱动模块(1) 数码管模块如图3所示:图3 数码管模块在数码管显示上将第三个数码管反向安置,使得第二、第三个数码管的小数点位组成一对,实现时钟的秒显示功能。第三个数码管译码表:0xc0, 0xcf, 0xa4, 0x86, 0x8b, 0x92, 0x90, 0xc7, 0x80, 0x82, 0x70(2) 数码管驱动模块,如图4,图5所示: 图4 数码管驱动模块 图5 数码管驱动模块其中,DAC0808用于实现亮度调节(DA转换),温度光强采集模块模块结构如图6所示 图6 温度光强采集模块采集温度用热明电阻,热敏电阻的主要特点是:灵敏度较高,其电阻温度系数要比金属大10100倍以上,能检测出10-6的温度变化;工作温度围宽,常温器件适用于-55315,高温器件适用温度高于315(目前最高可达到2000),低温器件适用于-273-55;体积小,能够测量其他温度计无法测量的空隙、腔体与生物体血管的温度;使用方便,电阻值可在0.1100k间任意选择;易加工成复杂的形状,可大批量生产;稳定性好、过载能力强。 采集光强使用光敏电阻,光敏电阻的工作原理是基于光电效应。在半导体光敏材料两端装上电极引线,将其封装在带有透明窗的管壳里就构成光敏电阻,为了增加灵敏度,两电极常做成梳状。用于制造光敏电阻的材料主要是金属的硫化物、硒化物和碲化物等半导体。通常采用涂敷、喷涂、烧结等方法在绝缘衬底上制作很薄的光敏电阻体与梳状欧姆电极,接出引线,封装在具有透光镜的密封壳体,以免受潮影响其灵敏度。入射光消失后,由光子激发产生的电子空穴对将复合,光敏电阻的阻值也就恢复原值。在光敏电阻两端的金属电极加上电压,其中便有电流通过,受到一定波长的光线照射时,电流就会随光强的增大而变大,从而实现光电转换。光敏电阻没有极性,纯粹是一个电阻器件,使用时既可加直流电压,也加交流电压。半导体的导电能力取决于半导体导带载流子数目的多少。蜂鸣器和按键模块图7为蜂鸣器模块实现闹铃,整点报时功能。图8为按键模块,K1为加键用于调节数据的大小,K2为功能键用于实现不同功能的转换。 图7为蜂鸣器模块 图8 按键模块系统软件设计(1) 主程序(2)(3)#include #include shu_ma_guan.h#include myds1302.h#include key.h#include naozhong.h#include TLC1543.h#include uint temperature_convert(void);void brilliance_control(void);int main(void)uint temporary_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();/初始化TLC1543Read_Time();Write_Time();/设置初始时间brilliance_control();/亮度初始设置while(1)/whilealarm_clock();/闹钟判别,与撤消set_key_scan();/设置键扫描,获取状态state信息switch(state)case 0:/显示时间Read_Time();/读取时间信息,存放在全局 calendar结构对象 Time中if(Time.DS1302_miao=0x20) | (Time.DS1302_miao=0x45) /20-25/45-50秒间显示温度temporary_temp =temperature_convert();/将TLC1543转换的数字是转换成对应的温度xianshi_num(temporary_temp);elseshijian_xianshi(Time.DS1302_shi, Time.DS1302_feng);/显示时间break;case 1:/调整闹钟case 2:case 3:tiao_naozhong();break;case 4:/调整时间case 5:tiaoshi();break;default : break;/endswitch/endwhilereturn 0;/将TLC1543转换的数字是转换成对应的温度/参数:/返回:参数对应的温度uint temperature_convert(void)float temp_num=0;TR1 =0;temp_num =TLC1543_ReadADC(0x00);TR1 =1;/对采集到的数字量作处理temp_num =10*temp_num*5.0/1024;/10倍电压/matlab polyfit最小二乘法曲线拟合(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转换/参数:无/返回:无void brilliance_control(void)uint temp=0;temp =TLC1543_ReadADC(0x01);/对获取的AD值处理temp = temp/4;/将10位数字量转换为8位数字量temp =100*temp*5.0/256;/100倍采集到的电压值if(temp 59)/弱光P3 =125;else if(temp 28)/一般光强P3 =175;elseP3 =255;P3 =(uchar)temp;/送到DAC0808转换,控制亮度void Timer_T1(void) interrupt 3/T1中断服务程序static uint num_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;(4) DS1302程序#include myds1302.h#include shu_ma_guan.hsbit SDA = P15;/DS1302双向数据线sbit SCLK = P16;/时钟线sbit RST = P17;/控制线/以BCD码存放时间信息struct calendar Time =0x05, 0x59, 0x50;/*/从DS1302读出一个字节/参数:无/返回:读取的字节uchar DS1302ReadByte(void)uchar i=0;uchar date=0;/读取的字节_nop_();for (i=0; i1;/从低位至高位读入if (SDA)/读出1date |=0x80;SCLK =1;/产生上升沿_nop_();SCLK =0;_nop_();return date;/*/向DS1302写入一个字节/参数:uchar dat 要写入的字节/返回:无void DS1302WriteByte(uchar dat)uchar i=0;SCLK =0;_nop_();for (i=0; i1;/将高位移至低位/*/从DS1302读数据/说明:先写要读数据地址,再读数据/参数:uchar cmd 要写入的控制字(数据所在的地址)/返回:读取的数据uchar DS1302Read(uchar cmd)uchar dat=0;RST =0;/初始CE线置为0SCLK =0;/时钟拉低_nop_();RST =1;/CE线拉高,开始传输DS1302WriteByte(cmd);/传输命令字,要操作的时间/日历的地址dat =DS1302ReadByte();/读取数据SCLK =1;RST =0;/读取结束,CE置为0,结束数据传输return dat;/*/向DS1302写数据/说明:先写地址,再写数据/参数:uchar cmd 要写入的控制字, uchar dat 要写入的数据 /返回:无void DS1302Write(uchar cmd, uchar dat)RST =0;/初始CE线置为0SCLK =0;/时钟拉低_nop_();RST =1;/CE线拉高,开始传输DS1302WriteByte(cmd);/传输命令字,要写入的时间/日历的地址DS1302WriteByte(dat);/要写入的日期/时间SCLK =1;/时钟拉高RST =0;/读取结束,CE置为0,结束数据传输/从DS1302读出时间参量/说明:全局结构体变量Time用于存放时间参量/参数:无/返回:无void Read_Time(void)Time.DS1302_shi = DS1302Read(READ_Hour);/读取小时Time.DS1302_feng = DS1302Read(READ_Minutes);/读取分钟Time.DS1302_miao = DS1302Read(READ_Seconds);/读取秒数/对读取的时间进行有效处理(去除掉与时间信息无关的位的影响)if(Time.DS1302_shi0x23) Time.DS1302_shi =0;/如果使用12小时制,则需要对读取的时间进行处理if(Time.DS1302_feng0x59) Time.DS1302_feng =0;if(Time.DS1302_miao0x59) Time.DS1302_miao -=0x80;/暂停模式下秒的最高位为 1/将Time结构中的时间参量写入DS1302/说明:全局结构体变量Time用于存放时间参量/参数:无/返回:无void Write_Time(void)if(Time.DS1302_shi0x23) Time.DS1302_shi =0;if(Time.DS1302_feng0x59) Time.DS1302_feng =0;if(Time.DS1302_miao0x59) 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);/写保护开(5) 数码管模块程序#define LED_OFF 1#include shu_ma_guan.h#include myds1302.h#define LED_ON 0sbit T_shi_s =P20;sbit T_shi_g =P21;sbit T_feng_s =P22;sbit T_feng_g =P23;/09共阳极字形码(不带点),减0x80对应数值表示显示小数点uchar code table0=0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90;/09共阳极字形倒码(不带点)uchar code table1=0xc0, 0xcf, 0xa4, 0x86, 0x8b, 0x92, 0x90, 0xc7, 0x80, 0x82, 0x70;/*Cuchar twinkle =1;/控制时间显示时小数点的闪烁/*/功能显示一位数据/参数:uchar num 要显示的数据, uchar zf 是否带点(0不带,1带)/ uchar liangdu 显示时间用于控制亮度取(共NUM ms,显示liangdu,灭 NUM-liangdu)/返回:无void xianshi_yiwei(uchar num, uchar zf, uchar liangdu)if (zf)/带点显示P0 = table0num - 0x80;else/不带点显示P0 = table0num;delay_ms(liangdu);P0 = 0xff;/关闭显示,消影delay_ms(NUM-liangdu);/*/功能显示一位数据(用倒置的数码管)/参数:uchar num 要显示的数据, uchar zf 是否显示点(0-不显示,1-显示),/ uchar liangdu 显示时间用于控制亮度取(共NUM ms,显示liangdu,灭 NUM-liangdu)/返回:无void xianshi_yiwei_dao(uchar num, uchar zf, uchar liangdu)if (zf !=0)/带点显示P0 = table1num - 0x80;else/不带点显示P0 = table1num;delay_ms(liangdu);P0 = 0xff;/关闭显示,消影delay_ms(NUM-liangdu);/*/功能:显示时间/参数:uchar shi 小时, uchar fen 分钟, uchar miao /返回:无void shijian_xianshi(uchar shi, uchar fen)uchar temp=0;/分离个十位/显示小时if(Time.DS1302_shi0x09)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;/*/功能:显示调整状态时的时间 (要调的两位闪烁-调时,要调的一位闪烁-调闹钟)/参数:uchar shi 小时, uchar fen 分钟, uchar miao 秒, uchar clock_alarm 调的是时间还是闹钟/返回:无void xianshi_shijian_adjust(uchar shi, uchar fen, uchar clock_alarm)static uchar frequency=0;/用于闪烁控制uchar temp=0;/分离个十位uchar liang_mie_shi =NUM;/默认亮uchar liang_mie_feng =NUM;/默认亮 frequency+;if(frequency 40)/如果闪烁太快人眼可能看起来是一直亮的frequency=0;elseif(frequency 25)/frequency不要用于控制秒闪烁,秒闪烁频率小于点switch(state)/根据状态控制不同的位闪烁case 1:/闹钟的小时case 4:/时间的小时liang_mie_shi = 0;break;case 2:/闹钟的分钟case 5:/时间的分钟liang_mie_feng = 0;break;default : break;if(Time.DS1302_shi0x09)/显示小时temp = shi/16;/十进制转换为BCD码T_shi_s =LED_ON;if(clock_alarm =ADJUS_CLOCK)xianshi_yiwei(temp, 0, liang_mie_shi);/调时间闪烁elseif(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 =ADJUS_CLOCK)/调时间闪烁xianshi_yiwei_dao(temp, 1, liang_mie_feng);elseif(clock_alarm =ADJUS_ALARM)/调闹钟不闪烁xianshi_yiwei_dao(temp, 1, NUM);T_feng_s =LED_OFF;T_feng_g =LED_ON;temp = fen%16;xianshi_yiwei(temp, alarm_on_off, liang_mie_feng);T_feng_g =LED_OFF;/显示带一位小数的温度/说明:xianshi_temperature(10)则显示 10/参数:uint num要显示的数/返回:无void xianshi_num(uint num)uchar i=0;uchar j=0;/ j=num%10;/num /=10;/显示*C (温度单位)T_feng_s = LED_ON;xianshi_yiwei_dao(10, 0, NUM);/10-*CT_feng_s = LED_OFF;/低位 至 高位i =num%10;T_shi_g = LED_ON;xianshi_yiwei(i, 0, NUM);T_shi_g = LED_OFF;num /=10;if(num 0)i =num%10;T_shi_s = LED_ON;xianshi_yiwei(i, 0, NUM);T_shi_s = LED_OFF; T_feng_g = LED_ON;/xianshi_yiwei(j, 0, NUM);/T_feng_g = LED_OFF;/(4)闹钟模块程序#include naozhong.h#define BEEP_ON 0#define BEEP_OFF 1sbit BEEP =P26;/蜂呜器uchar integral_point_flag =0;/1-整点,0-闹钟/定义结构体用于存放闹钟时间struct calendar Naozhong =0x06, 0x30, 0x00;uchar alarm=0;/用于标记闹钟是否在响(1-在响,0-没响)/蜂呜器响void beep_on(void)BEEP =BEEP_ON; /打开蜂鸣器/蜂呜器关void beep_off(void)BEEP =BEEP_OFF; /关闭蜂鸣器/*/是否到了设定闹钟时间void alarm_clock(void)if(Time.DS1302_shi =0x06 & Time.DS1302_shi =2)/发生2次中断 num =0;key_long_press+;/增值键按下时间增加elseif( integral_point_flag=0)/闹钟状态num_niao+;if(num_niao1200)/闹钟响了一分钟则关闭integral_point_flag=2;/报时标志置于空闲num_niao=0;/计数器清零alarm =0; /取消闹钟 TR0 =0; /关闭定时器T0BEEP =BEEP_OFF; /关闹钟elseif(integral_point_flag=1)/整点报时状态numx+;if(numx%10 =0)BEEP = BEEP;if(Time.DS1302_shi 0x12) hour = Time.DS1302_shi -0x12;/13点换成一点.elsehour = Time.DS1302_shi;hour = 10*(hour/16) + hour%16;/BCD码表示的时间转换为10进制时间if(numx 20*hour)TR0 =0;/关闭定时器T0BEEP =BEEP_OFF; /关闭蜂鸣器integral_point_flag=2; /报时标志置于空闲numx =0;/计数器清零TR0 =1;(5) TLC1543程序#include TLC1543.hsbit TLC1543_SDO =P10;/TLC1543 串行数据线sbit TLC1543_ADDR =P11;/TLC1543 地址线(通道选择线)sbit TLC1543_CS =P12;/TLC1543 片选线(低电平有效)sbit TLC1543_CLK =P13;/TLC1543 时钟线sbit TLC1543_EOC =P14;/TLC1543 转换完成 /TLC1543初始化void TLC1543_Init(void)uchar i=0;TLC1543_CS =1;/不选中 TLC1543TLC1543_CLK =0;/*/读取第ain通道的ADC转换值/参数:uchar ain 转换通道 0-10/返回:转换的数字值uint TLC1543_ReadADC(uchar ain)uint dat=0;uchar i=0, j=0;uchar ch=0;/ain =4;/从高位开始传输ch =ain;/因为CPU读入的数据是芯片上次A/D转换完成的数据。/所以在使用多通道时至少读两次同一通道才能读到该通道的值for(i=0; i2; i+)dat =0;ch =ain;/TLC1543_EOC =1;TLC1543_CS =1;/关闭片选TLC1543_CS =0;/打开片选TLC1543_CLK =0;for (j=0; j10; j+)TLC1543_ADDR =(bit)(ch&0x80);/写地址ch =1;dat 0; i-) ;设计仿真结果时钟显示:温度显示:使用通用51单片机与专用单片机的区别 AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS 8位微处理器,128字节部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片振荡器与时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口与中断系统继续工作。由于应用广泛,所以价格低廉,性能可靠。STC15F204EA单片机是宏晶科技推出的新一代超低价A/D转换单片机,1个时钟/机器周期,高速、高可靠,8路10位高速A/D转换,部 高精度R/C时钟,1%温飘,彻底省掉外部昂贵的晶振,5MHz35MHz宽 围可设置。 部高精度R/C时钟,时钟从5M35MHz可选; 部高可靠复位,彻底省掉外部复位电路; 8通道,10位高速ADC,速度可达30万次/秒; 通用I/O口(26个),可设置成四种模式:准双向口 /弱上拉,推挽/强上拉,仅为输入/高阻,开漏实物展示零件图成品图心得体会随着科技带给人们生活上的便利越来越多,人们对数字时钟的要求也越来越高,多功能数字钟不管在性能还是在样式上都发生了质的变化,本次课程设计,由单片机作为数字钟的核心控制器,可以通过它的时钟信号进行计时实现整点报时、闹铃、温度显示、亮度调节等功能,将数据经单片机输出,利用四个LED数码管显示出来。 这次设计对我的理论和实践相结合的能力是一次提高,增加了把理论用于实践的兴趣,同时也提高了我分析问题和解决问题的能力。同时有人让我看到了跟多的不足,让我认识到了学习好C语言与单片机的必要。书山有路勤为径,通过这一次的课程设计之后,我以后会更加努力,用严谨的科学态度去面对一切。克服困难,战胜自我。23 / 24
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!