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

更新时间:2023-10-18 06:51:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

长 沙 学 院

单片机课程设计说明书

题目 学校作息时间控制系统的设计 系(部) 电子与通信工程系 专业(班级) 通信一班 姓名 李滔 学号 2009043124 指导教师王新辉、谢明华、刘辉、马凌云 起止日期 2012/5/28----2012/6/1

单片机原理及应用课程设计任务书

系:电子与电气工程系 专业:09通信工程 指导教师:王新辉、谢明华、刘辉、马凌云

课题名称 学校作息时间控制系统的设计 设计内容及要求 (1)课题内容:以单片机为核心,设计一个智能化作息时间控制器。该控制器要求的功能有:按本校作息时间接通/断开电铃;并用B3区的12864液晶屏的第一行显示本人的姓名和学号,第二行显示实时时钟。作息时间控制器用于学校教学楼的时间控制,利用单片机内部定时器实现时间基准定时,显示的内容要求有时、分、秒各两位,并能调节小时和分钟。 发挥部分:可以通过键盘任意调整响铃时间。 (2)要求:完成该系统的硬件和软件的设计,在Proteus软件上仿真通过后,下载到DP-51PROC单片机实验箱验证。最后就课程设计本身提交一篇课程设计说明书。 设计工作量 1、汇编或C51语言程序设计; 2、程序调试; 3、在Proteus上进行仿真后,进行下载; 4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序分析、仿真分析、调试过程,参考文献、设计总结等。 起止日期(或时间量) 设计内容(或预期目标) 课题介绍,答疑,收集材料,C51介绍 设计方案论证,练习编写C51程序 程序设计 程序调试、仿真 系统测试并编写设计说明书 年 月 日 备注 进度安排 第一天 第二天 第三天~第六天 第六天~第八天 第九天~第十天 教研室 意见 系(部)主管领导意见 年 月 日

- 2 -

长沙学院课程设计鉴定表

姓名 李滔 学号 2009043124 专业 通信工程 班级 指导教师 通信1班 设计题目 学校作息时间控制系统的设计 王新辉、谢明华、刘辉、马凌云 指导教师意见: 评定等级: 教师签名: 日期: 答辩小组意见: 评定等级: 答辩小组长签名: 日期: 教研室意见: 教研室主任签名: 日期: 系(部)意见: 系主任签名: 日期: 说明 课程设计成绩分“优秀”、“良好”、“及格”、“不及格”四类; - 3 -

目 录

一.设计原理 ···································································································································· - 5 -

(1)分模块设计:............................................................................................................ - 5 - (2)总体设计:................................................................................................................ - 5 - (3)设计示意图................................................................................................................ - 5 - 二.程序设计:································································································································ - 6 - 三.仿真分析:······························································································································ - 19 -

(1)调节工作模式: ...................................................................................................... - 19 - (2)闹铃实现:.............................................................................................................. - 23 - (3)温度测量:.............................................................................................................. - 23 - 四.设计心得 ·································································································································· - 24 -

- 4 -

一.设计原理

(1)分模块设计:

1.LCD显示模块设计:该模块包括的函数为LCD_inti()//LCD 的初始化、 checkbusy()//检查LCD是否忙碌、 writecode() //写命令、 writedata() //写数据、 hanzi()//显示汉字、 zifu()//显示数字或字符。

2.温度模块设计:该模块的函数为inti()//DS18B20的初始化、 readchar()//读一个字节、writechar()//写入一个字节、readtemp()//读取温度 、worktemp()//温度计算。

3.时间模块设计:本次是采用T0中断的工作方式1获取时间的。其函数为void timer() interrupt 1 //T0中断函数 、workhour()//时间计算。

4.声音模块设计:该模块比较简单,其函数为void s_fmq()//蜂鸣器叫 、nling()//判断是否闹铃。

5.调节模块设计:该模块要实现5个模式的调节和转变。模式0:正常工作状态; 模式1:修改时间;模式2:选择一个需要改变的闹铃;模式3:修改选定的闹铃的分钟 ;模式4:修改选定的闹铃的小时

(2)总体设计:

首先对设计要求有个整体的了解,明白需要实现哪些功能,实现这些功能需要哪些元器件,要驱动这些元件需要编写什么程序,最后进行总体调试。本次作息时间的设计,使用了单片机AT89C51,LCD为AMPIRE12864,温度元件为DS18B20,还有一个声音播放器SOUNDER。对于LCD和DS18B20 要进行初始化。将本次设计分成5个模块分别进行设计,分成:温度模块 、LCD显示模块、时间模块、声音模块、调节模块。分模块设计好了以后,再综合起来设计主程序main(),实现所需要求。

