《单片机原理及应用》课程设计说明书题目学校作息时间控制系统的设计系(部)专业(班级)姓名学号指导教师起止日期系部:电信系专业:2011级电子信息工程I课题名称学校作息时间控制系统的设计目录程序................................一、设计内容及要求.........................1.1 设计内容..........................1.2 设计要求..........................二、设计目的............................三、设计原理............................3.1 总的设计 ........................... 3.2 分模块设计 ..........................3.3 设计示意图.........................四、仿真分析............................4.1 调节工作模式 ........................4.2 闹钟实现 .................4.3 温度测量 .................五、心得体会..................六、参考文献..................415151515151515161616 错误!未定义书签。
错误!未定义书签。
错误!未定义书签。
错误!未定义书签。
程序#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=P1A 0; sbit RW=PM1; sbit EN=P1A2; sbit RST=P1A3; sbitPSB=P1A5; sbit mode=P0A0; sbit inc=P0A1; sbit dec=P0A2; sbit fmq=P3A4; //============作息时间控制系统 "}; 吴智勇 2011026103"}; 时间 : : : "};打铃 : : : "}; 定义一个二维数组, 4行, 1 6个字符// 调节模式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++)//key1 模式//kye2 分 //key3 时 // 蜂鸣器接口 code uchar data1[16]={"code uchar data2[]={" code uchar data3[]={" code uchar data4[]={" uchardisp_buff[4][16];// ucharhour,min,sec,minisec; ucharmode_value=0 ,xf;**/{_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 。
5USRW=0; delayus(1);//1 。
5USEN=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);// 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);// }//=========================================//==============================================void display_buff()//{uchar i;显示 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 /////////////// 一行一 行的显示 //////////////// // 行地址: 0X80 0X90 0X88 0X98write_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);}}//===================================== 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 设计内容以单片机为核心,设计一个智能化作息时间控制器。