基于89C52的时间及温度系统设计特酷吧.docx
- 文档编号:6202478
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:27
- 大小:144.41KB
基于89C52的时间及温度系统设计特酷吧.docx
《基于89C52的时间及温度系统设计特酷吧.docx》由会员分享,可在线阅读,更多相关《基于89C52的时间及温度系统设计特酷吧.docx(27页珍藏版)》请在冰豆网上搜索。
基于89C52的时间及温度系统设计特酷吧
XXX学院
课程设计任务书
题目基于89C52的时间及温度系统设计
专业、班级:
学号:
姓名:
主要内容:
1、根据学习的理论知识选择设计内容。
2、分析题目,画出仿真图,写出程序代码。
3、下载程序仿真、修正。
基本要求:
1、要设计相对复杂的原理图。
2、用C语言或者汇编语言编写。
3、书写课程设计报告。
主要参考资料:
《单片机原理及应用设计教材》
《单片机原理及应用设计实验指导书》
《单片机原理及应用设计课程设计指导书》
完成期限:
2011-1-7
指导教师签名:
课程负责人签名:
2010年12月26日
摘要
本文来自特酷吧:
欢迎访问,您的支持是我最大的动力!
近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点。
因此特别适合于与控制有关的系统,,越来越广泛地应用与自动控制、智能化仪器、仪表、数据采集、军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
而51系列单片机是单片机的家族的中最为典型和最具有代表性的一种,通过本次课程设计进一步对单片机学习和应用,从而更熟悉单片机的原理和相关设计本提高开发软、硬件的能力。
本课程设计主要设计一个基于89C52单片机的电子时钟,并在LED上显示,以及温度的测控等应用Proteus软件进行设计与仿真。
关键词:
单片机89C51电子时钟温度测控
目录
第一章设计内容及要求4
第一节:
设计题目:
基于89C52的时间及温度系统设计4
第二节:
设计目的4
第三节:
设计内容4
第四节:
设计要求4
第二章设计思路及原理5
第一节:
概述、设计思路5
第二节:
系统组成与工作原理5
第三章软件设计6
第四章调试所需的仪器设备23
第五章设计的难点和可能出现的问题23
第六章预期达到的性能指标23
第七章设计总结及心得24
第八章参考文献25
第一章设计内容及要求
第一节:
设计题目:
基于89C52的时间及温度系统设计
第二节:
设计目的
1.掌握一般电路及编程的设计步骤;
2.熟悉课本知识理解并应用;
3.进行动手练习。
4.培养大学生的团队合作能力。
第三节:
设计内容
1.画出硬件电路图;
2.写出程序
3.根据进行必要的电路仿真,检测是否符合要求
第四节:
设计要求
1、要设计相对复杂的原理图。
2、用C语言或者汇编语言编写。
3、书写课程设计报告。
第二章设计思路及原理
一、概述、设计思路
该设计方案是以MC51单片机为核心,采用数码管显示系统,辅以闹钟模块,温度采集模块、键盘时间调整预设置等模块,所构建的数字时钟系统,能动态显示实时时钟的时、分、秒,数据显示对闹铃方式与温度调节模块进行了重点设计实现S0、S1、S2、S3四个键实现时钟正常显示,调时,闹钟时间设置及温度上下限的调整。
本系统设计大部分功能有软件来实现,使电路简单明了,系统稳定性也得大大提高。
二、系统组成与工作原理
1、工作原理:
本设计采用STC89C51单片机作为本次课程设计的控制模块。
单片机可把由DS18B20、时钟中的数据利用软件来进行处理,从而把数据传输到显示模块,实现温度、闹铃的显示。
以数码管为显示模块,把单片机传来的的数据显示出来,并且显示多样化,在显示电路中,主要靠按键来实现各种显示要求的选择与切换。
2、系统设计电路图:
第三章软件设计
#include"reg52.h"
#include"intrins.h"//包含_nop_的头文件,即延迟一个机器周期
#defineucharunsignedchar
#defineuintunsignedint
//变量的定义及宏编码//
///////////////////////////////////////////////////////////////////////////
sbitdula=P2^6;
sbitwela=P2^7;
sbitspeaker=P2^3;
sbits4=P3^4;//定义按键的输入端S4键条模式
sbits5=P3^5;//定义按键的输入端S5键加一
sbits6=P3^6;//定义按键的输入端S6键复位
sbits7=P3^7;//定义按键的输入端S7键键一
sbitds=P2^2;//温度传感器信号线
ucharwendu[10];
inttemp;//读取的温度
intwendu_up;
intwendu_down;
intyanchi;//用在最后的中断中,与上电后温度测量有关
unsignedchardispbuf[6]={0,0,0,0,0,0};//显示的缓冲区
unsignedcharsecond,minute,hour;//时钟各成员
unsignedchars_second,s_minute,ss_second;//秒表各成员
unsignedcharsecond100;
unsignedcharalarmhour,alarmminute,alarmsecond;//闹钟定时各成员
unsignedcharcount;//按键计数,每按一下,count加1,变换一种状态
unsignedcharpinlv;//闹钟音色调节调节的数字只是一个数字化的概念不代表真实音色
unsignedcharpinlvcount;//蜂鸣器发声计数
unsignedcharalarmcount;//闹铃时间计数以分钟计数
unsignedcharalarmsheding;//闹铃长度设定
unsignedchark=0xfe;//流水灯初值
unsignedcharj;
unsignedcharlength;//闹铃间隔时长
bitflag=0;//控制小数点显示
unsignedcharalarm;//闹铃标志位
bits_clock_flag;//秒表标志位
//位选通码
G_code[]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0xBF,0X7F};
//段选通码
L_code[]={0xed,0x81,0xf4,0xb5,0x99,0x3d,0x7d,0x85,0xfd,0xbd};
//函数声明//
///////////////////////////////////////////////////////////////////////////
voidinit();
voidint_init();//初始化
voiddelay10ms(void);
voidkey();//按键
voiddelay(uintz);
voiddiaplay_led();
voiddisplay();//显示
voidclock();
voidclockset();//时钟设定
voidshowchange();//换屏显示
voidtempdelay(uchar);//延迟函数
voidInit_DS18B20();//初始化DS18B20
bitread_bit();//读一位
ucharread_byte();//读一字节
voidwrite_byte(uchar);//写一个字节
voidget_temperature();//得到温度值
////////////////////////////////////////////////////////////////////////
///////////////////////变量初始化//////////////////////////////////////
voidinit()//各种标志及变量初始化
{
ss_second=0;
s_second=0;
s_minute=0;//秒表初始化
second=40;
minute=59;
hour=17;//时钟初始化
second100=0;
alarmhour=18;
alarmminute=0;
alarmsecond=0;//闹钟时间初始化
speaker=1;
alarm=0;
pinlv=5;//闹钟频率初始化为5
pinlvcount=0;
alarmcount=0;
alarmsheding=1;
s_clock_flag=0;
length=2;//闹钟时间间隔长度为2
yanchi=0;
//****************//
wendu_up=270;//设定初始化的温度上限是40度
wendu_down=10;//设定的初始化的温度下限1度
}
voidint_init()//定时器初始化
{
TMOD=0X11;//设定定时器工作方式1
TH0=0XD8;//设定定时器初值
TL0=0Xf4;
TR0=1;//T0运行控制位
EA=1;//开中断
ET0=1;//定时/计数器T0中断允许位;
}
voiddelay10ms(void)//延时程序
{
unsignedchari,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
voidkey()//按键判断程序
{
if(s4==0)//判断是否按下键盘
{
delay10ms();//延时,软件去干扰
if(s4==0)//确认按键按下
{
count++;//按键计数加1
if(count==13)//计10次重新计数,代表六种设定模式//重新规划count计数14,挤满14时归零
{
count=0;//将count清零
}
}
while(s4==0);//按键锁定,每按一次count只加1.
}
if(s5==0)//判断是否按下键盘
{
delay10ms();//延时,软件去干扰
if(s5==0)//确认按键按下
{
switch(count)//在各状态下执行加法,在秒表状态下表示开始于暂停
{
case1:
if(hour<23)
hour++;//当前时间的小时加
else
hour=0;
break;
case2:
if(minute<59)
minute++;//当前时间的分钟加
else
minute=0;
break;
case3:
if(second<59)
second++;//当前时间的秒加
else
second=0;
break;
case4:
if(alarmhour<23)//闹钟时间的小时加
alarmhour++;
else
alarmhour=0;
break;
case5:
if(alarmminute<59)
alarmminute++;//闹钟时间的分钟加
else
alarmminute=0;
break;
case6:
if(alarmsecond<59)
alarmsecond++;
else//闹钟时间的秒加
alarmsecond=0;
break;
case7:
if(alarmsheding<11)
alarmsheding++;//闹铃时间长度设定0--10分钟之间
else
alarmsheding=0;
break;
case8:
if(pinlv<20)
pinlv++;//闹铃频率设定
else
pinlv=0;//频率在0--20之间
break;
case9:
s_clock_flag=~s_clock_flag;//秒表标志位取反,秒表显示
break;
case10:
break;//显示温度,不须要按键操作加减
case11:
if(wendu_up<999)//温度上限为99度
wendu_up++;//设定最高的温度
else
;
break;
case12:
if(wendu_down wendu_down++; break; default: break; } } while(s5==0);//按键锁定,每按一次count只加1. } if(s7==0)//判断是否按下键盘 { delay10ms();//延时,软件去干扰 if(s7==0)//确认按键按下 { switch(count)//在各状态下执行减法,在秒表状态下表示清零 { case1: if(hour>0) hour--;//当前时间小时减 else hour=23; break; case2: if(minute>0) minute--;//当前时间分钟减 else minute=59; break; case3: if(second>0) second--;//当前时间秒减 else second=59; break; case4: if(alarmhour>0) alarmhour--;//闹钟时间小时减 else alarmhour=23; break; case5: if(alarmminute>0) alarmminute--;//闹钟时间分钟减 else alarmminute=59; break; case6: if(alarmsecond>0) alarmsecond--;//闹钟时间秒减 else alarmsecond=59; break; case7: if(alarmsheding>0) alarmsheding--;//闹铃时间设定 else alarmsheding=10; break; case8: if(pinlv>0) pinlv--;//闹铃频率设定 else pinlv=20;//设置的频率范围是在0--20之间 break; case9: ss_second=0; s_second=0; s_minute=0; s_clock_flag=0;//秒表清零 break; case10: break;//显示温度 case11: if(wendu_up>wendu_down);//设定最高的温度不能小于下限温度值 wendu_up--; break; case12: if(wendu_down>0)//最低温度为0度 wendu_down--; break; default: break; } } while(s7==0);//按键锁定,每按一次count只加1. } if(s6==0)//判断是否按下键盘,按下则相当于复位 { delay10ms();//延时,软件去干扰 if(s6==0)//确认按键按下 { count=0;//将count清零 if(alarm) { /*alarm++; if(alarm==3)//alarm==2时,还会处理闹钟的时间间隔问题,闹钟在设定的间隔之后又会继续闹铃*/ alarm=0; //就是按下改建后闹铃不响 } speaker=1; P1=0xff;//关闭流水灯 s_clock_flag=0;//结束秒表状态 ss_second=0; s_second=0; s_minute=0;//秒表复位 s_clock_flag=0; flag=1; } while(s6==0);//按键锁定,每按一次count只加1. } } voidshowchange() { if(count<4)//显示正常时钟 { dispbuf[0]=hour/10; dispbuf[1]=hour%10; dispbuf[2]=minute/10; dispbuf[3]=minute%10; dispbuf[4]=second/10; dispbuf[5]=second%10; } elseif(count<7)//显示闹钟设定 { dispbuf[0]=alarmhour/10; dispbuf[1]=alarmhour%10; dispbuf[2]=alarmminute/10; dispbuf[3]=alarmminute%10; dispbuf[4]=alarmsecond/10; dispbuf[5]=alarmsecond%10; } elseif(count==7)//显示闹钟时间长度设定 { dispbuf[0]=alarmsheding/10; dispbuf[1]=alarmsheding%10; dispbuf[2]=0; dispbuf[3]=0; dispbuf[4]=0; dispbuf[5]=0; } elseif(count==8)//显示闹钟音色设定 { dispbuf[0]=pinlv/10; dispbuf[1]=pinlv%10; dispbuf[2]=0; dispbuf[3]=0; dispbuf[4]=0; dispbuf[5]=0; } elseif(count==9)//显示秒表 { dispbuf[0]=s_minute/10; dispbuf[1]=s_minute%10; dispbuf[2]=s_second/10; dispbuf[3]=s_second%10; dispbuf[4]=ss_second/10; dispbuf[5]=ss_second%10; } elseif(count==10)/*显示温度*/ { dispbuf[0]=wendu[0]; dispbuf[1]=wendu[1]; dispbuf[2]=wendu[2]; dispbuf[3]=0; dispbuf[4]=0; dispbuf[5]=0; } elseif(count==11)//显示及设定上线温度 { dispbuf[0]=wendu_up/100; dispbuf[1]=wendu_up/10%10; dispbuf[2]=wendu_up%10; /*dispbuf[0]=temp/100; dispbuf[1]=temp/10%10; dispbuf[2]=temp%10;*/ dispbuf[3]=0; dispbuf[4]=0; dispbuf[5]=0; } elseif(count==12)//显示及设定下线温度 { dispbuf[0]=wendu_down/100; dispbuf[1]=wendu_down/10%10; dispbuf[2]=wendu_down%10; dispbuf[3]=0; dispbuf[4]=0; dispbuf[5]=0; } } voiddelay(uintz)//延时 { uintt1,y; for(t1=z;t1>0;t1--) for(y=110;y>0;y--); } voiddiaplay_led()//流水灯报警 { j=_crol_(k,1); k=j; P1=j; } /////////////////////显示主程序/////////////////////// voiddisplay() { inti,zhishicanshu; if(count>3) zhishicanshu=count-3;//因为前两个是时间和闹钟调节,显示几乎一样,故不区分,统一处理 else zhishicanshu=count; if(zhishicanshu<7) { for(i=0;i<6;i++) { P0=0x00; dula=1;//P0段控制0: 亮 if((i%2)&&flag&&(i! =((zhishicanshu)*2)-1))//flag控制正常状态时的指示闪烁,zhishicanshu与count的计算是指示当前调节位,指示到该处的时候,该处的小数点是不亮的 P0=(L_code[dispbuf[i]])|0x02;//段控制,限定某一个位达到条件之后不显示小数点 else P0=L_code[dispbuf[i]];//列控制 dula=0;//P0列控制0: 亮
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 89 C52 时间 温度 系统 设计 特酷吧