学校作息时间控制系统设计.docx

上传人:b****3 文档编号:4805850 上传时间:2022-12-09 格式:DOCX 页数:16 大小:45.97KB
下载 相关 举报
学校作息时间控制系统设计.docx_第1页
第1页 / 共16页
学校作息时间控制系统设计.docx_第2页
第2页 / 共16页
学校作息时间控制系统设计.docx_第3页
第3页 / 共16页
学校作息时间控制系统设计.docx_第4页
第4页 / 共16页
学校作息时间控制系统设计.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

学校作息时间控制系统设计.docx

《学校作息时间控制系统设计.docx》由会员分享,可在线阅读,更多相关《学校作息时间控制系统设计.docx(16页珍藏版)》请在冰豆网上搜索。

学校作息时间控制系统设计.docx

学校作息时间控制系统设计

《单片机原理及应用》

课程设计说明书

目学校作息时间控制系统的设计

系(

专业(

级)

指导

起止日期

系部:

电信系专业:

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#defineucharunsignedchar

#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总设计示意图

四、仿真分析

通过设计程序实现

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1