多功能数字钟最终报告.docx
- 文档编号:8645622
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:22
- 大小:86.75KB
多功能数字钟最终报告.docx
《多功能数字钟最终报告.docx》由会员分享,可在线阅读,更多相关《多功能数字钟最终报告.docx(22页珍藏版)》请在冰豆网上搜索。
多功能数字钟最终报告
课程设计
题目基于单片机的多功能数字钟设计
学生姓名任江彬学号1013014053
所在院(系)物理与电信工程学院
专业班级电子102
指导教师张志伟
完成地点陕西理工学院
2014年1月12日
多功能数字钟
设
计
报
告
摘要
多功能数字钟是以STC89C52RC单片机为核心控制器构成的新型数字化产品,由时钟模块、闹钟模块、键盘显示模块、电源模块、温度、电网电压和频率测量等模块组成。
时钟由内部定时器实现时间的计量,通过键盘和数码管可方便地校对时钟和设置闹钟时间,采用光电传感器实现非接触闹钟止闹功能。
通过对现场环境温度、电网频率、电压进行测量,实现电压欠压、过压报警。
一.方案比较与论证
系统设计包含时间计量、显示、温度测量、电网频率、电压测量等多个部分,下面对各部分设计方案做分析和选择。
(一)计时
方案一:
由51单片机实现时钟功能
先设定51单片机内部的一个定时器/计数器工作于定时方式,对机器周期计数形成基准时间,然后用另外一个定时器软件计数的方法对基准时间形成秒,秒计60次形成分钟,分钟计60次形成小时。
方案二:
专用时钟芯片
目前市场上已有很多实时时钟芯片,。
如DS12887、DS1302等,芯片内都集成了时钟/日历功能,给时钟系统设计带来很多方便。
考虑到成本以及编程方面的问题,因此选择方案一。
(二)温度采集
方案一:
采用集成温度传感器(如AD590等)测温,但是电路设计复杂。
方案二:
采用数字温度传感器DS18B20。
该传感器结构简单,不需外接电路,数据传输采用one-wire总线,可用一根I/O数据线传输数据,精度高,能满足题目1℃的要求,且分辨率较高,重复性和可靠性好。
数字化温度传感器具有与单片机接口方便、直接数字量输出等优点,因此选用方案二。
(三)键盘显示
1、键盘
方案一:
采用阵列式键盘,此类键盘是采用行列扫描方式,优点是当按键较多时可以降低占用单片机的I/O口数目,缺点是电路复杂且会加大编程难度。
方案二:
采用独立式按键电路,每个键单独占有一根I/O接口线,每个I/O口的工作状态互不影响,此类键盘采用端口直接扫描方式。
缺点是当按键较多时占用单片机的I/O数目较多,优点是电路设计简单,且编程极其容易。
由于该系统采用了常规钟表式的校对方式,用键较少,系统资源足够用,故采用了方案二。
2、显示
方案一:
数码管实现显示功能。
采用共阴数码管,用51单片的P0I/O口控制数码管的段选,P2I/O
口控制数码管的位选,同时用74LS245(数据缓冲器)增加I/O的驱动能力
方案二:
液晶显示器来实现显示功能。
液晶显示器来实现显示功能,不仅可以实现基本的显示信息,而且可以显示丰富的符号指示信息,如AM/PM,闹钟符号等,信息量丰富且直观易懂。
而且液晶显示有功耗低,体积小,重量轻,寿命长,不产生电磁辐射污染等优点。
由于数码管可以完成制作任务,经济耐用,完全能够满足电路显示功能。
因此采用方案一。
(四)非接触止闹功能
方案一:
采用声音控制实现非接触止闹功能,优点是方便,但由于声控存在灵敏度的问题,在现场条件差的环境中较容易引起误动作。
方案二:
采用光电开关实现非接触止闹功能,因为光电开关利用物体对红外线的反射,可检测到物体的有无,方便有效,人只需挥挥手就可产生信号,完成止闹功能。
考虑到止闹功能的准确性,因此采用方案二。
(五)电压、频率测量
交流电压的真有效值测量可采用AC-DC绝对值运放(AD536等)实现,因难于购买,方案采用由9v变压器变压后,经全桥整流滤波,由A/D转换器ADC0832实现电压有效值测量。
电网频率是通过变压器、过零比较器处理后得到方波信号,对此方波信号进行频率测量,进而得到电网频率。
二.系统总体设计
系统框图如图所示。
系统方框图
系统工作原理:
系统上电自检后,数码管实时实现时、分、秒的数字显示以及LED对AM/PM和闹钟开关的显示,通过按键可实现校对时间、设置闹钟时间、闹钟开、闹钟关的设定以及进行现场温度、电网频率、电压值的测量和显示。
当闹钟时间到和出现电网电压欠压、过压报警时,通过发光二极管、蜂鸣器来实现声、光报警。
三、系统模块设计
1、键盘接口电路设计
键盘电路设计如图所示。
键盘电路设计
模式键:
第一次按键开始校对小时;第二次按键开始校对分钟;第三次按键开始校对秒钟;第四次按键开始校对闹钟小时;第五次按键开始校对闹钟分钟;第六次按键切换现场温度显示;第七次按键切换电网电压显示;第八次按键切换电网频率显示;第九次按键回到初始计时界面。
加键:
当切换校对时钟时、分、秒和闹钟时、分时可进行加一操作。
减键:
当切换校对时钟时、分、秒和闹钟时、分时可进行减一操作。
闹钟开关键:
按键确定闹钟的开、关。
2、显示器电路设计
系统采用数码管显示。
数码管与单片机接口电路如图所示。
数码管显示电路
3、温度测量电路设计
温度测量传感器采用DALLAS公司DS18B20的单总线数字化温度传感器,测温范围为-55℃~125℃,可编程为9位~12位A/D转换精度,测温分辨率达到0.0625℃,单片机只需一根I/O口线便能与DS18B20通信,占用单片机I/O口线少,可节省大量引线和逻辑电路。
接口电路如图所示。
单片机与DS18B20接口电路
4、电网频率测量
交流220V电压经变压器降压后,LM393过零比较器,将电网正弦波整成方波信号,此信号频率即为当前电网电压频率。
将此脉冲信号由LM393输出到单片机的INT1(P3.3)端口,经编程计算出1s外部中断的次数即为电网的频率。
正弦波变方波电路
5、电网电压测量
原理:
交流220V电压经变压器降压后,整流滤波,取滤波后的有波动的直流电压信号,用A/D转换器ADC0832,实现时时对电网电压进行检测。
设测量最高电压值为255V,通过9V产生交流电压U`经整流滤波后,用电阻分压,取5V电压为ADC0832的满量程输入。
由ADC0832进行A/D转换,将得到的数字量送入单片机,处理得到电压值并显示。
电网电压测量电路
6、非接触止闹电路设计
当闹钟定时到点时,会触发声报警,系统设计时采用漫射光电传感器ST188检测人体和遥控止闹行为。
当人体靠近传感器3cm以内或红外遥控器遥控时,单片机会检测到传感器信号,自动发出停止闹钟行为。
7、报警功能
当闹钟定时到点时,会触发声报警,电路如图所示。
8、5V电源电路设计
将220V、50HZ的市电用9V变压器变压后以全波整流电路作为整流网络,以极性电容作为滤波网络,采用固定式三端集成稳压电路7805得到5V直流稳压电源。
选用4个1N4007整流二极管组成桥式整流电路。
选1000uF/25V的电解电容作为滤波电容。
7805输入端加0.33uF电容,防止电路产生自激振荡,输出端的电容用于消除电压中的高频噪声,以便输出较大的电流脉冲。
电源电路设计
四.系统测试
1、测试及制作中所用仪器:
数字示波器
数字万用表
函数发生器
直流稳压电源
PC机一台
温度计、秒表、烙铁等
2、测试结果
(1)基本要求
1上电复位后,由显示信息可知达到数字显示时间、AM/PM显示、闹钟开、关状态、闹钟灯熄灭的显示要求,
2按“模式”键,可进行时间设定,能在新的时间点上运行,实现时间设置功能;
3按“模式”键,可进行闹钟时间设定,能在新的时间点到达时,发声报警,实现闹钟设置功能;
4按“闹钟开关”键,闹钟指示灯随之相应进行“亮”、“灭”切换,如果“闹钟关”,时间到达闹钟设置值时,系统没有发出声报警;如果“闹钟开”,时间到达闹钟设置值时,系统发出声报警,实现闹钟开、关控制。
(2)发挥部分
1按“模式”键,数码管由主界面显示进入温度显示界面,能准确显示出当前的环境温度,继续按模式键返回时钟显示主界面;
2按“模式”键,数码管由主界面显示进入电网电压、频率测量显示界面,能准确显示出当前的电网电压、频率值,继续按模式键返回时钟显示主画面;
3
在电压欠压、过压时能报警;
4当闹钟启动时,在止闹的光电传感器前方30MM内晃一下手,闹钟立即停闹,实现非接触止闹功能。
或者用自制的红外遥控器,也可实现
非接触止闹
五、经验及教训
通过此次多功能数字钟设计制作,我将从书本上学到的知识应用于实践,学会了一些电子电路仿真设计能力,虽然过程中遇到了一些困难,但是在解决这些问题的过程无疑也是对我自身专业素质的一种提高。
当最终调试成功的时候也是对我们的一种肯定。
此次的课设不仅增强了我在专业设计方面的信心,鼓舞了我,更是一次兴趣的培养。
另外在这次实验中我遇到了不少的问题针对不同的问题我采取不同的解决方法,最终一一解决设计中遇到的问题。
在我遇到不懂的问题时,利用网上的资源,搜索查找得到需要的信息,和同学之间相互讨论。
这次的制作也让我们感受到,我们在电子方面学到的只是很小的一部分知识,我们需要更多的时间来学习知识,学习技术。
六.参考文献:
1.郭天祥《新概念51单片机C语言教程》.电子工业出版社
2.丁向荣《STC系列增强型8051单片机原理与应用》.电子工业出版社
3.李建忠《单片机原理及应用》.西安电子科技大学出版社
4.童诗白、华成英《模拟电子技术基础(第四版)》.高等教育出版社
5.阎石《数字电子技术基础(第五版)》.高等教育出版社
程序:
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitAM=P1^1;//AM指示灯
sbitPM=P1^0;//PM指示灯
sbitk=P1^2;//非接触止闹
sbitkey1=P1^3;//设置键
sbitkey2=P1^4;//加1键
sbitkey3=P1^5;//减1键
sbitkey4=P1^6;//闹钟开关
sbitring=P1^7;//闹钟开关指示灯
sbitfm=P3^0;//过压欠压报警
sbitCLK=P3^2;
sbitDI=P3^5;
sbitDO=P3^4;
sbitCS=P3^1;
sbitDQ=P3^6;//温度传感器
sbitfmq=P3^7;//闹钟蜂鸣器
bitringoff;
floattt;
uintt;
uinttemp;
uintadc;
uintm;//频率
uintn;//电压采样次数
uintd;//电压
ucharnum,cout,keynum;
ucharhour,min,sec;//时分秒
ucharn_hour,n_min;//闹钟时分秒
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//0-9数字
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,//0-9数字带小数点
0x40,0x39,0x76,0x3e};//-,c,H,U
voiddelay(uintz)//1ms延时函数
{
uintx;
for(z;z>0;z--)
for(x=110;x>0;x--);
}
/*****************************/
voidinit_DS18B20()//初始化
{uinti;
DQ=0;
i=103;
while(i>0)i--;
DQ=1;
i=4;
while(i>0)i--;
}
bitreadbit()//读1位数据
{uinti;
bitdat;
DQ=0;i++;//i++起延时作用
DQ=1;i++;i++;
dat=DQ;
i=8;while(i>0)i--;
return(dat);
}
uchartempread()//读1个字节数据
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{j=readbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
voidtempwrite(uchardat)//写1个字节
{ucharj;
uinti;
bittest;
for(j=1;j<=8;j++)
{
test=dat&0x01;
dat=dat>>=1;
if(test)//写1
{DQ=0;
i++;i++;
DQ=1;
i=8;while(i>0)i--;
}
else//写0
{DQ=0;
i=8;while(i>0)i--;
DQ=1;
i++;i++;
}
}
}
uintgettemp()//读温度数据
{uchara,b;
init_DS18B20();
delay
(1);
tempwrite(0xcc);//写跳过读ROM指令
tempwrite(0x44);//写温度转换指令
init_DS18B20();
delay
(1);
tempwrite(0xcc);
tempwrite(0xbe);
a=tempread();
b=tempread();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;//分辨率0.0625
t=tt*10+0.5;
return(t);
}
uintad0832()//ADC0832驱动函数
{
uchark;
CS=0;
CLK=0;
CLK=1;
DI=1;
CLK=0;
CLK=1;
DI=1;
CLK=0;
CLK=1;
DI=0;
CLK=1;
CLK=0;
for(k=0;k<16;k++)
{
CLK=1;
CLK=0;
if(DO)
adc=(adc>>1)|0x80;
else
adc=(adc>>1)|0x00;
}
CS=1;
return(adc);
}
voidinit()//初始化函数
{ringoff=1;
num=0;
n=50;//电压采样50次
cout=0;
keynum=0;
hour=12;min=0;sec=0;
n_hour=0;n_min=0;
TMOD=0x01;//定时器0,工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
IT1=1;//下降沿触发
EA=1;//开总中断
ET0=1;//开定时器0中断
EX1=1;//开计外部1中断
TR0=1;//启动计数器0
}
voidT0_time()interrupt1//定时器0中断函数
{TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==20)
{num=0;sec++;
EX1=0;//关闭外部1中断
m=cout;//计数值放入变量
cout=0;
EX1=1;//开计外部1中断
if(sec==60)
{sec=0;min++;
if(min==60)
{min=0;hour++;
if(hour==24)
{hour=0;}
}
}
}
}
voidT1_time()interrupt2//外部中断1函数
{
cout++;
}
voidkey()//按键函数
{if(key1==0)
{delay(10);
if(key1==0)
{P0=0x00;
delay(5);
keynum=keynum+1;
TR0=0;
while(!
key1);
if(keynum>=4)TR0=1;
if(keynum==9){keynum=0;}
}
}
if(keynum==0)
{
if(hour>=12){AM=1;PM=0;}
else{AM=0;PM=1;}
}
else{AM=1;PM=1;}
if(keynum!
=0)
{if(key2==0)//时间加1
delay(10);
if(key2==0)
{P0=0x00;
delay(5);
while(!
key2);
if(keynum==1)
{hour++;if(hour==24)hour=0;}
if(keynum==2)
{min++;if(min==60)min=0;}
if(keynum==3)
{sec++;if(sec==60)sec=0;}
if(keynum==4)
{n_hour++;if(n_hour==24)n_hour=0;}
if(keynum==5)
{n_min++;if(n_min==60)n_min=0;}
}
if(key3==0)//时间减1
delay(10);
if(key3==0)
{P0=0x00;
delay(5);
while(!
key3);
if(keynum==1)
{hour--;if(hour==-1)hour=23;}
if(keynum==2)
{min--;if(min==-1)min=59;}
if(keynum==3)
{sec--;if(sec==-1)sec=59;}
if(keynum==4)
{n_hour--;if(n_hour==-1)n_hour=23;}
if(keynum==5)
{n_min--;if(n_min==-1)n_min=59;}
}
}
if(key4==0)
delay(10);
if(key4==0)
{P0=0x00;
delay(5);
while(!
key4);
ringoff=~ringoff;
ring=~ring;
}
if(ringoff==0)
{if(k==0)
delay(10);
if(k==0)
{P0=0x00;
delay(5);
while(!
k);
ringoff=1;
ring=1;
}
}
}
voiddisplay()//显示函数
{if(keynum==4||keynum==5)
{
P2=0x7f;
P0=table[n_hour/10];
delay
(2);
P0=0x00;//消隐
P2=0xbf;
P0=table[n_hour%10];
delay
(2);
P0=0x00;//消隐
P2=0xdf;
P0=table[20];
delay
(2);
P0=0x00;//消隐
P2=0xef;
P0=table[n_min/10];
delay
(2);
P0=0x00;//消隐
P2=0xf7;
P0=table[n_min%10];
delay
(2);
P0=0x00;//消隐
}
elseif(keynum==6)
{temp=gettemp();
delay
(2);
P2=0xf7;
P0=table[temp/100];
delay
(2);
P0=0x00;//消隐
P2=0xfb;
P0=table[temp%100/10+10];
delay
(2);
P0=0x00;//消隐
P2=0xfd;
P0=table[temp%10];
delay
(2);
P0=0x00;//消隐
P2=0xfe;
P0=table[21];//C
delay
(2);
P0=0x00;//消隐
}
elseif(keynum==7)
{unsignedintSUM;
unsignedinti,j;
j=ad0832();
SUM=SUM+j;
if(i==0)//采集50次数据之后取平均值
{
d=SUM/n;
SUM=0;
i=n;
}
i--;
P2=0xf7;
P0=table[d/100];
delay
(2);
P0=0x00;//消隐
P2=0xfb;
P0=table[d%100/10];
delay
(2);
P0=0x00;//消隐
P2=0xfd;
P0=table[d%10];
delay
(2);
P0=0x00;//消隐
P2=0xfe;
P0=table[23];//U
delay
(2);
P0=0x00;//消隐
}
elseif(keynum==8)
{
P2=0xfb;
P0=table[m/10];
delay
(2);
P0=0x00;//消隐
P2=0xfd;
P0=table[m%10];
delay
(2);
P0=0x00;//消隐
P2=0xfe;
P0=table[22];//H
delay
(2);
P0=0x00;//消隐
}
else
{P2=0x7f;
P0=table[hour/10];
delay
(2);
P0=0x00;//消隐
P2=0xbf;
P0=table[hour%10];
delay
(2);
P0=0x00;//消隐
P2=0xdf;
P0=table[20];
delay
(2);
P0=0x00;//消隐
P2=0xef;
P0=table[min/10];
delay
(2);
P0=0x00;//消隐
P2=0xf7;
P0=table[min%10];
delay
(2);
P0=0x00;//消隐
P2=0xfb;
P0=table[20];
delay
(2);
P0=0x00;//消隐
P2=0xfd;
P0=table[sec/10];
delay
(2);
P0=0x00;//消隐
P2=0xfe;
P0=table[sec%10];
delay
(2);
P0=0x00;//消隐
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多功能 数字 最终 报告