(3)设计示意图

时间模块 调节模块 AT 89 C51 LCD显示模块 温度模块 单片机 声音模块

图一. 总设计示意图

- 5 -

二.程序设计:

/************************************************************************** 名称:学校作息时间控制系统的设计程序,基于AT89C51单片机,用lcd12864显示 内容:三个按键:mode(模式)、inc(增加)、dec(减少) 一个LCD12864显示 一个DS18B20数字温度计和一个声音播放器SOUNDER 日期:2011-6-7 编写:黄健

**************************************************************************/ #include #include #define LCD P0

sbit DQ=P3^7; //定义DS18B20数据端口 sbit P07=P0^7; //小数点控制I0 sbit mode=P1^0; //key1 分 sbit inc=P1^1; //kye2 时 sbit dec=P1^2; //key3 闹铃 sbit fmq=P1^7; //蜂鸣器接口 sbit E=P2^0; //用于DS18B20接线端口 sbit RW=P2^1; sbit RS=P2^2; sbit CS1=P2^4; sbit CS2=P2^3; sbit BUSY=P0^0; unsigned char a,i,j,k;

unsigned char bai,shi,ge,xiaoshu; //用于表示温度 unsigned int realtemp; // 读取的实际温度值 unsigned char flag; //正负标志位 unsigned char fu; //符号寄存器 unsigned char count,hour,minute,second=0; //用于表示时间 unsigned char mode_value=0 ,xf; //调节模式 unsigned char month=6 ,day=1 ; //用于表示日期 unsigned char h1,h2,f1,f2,s1,s2=0; //用于显示时间 unsigned char m1,m2;d1,d2; //用于显示日期 unsigned char ds[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} }; //用于定时闹铃 unsigned char code zi[28][16]= {

0x80,0x84,0x44,0xC4,0xA4,0x94,0x8C,0xFF,0x8C,0x94,0xA4,0x24,0x44,0xC4,0x40,0x00/*\李”,0*/

0x00,0x04,0x04,0x04,0x04,0x44,0x84,0x7E,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x00

- 6 -

0x10,0x21,0x86,0x70,0x00,0x02,0x8A,0x92,0x42,0x46,0x19,0x81,0x81,0x91,0x8D,0x00/*\滔\,1*/

0x04,0xFC,0x03,0x00,0x00,0x00,0xFF,0x44,0x44,0x44,0x40,0x44,0x44,0x44,0xFF,0x00 0x00,0xFC,0x84,0x84,0x84,0xFE,0x14,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x00/*\时\,2*/

0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x23,0x40,0x80,0x7F,0x00,0x00,0x00 0x00,0x80,0x40,0x20,0x98,0x86,0x80,0x80,0x83,0x8C,0x90,0x20,0xC0,0x80,0x80,0x00/*\分\,3*/

0x01,0x00,0x80,0x40,0x20,0x1F,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x01,0x00,0x00 0x20,0x24,0x24,0xA4,0xFE,0xA3,0x22,0x80,

0x70,0x00,0xFF,0x00,0x10,0x20,0x60,0x00/*\秒\,4*/

0x10,0x08,0x06,0x01,0xFF,0x00,0x81,0x80,0x40,0x20,0x17,0x08,0x04,0x03,0x00,0x00 0x10,0x10,0xD0,0xFF,0x94,0x14,0xE4,0xBF,

0xA4,0xA4,0xA4,0xBF,0xF4,0x26,0x04,0x00/*\模\,5*/

0x04,0x03,0x00,0xFF,0x08,0x89,0x8B,0x4A, 0x2A,0x1E,0x2A,0x2A,0x4B,0xC8,0x48,0x00 x40,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x42,0x40,0x40,0x00 /* \天\

x80,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x80,0x00 0x40,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x42,0x40,0x40,0x00/*“天”,7*/

0x80,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x80,0x00 0x00,0xF8,0x08,0x08,0x0C,0xCA,0x49,0x48,0x48,0xC8,0x08,0x08,0x08,0xF8,0x00,0x00/*“向”,8*/

0x00,0xFF,0x00,0x00,0x00,0x1F,0x08,0x08,0x08,0x1F,0x00,0x40,0x80,0x7F,0x00,0x00 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00/*”上“,9*/

