电子技术综合实践.docx
- 文档编号:4202804
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:44
- 大小:192.95KB
电子技术综合实践.docx
《电子技术综合实践.docx》由会员分享,可在线阅读,更多相关《电子技术综合实践.docx(44页珍藏版)》请在冰豆网上搜索。
电子技术综合实践
山东科技大学
电子技术综合实践报告
设计题目:
多功能数字电子表
专业:
班级学号:
学生姓名:
指导教师:
设计时间:
小组成员:
多功能数字电子表
一、设计任务与要求
1.实践任务:
运用单片机89c52实现多功能电子表的设计与运行
2.基本要求:
显示时分秒,时间调节与设置功能,秒表功能,计数功能,闹钟功能。
3.提高要求:
运用18b20芯片实时监测周围温度。
二、方案设计与论证
1.整体方案论证
本数字电子表系统以stc89c52单片机为核心控制器,对系统进行初始化,完成对按键,led数码管显示的控制等功能,以及完成各模块通信协调的功能,时钟芯片da1302不断将时间信号送往单片机,然后单片机通过
Led数码管将时间显示出来,按键将信号传递给单片机处理,借以实现对时间的设置,可以对年,月,日,时,分,秒进行设定,还可以通过对闹钟时间进行设置实现定时闹钟的功能,通过温度传感器将温度信号传递给单片机,然后单片机通过led数码管将温度显示出来,达到温度显示的功能。
另外,秒表功能有开始,中止,复位来控制,以led数码管显示,计数器则由按键控制计数。
最终由6v电源供电。
最终实现以下6个功能:
1)实现电子表的时,分,秒的显示
2)实现电子表对时间等的设定
3)实现秒表功能
4)实现计数器功能
5)实现闹钟报警功能
6)实现温度实时监测显示功能
2.模块的分类
1)stc89c52单片机主控模块
设计初期,我们有如下两种以单片机为核心的主控方式可选:
1.采用stc89c52单片机作为数字电子表主控核心,运用flashrom,搭载有4Kbrom内部存储空间,能够在3v的低压电源下工作,与mcs-52系列单片机具有完全兼容性,缺点是没有isp在线编程技术,运用于电路设计时,如果对程序进行增添新功能或修改程序不方便控制。
2.采用stc89c52单片机作为数字电子表主控核心,搭载flashrom为片内rom,在6v电源工作,对于编程技术可以有效的修改的方式。
综上考虑选择第二种。
2)DS1302时钟电路模块
在时钟电路模块的设计中,我也想了两种方案:
1.利用单片机本身自带功能实现定时计数功能,通过程序编写来实现对年,月,日,时,分,秒的计时。
通过外部晶振提供准确时钟,采用11.0592的晶振。
但是不宜断电保护。
2.采用时钟芯片ds1302进行计时,然后时间信号交给单片机处理通过led数码管显示出来。
此方案中ds1302性价比高,性能优越,耗电量少,具有计时功能,还有闰年补偿功能,节省了单片机资源且便宜,但控制难度增加。
综合考虑选择第二种方案。
3)led数码管显示模块
开始有led数码管和lcd液晶显示屏两种方案,由于对led数码管更为熟悉好用,选择方案一。
4)温度测试模块闹钟模块
采用了方便易用且价格低廉的数字温度传感器ds18b20实现。
优点是使用方便,报警选择蜂鸣器。
5)键盘扫描电路模块
该电路通过编写相应的程序即能实现功能,在此不再赘述。
三、电路设计原理
1)元器件
Stc89c52单片机一个
Ds1302时钟芯片一个
Ds18b20温度芯片一个
led数码管六个
蜂鸣器一个
按键三个
2)电路图原理图
四、软件编程
1.软件流程图
否是
是
否
是
否
2.实物图
3.主程序
/*====================================================================
调试要求:
1.MCU:
AT89S52芯片或AT89C52
2.晶振:
12MHz
功能:
多功能时钟+温度计
====================================================================*/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitdis_bit1=P2^7;//定义数码管控制口
sbitdis_bit2=P2^6;//定义数码管控制口
sbitdis_bit3=P2^4;//定义数码管控制口
sbitdis_bit4=P2^3;//定义数码管控制口
sbitdis_bit5=P2^1;//定义数码管控制口
sbitdis_bit6=P2^0;//定义数码管控制口
sbitled1_bit=P2^2;//定时LED的控制口
sbitled2_bit=P2^5;//定时LED的控制口
sbits1_bit=P1^0;//定义S1控制口
sbits2_bit=P1^1;//定义S2控制口
sbits3_bit=P1^2;//定义S3控制口
sbitdq_ds18b20=P3^3;//定义控制DS18B20
sbitspeak=P3^7;//定义蜂鸣器控制口
sbitclk_ds1302=P3^6;//定义控制DS1302的时钟线
sbitio_ds1302=P3^5;//定义控制DS1302的串行数据
sbitrest_ds1302=P3^4;
#definesmg_dataP0//定义数码管数据口
voiddelay_3us();//3US的延时程序
voiddelay_8us(uintt);//8US延时基准程序
voiddelay_50us(uintt);//延时50*T微妙函数的声明
voiddisplay1(uchardis_data);//数码管1显示子程序
voiddisplay2(uchardis_data);//数码管2显示子程序
voiddisplay3(uchardis_data);//数码管3显示子程序
voiddisplay4(uchardis_data);//数码管4显示子程序
voiddisplay5(uchardis_data);//数码管5显示子程序
voiddisplay6(uchardis_data);//数码管6显示子程序
voidinit_t0();//定时器0初始化函数
voiddis_led();//LED处理函数
voidjudge_s1();//S1按键处理函数
voidjudge_s2();//S2按键处理函数
voidjudge_s3();//S3按键处理函数
voiddis(uchars6,uchars5,uchars4,uchars3,uchars2,uchars1);//显示子程序
voiddis_san(uchars6,uchars5,uchars4,uchars3,uchars2,uchars1,ucharsan);//闪烁显示子程序
voidjudge_dis();//显示处理函数
voidjudge_clock();//显示处理函数
voidset_ds1302();//设置时间
voidget_ds1302();//读取当前时间
voidw_1byte_ds1302(uchart);//向DS1302写一个字节的数据
ucharr_1byte_ds1302();//从DS1302读一个字节的数据
//***********************************************************************
//DS18B20测温函数定义
voidw_1byte_ds18b20(ucharvalue);//向DS18B20写一个字节
ucharr_1byte_ds18b20(void);//从DS18B20读取一个字节的数据
voidrest_ds18b20(void);//DS18B20复位程序
voidreadtemp_ds18b20(void);//读取温度
voiddis_temp();//温度显示函数
//共阳数码管断码表
constuchartabl1[16]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,
//012345
0x82,0xf8,0x80,0x90,0x86,0x87,0xFF,
//6789ETB
0xc6,0xbf,0xff};
//C-
constuchartabl3[]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,
0x04,0x05,0x06,0x06,0x07,0x08,0x08,
0x09,0x09};//温度内部计算用
uchart0_crycle;
ucharhour_count,minute_count,second_count,msecond_count;
ucharclock_hour,clock_minute;
ucharcountdown_second;
ucharcountdown_hour,countdown_minute;
ucharclock_en;//闹钟关闭和开启的标志,1开启,0关闭
ucharflag1,second_flag,zancun1,zancun2,zancun3;
ucharzancun4,zancun5,zancun6,zancun7;
ucharclock_flag,countdown_flag;
ucharmsecond_minute,msecond_second,msecond_msecond,msecond_flag;//秒表相关参数
uintspeak_count;
uchartempl,temph,temp_flag;
uchart_b,t_s,t_g,t_x,temp_flag2;//从左到右分别存储温度百位,十位,个位,小数位
uchartab23[3];//={0x40,0x59,0x23,0x28,0x11,0x06,0x09};//上电时默认的时间
//主程序
voidmain()
{
P3=0x00;
flag1=0;
zancun3=0;
msecond_minute=0;//置秒表相关参数为0
msecond_second=0;
msecond_msecond=0;
speak=1;//关闭蜂鸣器
speak_count=0;
clock_hour=0;
clock_minute=0;
clock_flag=0;
countdown_flag=0;//倒计时标志位为0
clock_en=0;//开机时默认关闭闹钟
init_t0();
TR0=1;//
//set_ds1302();//设置DS1302的初始时间
//接下来开始编写让数码管显示的程序
while
(1)
{
get_ds1302();
judge_dis();//显示处理
judge_s1();
judge_s2();
judge_s3();
judge_clock();//闹钟处理程序
}
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0_crycle++;
if(t0_crycle==2)//0.1秒
{
t0_crycle=0;
msecond_flag=1;
msecond_count++;
if(msecond_count==10)//1秒
{
msecond_count=0;
second_flag=1;
}
}
}
//**************************************************
//显示处理函数
voidjudge_dis()
{
if(flag1==0)
{
if(second_flag==1)
{
zancun7++;
second_flag=0;
}
if(zancun7<1)
{
if(temp_flag2==1)
{
readtemp_ds18b20();//读取温度
temp_flag2=0;
}
dis_temp();//温度显示函数
}
if(zancun7>=1)
{
temp_flag2=1;
zancun4=hour_count&0xf0;
zancun4>>=4;
zancun5=minute_count&0xf0;
zancun5>>=4;
zancun6=second_count&0xf0;
zancun6>>=4;
dis(zancun4,hour_count&0x0f,zancun5,minute_count&0x0f,zancun6,second_count&0x0f);
dis_led();
if(zancun7==5)zancun7=0;
}
}
if(flag1!
=0)
{
switch(flag1)
{
case1:
dis(5,10,11,1,12,12);//显示SET1
led1_bit=1;
led2_bit=1;
break;
case2:
dis(5,10,11,2,12,12);//显示SET2
break;
case3:
dis(5,10,11,3,12,12);//显示SET3
break;
case4:
dis(5,10,11,4,12,12);//显示SET4
break;
case5:
dis(5,10,11,5,12,12);//显示SET5
break;
case6:
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,1);
break;
case7:
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,2);
break;
case8:
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,3);
break;
case9:
//进入修改时间,时间分位个位闪烁
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,4);
break;
case10:
//进入修改闹钟,闹钟小时十位闪烁
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,1);
break;
case11:
//进入修改闹钟,闹钟小时个位闪烁
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,2);
break;
case12:
//进入修改闹钟,闹钟小时十位闪烁
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,3);
break;
case13:
//进入修改闹钟,闹钟小时个位闪烁
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,4);
break;
case14:
//进入修改闹钟的开关
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,6);
break;
case15:
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,zancun3/10,zancun3%10,1);
break;
case16:
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,zancun3/10,zancun3%10,2);
break;
case17:
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,zancun3/10,zancun3%10,3);
break;
case18:
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,zancun3/10,zancun3%10,4);
break;
case19:
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,zancun3/10,zancun3%10,5);
break;
case20:
dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,zancun3/10,zancun3%10,6);
break;
case21:
if(second_flag==1)
{
second_flag=0;
countdown_second--;
if(countdown_second==255)
{
countdown_second=59;
countdown_minute--;
if(countdown_minute==255)
{
countdown_minute=59;
countdown_hour--;
if(countdown_hour==255)
{
flag1=22;
countdown_minute=0;
countdown_hour=0;
countdown_second=0;
countdown_flag=1;
}
}
}
}
dis(countdown_hour/10,countdown_hour%10,countdown_minute/10,countdown_minute%10,countdown_second/10,countdown_second%10);//
break;
case22:
if(countdown_flag>0&&countdown_flag<7)
{
speak=0;
if(second_flag==1)
{
second_flag=0;
countdown_flag++;
}
}
else
{
speak=1;
}
dis(countdown_hour/10,countdown_hour%10,countdown_minute/10,countdown_minute%10,countdown_second/10,countdown_second%10);//
break;
case23:
dis(msecond_minute/10,msecond_minute%10,msecond_second/10,msecond_second%10,msecond_msecond%10,12);
break;
case24:
if(msecond_flag==1)
{
msecond_flag=0;
msecond_msecond++;
if(msecond_msecond==10)
{
msecond_msecond=0;
msecond_second++;
if(msecond_second==60)
{
msecond_second=0;
msecond_minute++;
if(msecond_minute==100)
{
msecond_minute=99;
flag1=23;
}
}
}
}
dis(msecond_minute/10,msecond_minute%10,msecond_second/10,msecond_second%10,msecond_msecond%10,12);
break;
case25:
dis(zancun3/10,zancun3%10,zancun2/10,zancun2%10,zancun1/10,zancun1%10);
break;
default:
break;
}
}
}
//**************************************************
//S1按键处理函数
voidjudge_s1()
{
s1_bit=1;//置IO为1,准备读入收据
if(s1_bit==0)//判断是否有按键按下
{
delay_50us
(1);//延时,去除机械抖动
if(s1_bit==0)
{
switch(flag1)
{
case0:
case1:
case2:
case3:
case4:
case6:
case7:
case8:
case10:
case11:
case12:
case13:
case15:
case16:
case17:
case18:
case19:
flag1++;
break;
case9:
flag1=6;
break;
case14:
flag1=10;
break;
case20:
flag1=15;
break;
case5:
case21:
case22:
case23:
//系统从秒表状态复位
case24:
//系统从秒表状态复位
case25:
//系统从计数器复位
flag1=0;
break;
default:
break;
}
while(s1_bit==0)
{
judge_dis();
}//等待按键释放
}
}
}
//**************************************************
//S2按键处理函数
voidjudge_s2()
{
s2_bit=1;//置IO为1,准备读入收据
if(s2_bit==0)//判断是否有按键按下
{
delay_50us
(1);//延时,去除机械抖动
if(s2_bit==0)
{
switch(flag1)
{
case1:
//在显示SET1状态下按S2件,进入修改时间
flag1=6;
z
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子技术 综合 实践