片单机课程设计学校作息时间控制系统设计大学毕设论文.docx
《片单机课程设计学校作息时间控制系统设计大学毕设论文.docx》由会员分享,可在线阅读,更多相关《片单机课程设计学校作息时间控制系统设计大学毕设论文.docx(20页珍藏版)》请在冰豆网上搜索。
片单机课程设计学校作息时间控制系统设计大学毕设论文
《单片机原理及应用》
课程设计说明书
题目
学校作息时间控制系统的设计
系(部)
专业(班级)
姓名
学号
指导教师
起止日期
系部:
电信系专业:
2011级电子信息工程
课题名称
学校作息时间控制系统的设计
设
计
内
容
及
要
求
(1)课题内容:
以单片机为核心,设计一个智能化作息时间控制器。
该控制器要求的功能有:
按本校作息时间接通/断开蜂鸣器,每次响铃时间为10秒;用12864液晶屏作显示器,第一行显示“作息时间控制系统”,第二行显示设计者姓名和学号,第三行显示实时时钟,显示的内容要求有时、分、秒各两位,第四行显示最近的闹铃时间。
发挥部分:
设置按键对小时和分钟调节;可以通过键盘任意调整响铃时间。
(2)要求:
完成该系统的硬件和软件的设计,在Proteus软件上仿真通过后,提交一篇课程设计说明
设
计
工
作
量
1、汇编或C51语言程序设计;
2、程序调试;
3、在Proteus上进行仿真成功后,进行实验板下载调试;
4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序分析、仿真分析、调试过程,参考文献、设计总结等。
进
度
安
排
起止日期
设计内容(或预期目标)
备注
第一天
课题介绍,答疑,收集材料,C51介绍
第二天
设计方案论证,练习编写C51程序
第三天~第六天
程序设计
第六天~第八天
程序调试、仿真
第九天~第十天
系统测试并编写设计说明书
教研室意见
年月日
系(部)主
管领导意见
年月日
目录
程序4
一、设计内容及要求13
1.1设计内容13
1.2设计要求13
二、设计目的13
三、设计原理13
3.1总的设计13
3.2分模块设计13
3.3设计示意图14
四、仿真分析14
4.1调节工作模式15
4.2闹钟实现15
4.3温度测量16
五、心得体会17
六、参考文献17
程序
#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(hourelseif((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要进行初始化。
将本次设计分成