0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00 0x40,0x20,0xF8,0x07,0xF0,0xA0,0x90,0x4F,0x54,0x24,0xD4,0x4C,0x84,0x80,0x80,0x00/*“修”,10*/

0x00,0x00,0xFF,0x00,0x0F,0x80,0x92,0x52,0x49,0x25,0x24,0x12,0x08,0x00,0x00,0x00 0x04,0xC4,0x44,0x44,0x44,0xFE,0x44,0x20,0xDF,0x10,0x10,0x10,0xF0,0x18,0x10,0x00/*“改”,11*/

0x00,0x7F,0x20,0x20,0x10,0x90,0x80,0x40,0x21,0x16,0x08,0x16,0x61,0xC0,0x40,0x00 0x00,0xFC,0x84,0x84,0x84,0xFE,0x14,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x00/*\时\,12*/

0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x23,0x40,0x80,0x7F,0x00,0x00,0x00 0x00,0xF8,0x01,0x02,0xF6,0x10,0x12,0x12,0x12,0x12,0xFA,0x12,0x02,0xFF,0x02,0x00/*\间\,13*/

0x00,0xFF,0x00,0x00,0x3F,0x11,0x11,0x11,0x11,0x11,0x3F,0x40,0x80,0x7F,0x00,0x00 };//汉字码

unsigned char code shu[20][8]= {

{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00},

{0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*\

- 7 -

{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00},

{0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*\{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00},

{0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*\{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00},

{0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},/*\{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00},

{0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},/*\{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00},

{0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},/*\{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00},

{0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},/*\{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00},

{0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},/*\{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00},

{0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},/*\{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00},

{0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00},/*\};//数字码

unsigned char code fuhao[12][8]= {

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01},/*\

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00},/*\

{0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00},{0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00},/*\

{0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00},{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*\

{0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00},{0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00},/*\

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*\};//符号码

/****************************************************************************************************LCD显示模块程序******************************* *************************************************************************/ /*********检查12864LCD中是否忙*****************************************/ checkbusy() { E=1; RW=1; RS=0;

LCD=0Xff;

- 8 -

if(BUSY); }

/***********************写命令********************************************/ writecode(unsigned char dat) //写命令 { checkbusy(); E=0; RW=0; RS=0; LCD=dat; E=1; E=0; }

/*******************************写数据************************************/ writedata(unsigned char dat) //写数据 { checkbusy(); E=0; RW=0; RS=1; LCD=dat; E=1; E=0; }

/*************************汉字显示程序************************************/ void hanzi(unsigned char page,unsigned char lineaddress,int n,int a, unsigned char table[][16]) {

unsigned char temp[32]; if(lineaddress<0X80) { CS1=0; CS2=1; } //left for(j=2*a;j=0X80) { CS1=1; //right CS2=0; lineaddress=lineaddress-0X40; } for(k=0;k<16;k++) {temp[k]=table[j][k];} j+=1; for(k=0;k<16;k++)

- 9 -

{ temp[16+k]=table[j][k]; } writecode(page); writecode(lineaddress); for(i=0;i<16;i++) { writedata(temp[i]);} writecode(page+1); writecode(lineaddress); for(i=16;i<32;i++) { writedata(temp[i]);} lineaddress+=16; } }

/***********************数字和字符显示程序******************************/ void zifu(unsigned char page,unsigned char lineaddress,int n,int a, unsigned char table[][8]) {

unsigned char temp[16]; if(lineaddress<0X80) { CS1=0; CS2=1; } //left for(j=2*a;j=0X80) { CS1=1; //right CS2=0; lineaddress=lineaddress-0X40; } for(k=0;k<8;k++) {temp[k]=table[j][k];} j+=1; for(k=0;k<8;k++) {temp[8+k]=table[j][k];} writecode(page); writecode(lineaddress); for(i=0;i<8;i++) { writedata(temp[i]);} writecode(page+1); writecode(lineaddress); for(i=8;i<16;i++) { writedata(temp[i]);}

- 10 -

}

}

} }

}

/*******************************************************************************************************声音模块程序***************************************** ******************************************************************************/ /******************************延时*******************************************/

void delaysj(unsigned char j)//延时程序 { unsigned char i; while(j--) { for(i=0;i<50;i++); } }

