收藏 分销(赏)

片单机课程设计学校作息时间控制系统设计.doc

上传人:精*** 文档编号:2522589 上传时间:2024-05-31 格式:DOC 页数:21 大小:252KB 下载积分:10 金币
下载 相关 举报
片单机课程设计学校作息时间控制系统设计.doc_第1页
第1页 / 共21页
片单机课程设计学校作息时间控制系统设计.doc_第2页
第2页 / 共21页


点击查看更多>>
资源描述
《单片机原理及应用》 课程设计说明书 题目 学校作息时间控制系统的设计 系(部) 专业(班级) 姓名 学号 指导教师 起止日期 系部:电信系 专业: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 <intrins.h> #define uchar unsigned char #define uint unsigned int #define IO_ADDR P2 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; sbit RS=P1^0; sbit RW=P1^1; sbit EN=P1^2; sbit RST=P1^3; sbit PSB=P1^5; sbit mode=P0^0; //key1 模式 sbit inc=P0^1; //kye2 分 sbit dec=P0^2; //key3 时 sbit fmq=P3^4; //蜂鸣器接口 //============================================= code uchar data1[16]={"作息时间控制系统"}; code uchar data2[]={"吴智勇 2011026103"}; code uchar data3[]={"时间: : : "}; code uchar data4[]={"打铃: : : "}; uchar disp_buff[4][16];//定义一个二维数组,4行,16个字符 uchar hour,min,sec,minisec; uchar mode_value=0 ,xf; //调节模式 uchar 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} }; //====================================================== /*******************************************************************/ void delay(int ms) { while(ms--) { uchar i; for(i=0;i<250;i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } //========================= void delayus(uint i) { uchar y; while(--i) for(y=0;y<2;y++) {;} } //====================================================== uchar read_data(void)//读状态。//返回值1---空。0-----忙。 { uchar temp; 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 } //============================ void write_data(uchar type,uchar date)//写命令或写数据。 { 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); } //*************************************************************** void init_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);//清屏, } //========================================= //============================================== void display_buff()//显示2维数组内的内容。 { uchar i; 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 ///////////////一行一行的显示//////////////// //行地址:0X80 0X90 0X88 0X98 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); } } //===================================== void time0() interrupt 1 { 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; } } } } } 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=0; delaysj(200); } } /*************************闹铃判断**********************************/ void nling() { uchar i ; for(i=0;i<20;i++) { if(hour==ds[i][0]&&min==ds[i][1]) //判断是否到闹铃时间 { if(sec<10) s_fmq(); //调用蜂铃 } } } //调节模块 void tiaojie() { uchar i; if(mode==0) { while(!mode); mode_value++; } //zifu(0xbc,0xb8,2,mode_value,&shu); switch(mode_value) { //模式0:正常工作。显示“天天向上” case 0:{//uchar i; for(i=0;i<16;i++) { disp_buff[0][i]=data1[i]; disp_buff[1][i]=data2[i]; }} break ; case 1:{ // 模式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;} // uchar i; 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; case 2:{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--; } // uchar i; 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; 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);if(ds[xf][1]==0) ds[xf][1]=60;ds[xf][1]--;} // uchar i; 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 ; 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;} // uchar i; //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; case 5:{ mode_value=0 ;};break; //模式5:确认修改,返回正常工作状态 default:break; } } //从打铃时间表中找出下一个要打铃的时间 uchar Locate (void) { //uchar xf;//n; xf=0; while(xf<20) { if(hour<ds[xf][0]) break; else if((hour==ds[xf][0])&&(min<=ds[xf][1])) break; xf++; //n++; } if(xf==20) xf=0;//xf=0; return(xf); } void shizhong() { uchar i; 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(); } /*******************************************************************/ /* */ /* 延时函数 */ /* //========================================== */ //******************************************************************* void main(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获取时间的。其函数为void timer()interrupt1//T0中断函数、workhour()//时间计算。 4.声音模块设计:该模块比较简单,其函数为voids_fmq()//蜂鸣器叫、nling()//判断是否闹铃。 5.调节模块设计:该模块要实现5个模式调节和转变。模式0:正常工作状态;模式1:修改时间;模式2:选择一个需要改变的闹钟;模式3修改选定的闹钟分钟;模式4:修改选定的闹钟小时。 3.3 设计示意图 图1 总设计示意图 四、仿真分析 通过设计程序实现课程设计要求,通过仿真验证程序是否正确,仿真所用到的元器件有AT89C51、LCD液晶屏、三个独立按键、一个发声装置、8个电阻。仿真图如图2所示: 图2 仿真电路图 4.1 调节工作模式 调节模式的实现只用了三个按键,分别是mode、inc和dec按钮。如图三所示: 图3 三个调节按键 开始仿真时,进入设定好的模式0,此时液晶显示屏显示的是初始值,然后按下mode按键,则进入模式1:进入修改时间,即设定闹钟时间。此时修改分钟按INC按键,修改小时按DEC按键,再次按下mode按键,则进入模式2:选择要修改的闹铃。此时液晶显示的第二个闹铃,可以按下inc按键加,也可以按下dec按键减。再次按下mode按键,则进入模式3:修改选定的闹钟分钟。此时修改的是闹钟的分钟,inc按键加,、dec按键减。再次按下mode按键,则进入模式4:修改选定的闹钟小时,inc加,dec按键减。再次按下mode按键。则回到模式0:正常工作。 4.2 闹钟实现 程序初始化的时候对10个闹钟进行了赋值,闹钟时间自己设定,我设定的分别是{8:00、8:20、8:30、8:40、8:50、9:00、9:30、10:00、10:15、10:30 }。如果要修改闹钟时间,可以依次进入调节模式2、3、4进行修改。当到了闹铃时间时,则蜂鸣器会响起来。蜂鸣器如图4所示 图4 蜂鸣器 4.3 温度测量 本次设计采用了DSB18B20温度芯片,该芯片能测量环境中的温度变化,通过单片机的处理就可以显示实时温度值,当环境温度改变时,显示出来的温度会随着改变。 图5 DS18B20温度芯片 液晶显示采用的是12864液晶显示屏,其仿真图如图6所示: 图6 12864液晶显示屏 五、心得体会 刚开始进行课程设计的时候,在老师一番讲解之后,觉得会比较简单。但实际情况并非如此,一开始就纠结与到底使用汇编语言编写程序还是用C51语言编写程序,在自己百般无奈和同学的建议下选择了C51编写程序。第一天回来后再网上和图书馆查阅资料后,把我给看傻了,一个个程序都那么长,但C51明显比汇编的相对简单明了多了。在参考网上的程序之后,自己也慢慢的进入了编写程序的状态,一步一步的用C51实现课程设计的要求。 在编写程序的过程中确实遇到了不少困难,很多东西都不知道该如何用C语言表达,只能去请教班上的精通C语言的同学,看到别的同学很快就完成了这次课程设计,呆在实验室的人一天比一天少,自己内心却是挺着急的,很想早点完成课程设计的要求,但最后还是没能在给定的时间完成这次课程设计,没能完全达到本次课程设计的要求,自己内心也颇为郁闷。 通过这次课程设计,给我一个严重的教训,无论做什么都不要太过于自信,要多和同学交流。一定要尽早的完成老师的要求,不要总是拖拖拉拉。总的来说,虽然没能完全达到老师的要求,但这次课程设计给了我血的教训,有过刻骨的记忆,以后一定要努力做好最基本的自己。 六、参考文献 1.单片机原理与应用/曾屹 刘辉等编著---中南大学出版社,2009年2月 2. 单片机C51程序设计教材与实验/祁伟等编著---北京航空航天大学出版社,2006年1月 3.单片机微型机计算机技术/刘国荣等编著---机械工业出版社,2000年1月 4.百度文库目 录 第一章 总 论 1 1.1项目概况 1 1.2研究依据及范围 3 1.3主要技术经济指标 4 1.4研究结论及建议 4 第二章 项目建设的背景和必要性 6 2.1项目建设的背景 6 2.2项目建设的必要性 8 第三章 项目服务需求分析 11 第四章 项目选址与建设条件 13 4.1选址原则 13 4.2项目选址 13 4.3建设条件 14 4.4项目建设优势条件分析 15 第五章 建设方案 18 5.1建设规模与内容 18 5.2总体规划设计 19 5.3建筑方案 24 5.4结构方案 26 5.5给水工程 27 5.6排水工程 29 5.7电气设计 31 5.8暖通设计 34 5.9项目实施进度 35 第六章 节能措施 37 6.1 设计依据 37 6.2节能措施 37 第七章 环境影响分析 39 7.1 环境影响分析 39 7.2 环境保护措施及治理效果 40 第八章 消防与安全卫生 42 8.1 消防 42 8.2  劳动安全 43 8.3  卫生防护 44 第九章 组织机构与运作方式 45 9.1  组织机构 45 9.2组织管理 46 9.3劳动定员 46 第十章 投资估算 47 10.1编制依据 47 10.2  投资估算 47 10.3资金筹措 48 第十一章  经济效益评价 49 11.1 成本核算 49 11.2 利润估算 51 11.3经济风险分析 52 11.4财务评价结论 54 第十二章 结 论 55
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服