学校作息时间控制系统设计.docx
- 文档编号:14895930
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:20
- 大小:124.14KB
学校作息时间控制系统设计.docx
《学校作息时间控制系统设计.docx》由会员分享,可在线阅读,更多相关《学校作息时间控制系统设计.docx(20页珍藏版)》请在冰点文库上搜索。
学校作息时间控制系统设计
《单片机原理及应用》
课程设计说明书
题目
学校作息时间控制系统的设计
系(部)
专业(班级)
姓名
学号
指导教师
起止日期
系部:
电信系专业:
2011级电子信息工程
课题名称
学校作息时间控制系统的设计
设
计
内
容
及
要
求
(1)课题内容:
以单片机为核心,设计一个智能化作息时间控制器。
该控制器要求的功能有:
按本校作息时间接通/断开蜂鸣器,每次响铃时间为10秒;用12864液晶屏作显示器,第一行显示“作息时间控制系统”,第二行显示设计者姓名和学号,第三行显示实时时钟,显示的内容要求有时、分、秒各两位,第四行显示最近的闹铃时间。
发挥部分:
设置按键对小时和分钟调节;可以通过键盘任意调整响铃时间。
(2)要求:
完成该系统的硬件和软件的设计,在Proteus软件上仿真通过后,提交一篇课程设计说明
设
计
工
作
量
1、汇编或C51语言程序设计;
2、程序调试;
3、在Proteus上进行仿真成功后,进行实验板下载调试;
4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序分析、仿真分析、调试过程,参考文献、设计总结等。
进
度
安
排
起止日期
设计内容(或预期目标)
备注
第一天
课题介绍,答疑,收集材料,C51介绍
第二天
设计方案论证,练习编写C51程序
第三天~第六天
程序设计
第六天~第八天
程序调试、仿真
第九天~第十天
系统测试并编写设计说明书
教研室意见
年月日
系(部)主
管领导意见
年月日
程序
#include"reg52.h"
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineIO_ADDRP2
#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};
sbitRS=P1^0;
sbitRW=P1^1;
sbitEN=P1^2;
sbitRST=P1^3;
sbitPSB=P1^5;
sbitmode=P0^0;//key1模式
sbitinc=P0^1;//kye2分
sbitdec=P0^2;//key3时
sbitfmq=P3^4;//蜂鸣器接口
//=============================================
codeuchardata1[16]={"作息时间控制系统"};
codeuchardata2[]={"吴智勇2011026103"};
codeuchardata3[]={"时间:
:
:
"};
codeuchardata4[]={"打铃:
:
:
"};
uchardisp_buff[4][16];//定义一个二维数组,4行,16个字符
ucharhour,min,sec,minisec;
ucharmode_value=0,xf;//调节模式
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);//功能设定,8位并行接口
delay(5);
write_data(0,0x30);//功能设定,基本指令集。
delay(5);
write_data(0,0x30);//功能设定,8位并行接口
delay(5);
write_data(0,0x01);//清屏,
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()//显示2维数组内的内容。
{
uchari;
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);//移到0X80位置。
delayus
(1);
for(i=0;i<16;i++)
{
write_data(1,*point);
point++;
delayus
(1);
}
//=======================================
//=========================================
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()//显
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学校 作息 时间 控制系统 设计