/****************************蜂鸣器***********************************/ void s_fmq() { unsigned char j=2; //蜂鸣器叫 while(j--) { fmq=~fmq; delaysj(3); } }

/*************************闹铃判断**********************************/ void nling()

{ unsigned char i ; for(i=0;i<20;i++) { if(hour==ds[i][0]&&minute==ds[i][1]) //判断是否到闹铃时间 { s_fmq(); //调用蜂铃 } } }

- 16 -

/************************************************************************************************************调节模块程序*********************************** ******************************************************************************/ /*****************************调节模式****************************************/

void tiaojie() { if(mode==0) { while(!mode); mode_value++; } zifu(0xbc,0xb8,2,mode_value,&shu); switch(mode_value) { //模式0:正常工作。显示“天天向上” case 0:{hanzi(0xbe,0x40,8,6,&zi);} break ; case 1:{ // 模式1:可以修改时间,其中inc是改分钟,dec是改小时 if(inc==0){ while(!inc);minute++;if(minute==60) minute=0;} if(dec==0){ while(!dec);hour++; if(hour==24) hour=0;} hanzi(0xbe,0x40,8,10,&zi); } ;break; case 2:{ // 模式2:选择一个需要改变的闹铃 if(inc==0){ while(!inc);xf++;if(xf==20) xf=0;} if(dec==0){ while(!dec);xf--; if(xf==0) xf=19;} zifu(0xbe,0x40,2,xf/10,&shu); zifu(0xbe,0x48,2,xf,&shu); zifu(0xbe,0x68,2,2,&fuhao); zifu(0xbe,0x70,2,ds[xf][1]/10,&shu); zifu(0xbe,0x78,2,ds[xf][1],&shu); zifu(0xbe,0x50,2,0,&fuhao); zifu(0xbe,0x58,2,ds[xf][0]/10,&shu); // 显示“调整后的闹铃时间” zifu(0xbe,0x60,2,ds[xf][0],&shu); } ;break; case 3: { // 模式3:修改选定的闹铃的分钟 if(inc==0){ while(!inc);ds[xf][1]++;if(ds[xf][1]==60) ds[xf][1]=0;} if(dec==0){ while(!dec);ds[xf][1]--; if(ds[xf][1]==0) ds[xf][1]=59;} hanzi(0xbe,0x40,2,3,&zi); //显示“分” zifu(0xbe,0x58,2,ds[xf][0]/10,&shu); // 显示“调整后的闹铃时间” zifu(0xbe,0x60,2,ds[xf][0],&shu);

- 17 -

zifu(0xbe,0x68,2,2,&fuhao); zifu(0xbe,0x70,2,ds[xf][1]/10,&shu); zifu(0xbe,0x78,2,ds[xf][1],&shu); } ;break ; case 4:{ // 模式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;} hanzi(0xbe,0x40,2,2,&zi); // 显示“时” zifu(0xbe,0x58,2,ds[xf][0]/10,&shu); // 显示“调整后的闹铃时间” zifu(0xbe,0x60,2,ds[xf][0],&shu); zifu(0xbe,0x68,2,2,&fuhao); zifu(0xbe,0x70,2,ds[xf][1]/10,&shu); zifu(0xbe,0x78,2,ds[xf][1],&shu); } ;break; case 5:{ xf=0;mode_value=0 ;};break; //模式5:确认修改,返回正常工作状态 default:break; } }

/*************************************************************************************************************主函数********************************* *************************************************************************/ void main(void) { init(); //ds18b20初始化 LCD_inti(); //12864初始化 xingxian(); //调用显示固定的汉字,例如姓名和学号 TMOD=0X01; // T0工作在方式1 TH0=(65536-50000)/256; TL0=(65536-50000)%6; EA=1; //开中断 ET0=1; TR0=1; //启动中断T0 while(1) { worktemp(); //温度显示 shixian(); //时间显示 tiaojie(); //时间调节 nling() ; //用于定时闹钟 }}

- 18 -

三.仿真分析:

电路原理仿真图:

图二: 总的硬件电路图

(1)调节工作模式:

调节模式的实现只用了三个按钮,分别是mode 、inc和dec按钮。如图三所示:

图三:三个调节按钮

开始程序仿真时,进入的是设定好的模式0,此时面板上显示的是图三

- 19 -

图四: 模式0

按下mode 按键,则进入模式1:进入修改时间

图五: 模式1

此时修改分钟按INC 按键,修改小时按DEC按键

再次按下mode按键,则进入模式2:选择要修改的闹铃

- 20 -

本文来源:https://www.bwwdw.com/article/zk5f.html

Top