学校作息时间控制系统设计.docx
- 文档编号:4805850
- 上传时间:2022-12-09
- 格式:DOCX
- 页数:16
- 大小:45.97KB
学校作息时间控制系统设计.docx
《学校作息时间控制系统设计.docx》由会员分享,可在线阅读,更多相关《学校作息时间控制系统设计.docx(16页珍藏版)》请在冰豆网上搜索。
学校作息时间控制系统设计
《单片机原理及应用》
课程设计说明书
题
目学校作息时间控制系统的设计
系(
部
)
专业(
班
级)
姓
名
学
号
指导
教
师
起止日期
系部:
电信系专业:
2011级电子信息工程
I课题名称学校作息时间控制系统的设计
设计内容及要求
(1)课题内容:
以单片机为核心,设计个智能化作息时间控制
器。
该控制器要求的功能有:
按本校作息时间接通/断开蜂鸣器,
每次响铃时间为10秒;用12864液晶屏作显示器,第行显示
“作息时间控制系统”,第二行显示设计者姓名和学号,第三行显示实时时钟,显示的内容要求有时、分、秒各两位,第四行显示最近的闹铃时间。
发挥部分:
设置按键对小时和分钟调节;可以通过键盘任意调整响铃时间。
(2)要求:
完成该系统的硬件和软件的设计,在Proteus软件上仿真通过后,提交一篇课程设计说明
设计工作
量
1、汇编或C51语言程序设计;
2、程序调试;
3、在Proteus上进行仿真成功后,进行实验板下载调试;
4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序分析、仿真分析、调试过程,参考文献、设计总结等。
进度安排
起止日期
设计内容(或预期目标)
备注
第天
课题介绍,答疑,收集材料,C51介
绍
第二天
设计方案论证,练习编写C51程序
第三天〜第六天
程序设计
第六天~第八天
程序调试、仿真
第九天〜第十天
系统测试并编写设计说明书
教研
至意见
年月
日
系(部)主管领导意见
年月日
程序
一、设计内容及要求
1.1设计内容
1.2设计要求
二、设计目的
三、设计原理
3.1总的设计
3.2分模块设计
3.3设计示意图
四、仿真分析
4.1调节工作模式
4.2闹钟实现
4.3温度测量
五、心得体会
4
15
15
15
15
15
15
15
16
16
16错误!
未定义书签。
错误!
未定义书签。
错误!
未定义书签。
错误!
未定义书签。
六、参考文献
#include"reg52.h"
#include
#defineuintunsignedint
#defineIO_ADDRP2
#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};
//key1模式
//kye2分
//key3时
//蜂鸣器接口
sbitRS=P1A0;sbitRW=PM1;sbitEN=P1A2;sbitRST=P1A3;sbitPSB=P1A5;sbitmode=P0A0;sbitinc=P0A1;sbitdec=P0A2;sbitfmq=P3A4;//============
codeuchardata1[16]={"codeuchardata2[]={"codeuchardata3[]={"codeuchardata4[]={"uchardisp_buff[4][16];//ucharhour,min,sec,minisec;ucharmode_value=0,xf;
作息时间控制系统"};吴智勇2011026103"};时间:
:
:
"};
打铃:
:
:
"};
定义一个二维数组,4行,16个字符
//调节模式
uchards[20][2]=
{
{8,0},{8,45},{8,55},{9,40},{10,0},{10,45},{10,55},{11,40},{14,0},{14,45},
{14,55},{15,40},{16,0},{16,45},{16,55},{17,40},{19,0},{19,45},{19,
55},{20,40}
};
//======================================================
***************************************************************voiddelay(intms)
{
while(ms--)
{
uchari;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
//=========================
voiddelayus(uinti)
{
uchary;
while(--i)
for(y=0;y<2;y++)
{;}
}
//======================================================
ucharread_data(void)//读状态。
//返回值1---空。
0忙。
{
uchartemp;
RS=0;
RW=1;
delayus
(2);
EN=1;
delayNOP();
IO_ADDR=0XFF;
temp=IO_ADDR;//读输入口。
temp=temp&0x80;
EN=0;
if(temp==0x00)
{
return(0);
}
else
{
return
(1);}//注:
如需软件仿真,需要将此处改为1
}
//============================
voidwrite_data(uchartype,uchardate)//写命令或写数据。
{
while(read_data());
//delayus(100);
if(type)//写数据1{
RS=1;
}
else//0//写命令
{
RS=0;
}delayus
(1);//1。
5US
RW=0;delayus
(1);//1。
5US
EN=0;
delayus
(1);
delayus
(1);
delayus
(1);IO_ADDR=date;
delayNOP();EN=1;
delayNOP();
EN=0;delayus(10);
}
[[***************************************************************
voidinit_system()//12864
{
PSB=1;
RST=1;
delayus(4);
RST=0;
delay(3);
RST=1;
delay(3);write_data(0,0x30);//delay(5);
write_data(0,0x30);//delay(5);
write_data(0,0x30);//delay(5);
write_data(0,0x01);//
初始化部分
功能设定,8位并行接口功能设定,基本指令集。
功能设定,8位并行接口清屏,
delay(5);
清屏,
将地址指针移到开头位置。
整体显示开。
清屏,
清屏,
write_data(0,0x01);//delay(5);
write_data(0,0x02);//write_data(0,0x0c);//write_data(0,0x01);//write_data(0,0x01);//}
//=========================================
//==============================================
voiddisplay_buff()//
{
uchari;
显示2维数组内的内容。
uchar*point;
point=&disp_buff[0][0];//write_data(0,0x01);//
//delayus(5);
清屏,
//write_data(0,0x02);//
地址归0
//delayus(10);
//write_data(0,0x06);//
地址归0
///////////////一行一
行的显示////////////////
//行地址:
0X800X900X880X98
write_data(0,0X80);//
delayus
(1);
for(i=0;i<16;i++)
{
write_data(1,*point);
point++;
delayus
(1);
}
//==================
移到0X80位置。
//=========================================
write_data(0,0X90);
delayus
(1);
for(i=0;i<16;i++)
{
write_data(1,disp_buff[1][i]);
delayus
(1);
}
write_data(0,0X88);
for(i=0;i<16;i++)
{
write_data(1,disp_buff[2][i]);delayus
(1);
}write_data(0,0X98);for(i=0;i<16;i++)
{write_data(1,disp_buff[3][i]);delayus
(1);
}
}
//=====================================voidtime0()interrupt1
{
TH0=0X4C;
TL0=0X00;if(minisec++>20)
{minisec=0;
if(++sec>59)
{sec=0;
if(++min>59)
{min=0;
if(++hour>24)
{hour=0;
min=0;sec=0;}}}
}
}
voiddelaysj(unsignedcharj)//延时程序
{unsignedchari;while(j--)
{for(i=0;i<50;i++);
//蜂鸣器
voids_fmq()
{
unsignedcharj=2;
//蜂鸣器叫
while(j--)
{
fmq=0;delaysj(200);
}
}
***********************
**********************************/
voidnling()
{uchari;
for(i=0;i<20;i++)
{
if(hour==ds[i][0]&&min==ds[i][1])
{if(sec<10)
s_fmq();//}
}
}
铃判断
//判断是否到闹铃时间
调用蜂铃
//调节模块voidtiaojie(){uchari;
if(mode==0)
{while(!
mode);mode_value++;
}//zifu(0xbc,0xb8,2,mode_value,&shu);switch(mode_value)
{0:
正常工作。
显示“天天向上”
//模式
case0:
{//uchari;
for(i=0;i<16;i++)
{
disp_buff[0][i]=data1[i];
disp_buff[1][i]=data2[i];
}}break;
case1:
{//模式1:
可以修改时间,其中inc是改分钟,dec是改小时if(inc==0){while(!
inc);min++;if(min==60)min=0;}if(dec==0){while(!
dec);if(min==0)min=60;min--;}//if(dec==0){while(!
dec);hour++;if(hour==24)hour=0;}
//uchari;
for(i=0;i<16;i++)
{disp_buff[2][i]=data3[i];
}
disp_buff[2][5]=(hour/10)+0x30;
disp_buff[2][6]=(hour%10)+0x30;
disp_buff[2][8]=(min/10)+0x30;
disp_buff[2][9]=(min%10)+0x30;
disp_buff[2][11]=(sec/10)+0x30;disp_buff[2][12]=(sec%10)+0x30;
display_buff();
};break;
case2:
{if(inc==0){while(!
inc);hour++;if(hour==24)hour=0;}
//模式2:
选择一个
需要改变的闹铃
//if(inc==0){while(!
inc);min+;if(min==60)min=0;}if(dec==0){while(!
dec);if(hour==0)hour=24;hour--;}
//uchari;
for(i=0;i<16;i++)
{disp_buff[2][i]=data3[i];
}
disp_buff[2][5]=(hour/10)+0x30;disp_buff[2][6]=(hour%10)+0x30;
disp_buff[2][8]=(min/10)+0x30;
disp_buff[2][9]=(min%10)+0x30;
disp_buff[2][11]=(sec/10)+0x30;disp_buff[2][12]=(sec%10)+0x30;
display_buff();
//zifu(0xbe,0x40,2,xf/10,&shu);
//zifu(0xbe,0x48,2,xf%10,&shu);
//zifu(0xbe,0x68,2,2,&fuhao);
//zifu(0xbe,0x70,2,ds[xf][1]/10,&shu);
//zifu(0xbe,0x78,2,ds[xf][1]%10,&shu);
///zifu(0xbe,0x50,2,0,&fuhao);
//zifu(0xbe,0x58,2,ds[xf][0]/10,&shu);//显示“调整后的闹铃时间”
//zifu(0xbe,0x60,2,ds[xf][0]%10,&shu);
};break;
case3:
{
//模式3:
修改选定的闹铃的分钟
if(inc==0){while(!
inc);ds[xf][1]++;if(ds[xf][1]==60)ds[xf][1]=0;}
if(dec==0){while(!
dec);if(ds[xf][1]==0)
ds[xf][1]=60;ds[xf][1]--;}
//uchari;
for(i=0;i<16;i++)
{
disp_buff[3][i]=data4[i];
}
disp_buff[3][5]=ds[xf][0]/10+0x30;
disp_buff[3][6]=ds[xf][0]%10+0x30;
disp_buff[3][8]=ds[xf][1]/10+0x30;
disp_buff[3][9]=ds[xf][1]%10+0x30;
disp_buff[3][11]=0+0x30;
disp_buff[3][12]=0+0x30;
display_buff();//显示“调整后的闹铃时间”
};break;
case4:
{//模
式4:
修改选定的闹铃的小时
if(inc==0){while(!
inc);ds[xf][0]++;if(ds[xf][0]==24)ds[xf][0]=0;}
if(dec==0){while(!
dec);ds[xf][0]--;if(ds[xf][0]==0)
ds[xf][0]=23;}
//uchari;
//for(i=0;i<16;i++)
//{
//disp_buff[3][i]=data4[i];
//}
disp_buff[3][5]=ds[xf][0]/10+0x30;
disp_buff[3][6]=ds[xf][0]%10+0x30;
disp_buff[3][8]=ds[xf][1]/10+0x30;
disp_buff[3][9]=ds[xf][1]%10+0x30;
disp_buff[3][11]=0+0x30;
disp_buff[3][12]=0+0x30;
display_buff();
//hanzi(0xbe,0x40,2,2,&zi);//显示
“时”
//zifu(0xbe,0x58,2,ds[xf][0]/10,&shu);//显示“调整后
的闹铃时间”
//zifu(0xbe,0x60,2,ds[xf][0]%10,&shu);
//zifu(0xbe,0x68,2,2,&fuhao);
//zifu(0xbe,0x70,2,ds[xf][1]/10,&shu);
//zifu(0xbe,0x78,2,ds[xf][1]%10,&shu);
};break;
case5:
{mode_value=0;};break;//模式5:
确认修改,返回正常
工作状态
default:
break;
}
}
//从打铃时间表中找出下一个要打铃的时间
ucharLocate(void)
{//ucharxf;//n;
xf=0;
while(xf<20)
{if(hour elseif((hour==ds[xf][0])&&(min<=ds[xf][1]))break; xf++; //n++; } if(xf==20)xf=0;//xf=0; return(xf); } voidshizhong() {uchari; for(i=0;i<16;i++) { disp_buff[0][i]=data1[i]; disp_buff[1][i]=data2[i]; disp_buff[2][i]=data3[i]; disp_buff[3][i]=data4[i]; } disp_buff[2][5]=(hour/10)+0x30;disp_buff[2][6]=(hour%10)+0x30;disp_buff[2][8]=(min/10)+0x30;disp_buff[2][9]=(min%10)+0x30;disp_buff[2][11]=(sec/10)+0x30;disp_buff[2][12]=(sec%10)+0x30; //闹铃 disp_buff[3][5]=ds[xf][0]/10+0x30;disp_buff[3][6]=ds[xf][0]%10+0x30;disp_buff[3][8]=ds[xf][1]/10+0x30;disp_buff[3][9]=ds[xf][1]%10+0x30;disp_buff[3][11]=0+0x30;disp_buff[3][12]=0+0x30; display_buff();}/*******************************************************************//**//**//*//==========================================*///****************************************************************voidmain(void){ P0=0XFF; P2=0XFF; EA=1; ET0=1; TH0=0X4C; TL0=0X00; TMOD=0X01; TR0=1;init_system();while (1){tiaojie();shizhong(); nling();Locate();//s_fmq(); } } 一、设计内容及要求 1.1设计内容 以单片机为核心,设计一个智能化作息时间控制器。 该控制器要求功能有: 按本校作息时间接通/断开蜂鸣器,每次响铃时间为10秒;用12864液晶屏作显示器,第一行显示“作息时间控制系统”,第二行显示设计者姓名和学号,第三行显示实时时钟,显示的内容有时、分、秒各两位,第四行显示最近的闹钟时间。 发挥部分: 设计按键对小时和分钟调节;可以通过键盘任意调整闹铃时间。 1.2设计要求 完成该系统的硬件和软件的设计,在Proteus软件上仿真通过后,提交一篇课程设计说明书。 采用汇编或者C51语言程序设计均可。 二、设计目的 通过这次课程设计培养同学的独立思考和独立操作能力,更深层次的了解自己的专业和身边一些电子系统的简单设计。 三、设计原理 3.1总的设计 首先对设计要求有个整体了解,明白需要实现哪些功能,实现这些功能需要哪些元器件,要驱动这些元器件需要编写什么程序,怎么编写,最后进行总体调试。 本次作息时间的设计,使用了单片机AT89C51,LCD 和AMPIRE12864温度元件为DS18B20还有一个声音播放器SOUNDER对于LCD和DS18B20要进行初始化。 将本次设计分成5个模块分别进行 设计,分成: 温度模块、LCD显示模块、时间模块、声音模块、调节模块。 分模块设计好了以后,再综合起来设计主程序,实现所需要求。 3.2分模块设计 1.LCD显示模块设计: 该模块包括的函数为LCD-inti()//的初始化、checkbusy()〃检查LCD是 否忙碌、writecode()//写命令、writedata()//写数据、hanzi()//显示汉字、zifuz()//显示数字或字符。 2.温度模块设计: 该函数为inti()//DS18B20的初始化、readchar()//读一个字节、writechar()//写一个字节、readtemp()//读取温度、worktemp()//温度计算。 3.时间模块设计: 本次是采用T0中断的工作方式1获取时间的。 其函 数为voidtimer()interrupt1//T0中断函数、workhour()//时间计算。 4.声音模块设计: 该模块比较简单,其函数为voids_fmq()//蜂鸣器叫、nling()//判断是否闹铃。 5.调节模块设计: 该模块要实现5个模式调节和转变。 模式0: 正常工作状态;模式1: 修改时间;模式2: 选择一个需要改变的闹钟;模式3修改选定的闹钟分钟;模式4: 修改选定的闹钟小时。 3.3设计示意图 图1总设计示意图 四、仿真分析 通过设计程序实现
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学校 作息 时间 控制系统 设计