厨房提醒器.docx
《厨房提醒器.docx》由会员分享,可在线阅读,更多相关《厨房提醒器.docx(12页珍藏版)》请在冰豆网上搜索。
![厨房提醒器.docx](https://file1.bdocx.com/fileroot1/2022-11/26/5efeae4f-af3c-4673-911f-3e06b910c712/5efeae4f-af3c-4673-911f-3e06b910c7121.gif)
厨房提醒器
信息与电气工程学院
课程设计说明书
(2008/2009学年第二学期)
课程名称:
单片机应用课程设计
题目:
厨房提醒器
专业班级:
电气0000
学生姓名:
00000
学号:
060060324
设计周数:
2周
设计成绩:
2009年7月1日
1课程设计目的
本设计为模拟厨房提醒器,采用AT89S52作为控制单元,其中使用按键实现对控制单元的控制,利用数码管作为现实,蜂鸣器作为提示,形成了一个单片机的最小系统。
通过该设计的制作,学会单片机最小系统的设计,汇编或C语言程序的编辑和调试,PROTEL原理图绘制和PCB设计。
2技术要求
(1)设置提醒器的“开始”键,“清除”键,“分十位加1”键,“分个位加1”键,“秒十位加1”键。
(2)刚通电时和按下“清除”键时,均可使显示器显示00:
00
(3)按下“开始”键则按照设定时间减1定时,当显示器显示00:
00时,蜂鸣器提醒器定时到。
(4)4个数码管分别用于显示分十位,分个位,秒十位,秒个位。
3系统设计总体方案
本设计采用了廉价的AT89S52作为主控芯片,外加4个共阳极数码管作为现实,用按键作为人机交互控制端口,扩展了红外遥控功能,利用了精简的C语言进行编写系统程序,有效的实现了厨房提醒器这个单片机最小系统。
本设计分为两个部分:
硬件部分和软件部分。
3.1硬件部分
核心控制器:
本设计根据对系统的分析,还有设计要求的分析,采用了ATMEL公司的AT89S52单片机作为控制核心。
该单片机有如下特点:
1.与MCS-51兼容
2.8KBytes,Flash存储器,在线编程,可写1000次;
3.4.0-5.5工作电压
晶振:
0-33MHZ
1、3层可编程加密
2、自带256*8bit,RAM;
3、32个可编程I/O管脚
4、3个16-BIT定时器、计数器
5、8个中断源
6、全双工UART
7、具有休眠节电模式
8、节电模式中断唤醒
图1控制部分
9、自带看门狗
AT89S52是低功耗,8位CMOS工艺处理器,具有8K在线可编程FLASH存储器。
片内FLASH可多次编程。
AT89S52是一个功能强大的处理器,可以为许多嵌入式应用提供高灵活性,高性价比的解决方案。
成为了本次设计的理想控制器。
显示部分:
显示部分我们采用了数码管显示,数码管是一种低功耗低成本的的显示部件,外加本设计只需要显示数字,因此很符合系统要求,是本设计理想的现实部件。
图2显示部分
控制部分:
本设计采用了按键加遥控的双控制手段,既可以按面板上的相关按键来控制,同时也可以通过红外遥控器来实现实现控制。
这样方便了用户对厨房提醒器的控制,使人机交互更友好。
图3控制部分
3.2软件部分
本设计软件采用高级语言C语言编写,采用高效的的KEIL软件进行编译,成功的实现了本设计的要求。
//////////////////////////////////////////////
////厨房提醒器系统设计////////////////////////
//////////////////////////////////////////////
#include"reg52.h"//AT89S52单片机头文件
#include"STDIO.h"
/*定义系统变量与引脚*/
#defineuintunsignedint
#defineucharunsignedchar
sbitBuzzer=P3^7;//蜂鸣器控制脚
sbitkey1=P1^0;//按键1
sbitkey2=P1^1;//按键2
sbitkey3=P1^2;//按键3
sbitkey4=P1^3;//按键4
sbitkey5=P1^4;//按键5
sbittongdaoa=P2^4;//红外控制器通道1
sbittongdaob=P2^5;//红外控制器通道2
sbittongdaoc=P2^6;//红外控制器通道3
sbittongdaod=P2^7;//红外控制器通道4
sbitguan1=P2^0;//数码管位选控制端1
sbitguan2=P2^1;//数码管位选控制端2
sbitguan3=P2^2;//数码管位选控制端3
sbitguan4=P2^3;//数码管位选控制端4
ucharleddata[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,
0xA1,0x86,0x8E,0x89,0xC7,0xC8,0xC1,0x8C,0xA3,0xBF,0xFF,0xFF};
uchartongdaodcan=0;
ucharcounter=20;
ucharcounter1=10;
uintfenshi=0;
uintfenge=0;
uintmiaoshi=0;
uintmiaoge=0;
/*子函数列表*/
voiddelay(uintN);//延时子程序
uchargetkey(void);//键值获取子函数
voidkey(void);//按键扫描子程序
voidxianshi(void);//显示子程序
voidjingbao(void);//警报声
////////////////////////////////////////////
///主程序///////////////////////////////////
voidmain()
{
P1=0XFF;
P2=0;
TMOD=0X01;
TH0=0X3C;
TL0=0XB0;
ET0=1;
while
(1)
{
key();
xianshi();
}
}
////////////////////////////////////////////
////子函数/////////////////////////////////
voiddelay(uintN)
{
while(N--);
}
uchargetkey(void)
{
uchari=0;
if(key1==0){i=1;xianshi();xianshi();xianshi();xianshi();xianshi();xianshi();xianshi();
}
if(tongdaoa==1){i=1;tongdaodcan++;if(tongdaodcan>7){i=2;tongdaodcan=0;fenshi=0;fenge=0;miaoshi=0;miaoge=0;counter1=9;}xianshi();xianshi();xianshi();xianshi();}//红外遥控器控制口
if(tongdaob==1){i=3;xianshi();xianshi();xianshi();xianshi();}
if(tongdaoc==1){i=4;xianshi();xianshi();xianshi();xianshi();}
if(tongdaod==1){i=5;xianshi();xianshi();xianshi();xianshi();}
if(key2==0){i=2;xianshi();xianshi();xianshi();xianshi();xianshi();xianshi();xianshi();
}
if(key3==0){i=3;xianshi();xianshi();xianshi();xianshi();xianshi();xianshi();xianshi();
}
if(key4==0){i=4;xianshi();xianshi();xianshi();xianshi();xianshi();xianshi();xianshi();
}
if(key5==0){i=5;xianshi();xianshi();xianshi();xianshi();xianshi();xianshi();xianshi();
}
returni;
}
voidkey(void)
{
ucharkeyid;
keyid=getkey();
if(keyid==1)
{
TR0=1;EA=1;
}
if(keyid==2)
{
fenshi=0;
fenge=0;
miaoshi=0;
miaoge=0;
TR0=0;
TH0=0X3C;
TL0=0XB0;
}
if(keyid==3)
{
fenshi+=1;}
if(keyid==4)
{
fenge+=1;
}
if(keyid==5)
{
miaoshi+=1;
}
}
voidxianshi(void)
{
if(miaoshi>=6)
{
miaoshi=0;
}
if(fenge>=10)
{
fenge=0;
}
if(fenshi>=6)
fenshi=0;
guan1=0;
P0=leddata[miaoge];
delay(500);
guan1=1;
guan2=0;
P0=leddata[miaoshi];
delay(500);
guan2=1;
guan3=0;
P0=leddata[fenge];
delay(500);
guan3=1;
guan4=0;
P0=leddata[fenshi];
delay(500);
guan4=1;
}
voidtimer0_int(void)interrupt1
{
TR0=0;
TH0=0X3C;
TL0=0XB0;
if(!
(counter--))
{
counter=20;
if(counter1==10)
{miaoshi-=1;
counter1=0;}
if(miaoshi==(0-1))
{miaoshi=5;fenge-=1;}
if(fenge==(0-1)){
fenge=9;fenshi-=1;}
if(fenshi==(0-1))
{
fenshi=0;fenge=0;miaoshi=0;miaoge=0;counter1=9;
jingbao();
jingbao();
xianshi();xianshi();xianshi();xianshi();xianshi();xianshi();xianshi();
P3=0XFF;
EA=0;
}
counter1++;
miaoge=10-counter1;
}
TR0=1;
}
voidjingbao(void)//警报声
{
unsignedintul,n;
for(ul=0;ul<3000;ul++)//输出一个频率的声音
{
for(n=0;n<40;n++);//延时
Buzzer=~Buzzer;//取反输出到喇叭的信号
}
for(ul=0;ul<2500;ul++)//输出另一个频率的声音
{
for(n=0;n<50;n++);//延时
Buzzer=~Buzzer;//取反输出到喇叭的信号
}
}
工作过程:
上电以后,系统即进入工作状态,此时可对定时提醒器进行设置。
通过键5设置提醒器秒十位,键4设置提醒器分个位,键3设置提醒器分十位,设置过程为加循环设置,不会出现不合适的数值。
可通过键2设置可清空所有设置,然后重新设置。
键1为启动键,按下键1可开始记时,工作开始。
计时到蜂鸣器提示,同时数码管为0000,为可设置状态。
在控制上,可以采用红外遥控控制,其中通道1对应按键5,通道2对应按键4,通道3对应键3,通道4短按为开始,长按为清空。
系统调试
硬件调试可分为静态调试与动态调试两步进行。
静态调试是在用户系统未工作时的一种硬件检测。
第一步:
目测。
检查外部的各种元件或者是电路是否有断点。
第二步:
用万用表测试。
先用万用表复核目测中有疑问的连接点,再检测各种电源线与地线之间是否有短路现象。
第三步:
加电检测。
给板加电,检测所有插座或是器件的电源端是否符合要求的值
第四步:
是联机检查。
因为只有用单片机开发系统才能完成对用户系统的调试。
动态调试是在用户系统工作的情况下发现和排除用户系统硬件中存在的器件内部故障、器件连接逻辑错误等的一种硬件检查。
动态调试的一般方法是由近及远、由分到合。
由分到合是指首先按逻辑功能将用户系统硬件电路分为若干块,当调试电路时,与该元件无关的器件全部从用户系统中去掉,这样可以将故障范围限定在某个局部的电路上。
当各块电路无故障后,将各电路逐块加入系统中,在对各块电路功能及各电路间可能存在的相互联系进行调试。
由分到合的调试既告完成。
由近及远是将信号流经的各器件按照距离单片机的逻辑距离进行由近及远的分层,然后分层调试。
调试时,仍采用去掉无关元件的方法,逐层调试下去,就会定位故障元件了。
课程设计总结:
这次单片机课程设计对于我们大二的学生来说,还是比较容易的,有了去年的经验我们组很快就完成了原理图的绘画及PCB的出图。
面板的焊接速度和质量也比以前提高了很多,这使我组在调试的过程中少了一些不必要的麻烦,使我们很快就完成了任务。
当然,在这次过程中,程序的编写仍然是个难题。
所以,这次课程设计即巩固了我们以前所学,同时也给了我们一次实践的机会,使我们获得了宝贵的经验。
4、参考文献
[1]杨路明.《C语言程序设计》.北京:
北京邮电大学出版社,2005
[2]刘同法.《单片机基础与最小系统实践》.北京:
北京航空航天出版社,2007
[3]广林.《轻松跟我学Protel99SE电路设计与制版》.北京:
电子工业出版社,2005
原理图: