学校作息时间控制系统的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告
题目学校作息时间控制系统的设计系(部)
专业(班级)
姓名
学号
指导教师
起止日期
单片机原理及应用课程设计任务书系(部):专业:指导教师:
目录
一.设计原理 (4)
(1)总体设计: (4)
(2)分模块设计: (4)
(3)设计示意图 (4)
三.仿真分析 (5)
(1)调节工作模式: (5)
(2)闹铃实现: (5)
(3)温度测量: (6)
四.设计心得 (6)
五.参考文献 (7)
一.设计原理
(1)总体设计:
首先对设计要求有个整体的了解,明白需要实现哪些功能,实现这些功能需要哪些元器件,要驱动这些元件需要编写什么程序,最后进行总体调试。
本次作息时间的设计,使用了单片机A T89C51,LCD为AMPIRE12864,温度元件为DS18B20,还有一个声音播放器SOUNDER。
对于LCD和DS18B20 要进行初始化。
将本次设计分成5个模块分别进行设计,分成:温度模块、LCD显示模块、时间模块、声音模块、调节模块。
分模块设计好了以后,再综合起来设计主程序main(),实现所需要求。
(2)分模块设计:
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:修改选定的闹铃的小时
(3)设计示意图
图一. 总设计示意图
三.仿真分析
5个具体模块的功能实现,已经在程序注释中解释了,现在主要分析怎么操作这些功能的实现。
如图二所示
图二:总的硬件电路图
(1)调节工作模式:
调节模式的实现只用了三个按钮,分别是mode 、inc和dec按钮。
如图三所示:
图三:三个调节按钮
(2)闹铃实现:
程序初始化的时候对20个闹铃时间进行了赋值,其闹铃的时间分别是{8:00、8:45、8:55、9:40、10:00、10:45、10:55、11:40、14:00、14:45、14:55、15:40、16:00、16:45、16:55、17:40、19:00、19:45、19:55、20:40}。
如果要修改闹铃时间,可以依次进入调节模式2、3、4进行修改。
当到了闹铃时间时,则蜂鸣器会响起来。
图十:蜂鸣器
(3)温度测量:
本次设计采用了DS18B20温度芯片,该芯片能测量环境中的温度变化,通过单片机的处理就可以显示出实时温度值。
当环境温度改变时,显示出来的温度也会随着改变
图十一:DS18B20温度芯片
四.设计心得
刚刚学完汇编语言,猜测可能使用汇编来编程的。
没想到必须得用C语言。
好久没有使用C语言编程了,当年学的时候觉得这个是软件,专业是搞硬件的与本专业联系不大,就学的不怎么好,现在都忘了差不多了。
在课程设计之前,有一个星期的实训时间,做了关于流水灯,名字学号显示,方波,方阵。
流水灯、方波,若要用刚学不久的汇编语言还好说,还是可以写出来的,可是要用C语言还真是有点问题。
自己趁着这个时间,复习了汇编语言的程序,可也只能方波和流水灯,但是看到同学用C语言只用了很简单的几行程序就编出方波的程序时,我又一次的被打击到了。
没想到C语言在自己的专业上还有这么大的用,突然想起单片机书上第一章的内容写的是单片机的高级语言是C语言。
这次做的是学校作息时间控制系统,很贴近生活实际,通过翻以前上课用的书籍,以及上网查阅资料。
自己对这次的编程有了一点的概念。
而LCD12864这块显示器却让我有点头痛,
这个东西之前并没有接触过,教科书上也没有关于它的介绍。
它的硬件结构,驱动程序都要自己另外查阅资料。
与单片机的接口连接好搞定,可是它的显示地址却有点把不准。
很费时间。
当搞清显示模块时,一切似乎都好办了,当显示出自己的名字和学号班级时,莫名的成就感,接下来将时间模块移植进去就可以了,不过还得做一点点小小的修改。
程序这一块我不是很强,移植进去后运行没有错误,可就是不显示,而且屏幕还黑了一半,当时心都有点发凉,这毕竟是搞了很久的东西,要是这个结果就有点对不起观众了。
请教与班上的程序高手,做了些适当的修改,当自己的姓名和时间一起终于显示出来了的时候,那种兴奋是莫名的。
作为练习,还移植了一个温度模块,功能多才是王道。
对于学习的态度还是该端正,学的东西都会有用的,只不过有些东西你暂时不知道用在那里而已。
当那一天你真的要用时,若是因自己没学扎实而不会时,那是该多么的遗憾。
五.参考文献
1.单片机典型系统设计实例精讲/彭为等编著.—北京:电子工业出版社,2006.5
ISBN 7-121-02461-6
2.单片机C51程序设计教材与实验/祁伟等编著。
—北京:北京航空航天大学出版社,
2006.1 ISBN 7-81077-736-X
3.单片机微型计算机技术/刘国荣等编著。
—北京:机械工业出版社.2000.1
4.单片机原理与应用/曾屹等编著。
—长沙:中南大学出版社.2009.5 (高等院校培养应用
型人才电子技术类课程规划教材) ISBN 987-7-81105-832-
#include<reg51.h>
#include<intrins.h>
#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=7 ; //用于表示日期
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]=
{
{0x20,0x20,0x24,0xA4,0xA4,0xBF,0xA4,0xE4,0xA4,0xBF,0xA4,0xE6,0xA4,0x30,0x20,0x 00} , /*"王",0*/
{0x00,0x80,0x80,0x5F,0x4A,0x2A,0x0A,0x0F,0x0A,0x2A,0x2A,0x4F,0x40,0x80,0x00,0x00 } ,
{0x40,0x20,0xF8,0x07,0x88,0x48,0x38,0x10,0x54,0x54,0xFF,0x54,0x54,0x7C,0x10,0x00}, /*"宇",1*/
{0x00,0x00,0xFF,0x44,0x29,0x19,0x27,0x49,0x89,0x89,0xFF,0x89,0x89,0xCD,0x49,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},
{0x10,0x10,0x91,0xD6,0xB0,0x10,0xFE,0x82,0x82,0x82,0x82,0x82,0xFF,0x02,0x00,0x00}, /* "祝",6*/
{0x02,0x01,0x00,0xFF,0x80,0x41,0x21,0x18,0x07,0x00,0x3F,0x40,0x41,0x40,0x70,0x00}, {0x40,0x20,0xF8,0x07,0x40,0x20,0x18,0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00,0x00}, /*"你",7*/
{0x00,0x00,0xFF,0x00,0x00,0x08,0x04,0x43,0x80,0x7F,0x00,0x01,0x06,0x0C,0x00,0x00}, {0x80,0x70,0x00,0xFF,0x10,0x20,0x10,0x10,0xFF,0x10,0x10,0x10,0xF8,0x10,0x00,0x00}, /*"快",8*/
{0x00,0x00,0x00,0xFF,0x82,0x42,0x22,0x1A,0x07,0x0A,0x12,0x22,0x43,0xC2,0x42,0x00} ,
{0x00,0x80,0xC0,0xBC,0x84,0x84,0x84,0xF4,0x82,0x82,0x83,0x82,0x80,0xC0,0x80,0x00} ,/*"乐",9*/
{0x00,0x40,0x20,0x10,0x0C,0x40,0x80,0x7F,0x00,0x00,0x04,0x08,0x30,0x60,0x00,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 xuehao[20][8]=
{
{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00},
{0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",0*/
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00},
{0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"0",1*/
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00},
{0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"1",2*/
{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00},
{0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},/*"1",3*/
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00},
{0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"0",4*/
{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00},
{0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},/*"1",5*/
{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00},
{0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",6*/
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00},
{0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"4",7*/
{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00},
{0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"0",8*/
{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00},
{0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},/*"7",9*/
};//学号码
unsigned char code shu[20][8]=
{
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00},
{0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"0",0*/
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00},
{0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"1",1*/
{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00},
{0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",2*/
{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00},
{0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},/*"3",3*/
{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00},
{0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},/*"4",4*/
{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00},
{0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},/*"5",5*/
{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00},
{0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},/*"6",6*/
{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00},
{0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},/*"7",7*/
{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00},
{0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},/*"8",8*/
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00},
{0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00},/*"9",9*/
};//数字码
unsigned char code fuhao[12][8]=
{
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01 },/*"-",0*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00 },/*".",1*/
{0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00},{0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00
},/*":",2*/
{0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00},{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },/*".",3*/
{0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00},{0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00 },/*"C",4*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },/*" ",5*/
};//符号码
/************************************************************************** **************************LCD显示模块程序******************************* *************************************************************************/ /*********检查12864LCD中是否忙*****************************************/ checkbusy()
{
E=1;
RW=1;
RS=0;
LCD=0Xff;
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<n+2*a;j++)
{
if(lineaddress>=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++)
{
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<n+2*a;j++)
{
if(lineaddress>=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]);}
lineaddress+=8;
}
}
/***************************LCD初始化************************************/ void LCD_inti()
{ writecode(0X3f);//显示开关关
writecode(0XC0);//修改显示起始行
writecode(0Xb8);//修改页地址,x地址
writecode(0X40);//修改列地址,y地址
}
/*****************************显示固定的汉字******************************/ void xingxian()
{
hanzi(0Xb8,0X40,4,0,&zi);//显示姓名"黄健"
zifu(0xb8,0x70,20,0,&xuehao);//显示学?"2008042126"
hanzi(0xba,0x60,2,2,&zi);//显示"时"
hanzi(0xba,0x80,2,3,&zi);//显示"分"
hanzi(0xba,0xa0,2,4,&zi);//显示"秒"
hanzi(0xbc,0xa0,2,5,&zi);//显示"模"
zifu(0xbc,0x40,2,2,&shu); // 显示"年份"
zifu(0xbc,0x48,2,0,&shu);
zifu(0xbc,0x50,2,1,&shu);
zifu(0xbc,0x58,2,1,&shu);
zifu(0xbc,0x60,2,0,&fuhao);
zifu(0xbc,0x78,2,0,&fuhao);
zifu(0xb8,0x60,2,5,&fuhao); //显示空白
zifu(0xb8,0x68,2,5,&fuhao);
zifu(0xba,0x40,2,5,&fuhao);
zifu(0xba,0x48,2,5,&fuhao);
zifu(0xba,0xb0,2,5,&fuhao);
zifu(0xba,0xb8,2,5,&fuhao);
zifu(0xbc,0x90,2,5,&fuhao);
zifu(0xbc,0x98,2,5,&fuhao);
zifu(0xbc,0xb0,2,2,&fuhao);
zifu(0xbe,0x58,2,0,&fuhao); //显示"--"
}
/************************************************************************** *************************温度模块程序************************************** **************************************************************************/ /***************************延时******************************************/ void delayds(unsigned int i)
{
while(i--); /*12M,一次6us,加进入退出14us(8M晶振,一次9us) */
}
/*******************************初始化函数********************************/ unsigned char init(void)
{
unsigned char x;
DQ=1;//复位
delayds(8);
DQ=0; //单片机将DQ拉低
delayds(80); //复位信号延时大于480us
DQ=1; //在复位电平结束之后,单片机应该将数据单总线拉高
delayds(14);
x=DQ; //判断复位是否成功。
如果x=0则初始化成功,x=1则初始化失败
delayds(20);
return(x);
}
/*************************读一个字节**************************/
readchar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for(i=8;i>0;i--) /*//写入ds1820 的bit 数,一个字节8 个bit*/
{
DQ=0; // 给脉冲信号, "读"起始位
dat>>=1;//右移运算,把一个字节data(A)分成8 个bit 环移
DQ=1; // 给脉冲信号,"读"停止位
if(DQ)
dat|=0x80;//按位或,取最高位并存入dat中,DQ=1则dat的最高位也为1
delayds(4);
}
return(dat);
}
/*************************写一个字节****************************/
writechar(unsigned char dat)
{
unsigned char i=0;
for (i=8;i>0;i--)
{
DQ=0; //"写"起始
DQ=dat&0x01; //通过按位与使送出数据为"0"或"1",取最低位,先送//低位再送delayds(5); //60us到120us延时
DQ=1; //"写"停止
dat>>=1; //右移运算,取高一位数据传入
}
delayds(4);
}
/****************************读取温度********************************/ readtemp()
{
float tt=0;
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
init();
writechar(0xCC); // 跳过读序号列号的操作
writechar(0x44); // 启动温度转换
init();
writechar(0xCC); // 跳过读序号列号的操作
writechar(0xBE); //写入读取温度指令,读取温度寄存器等(共可读9个寄存器)//前两个就是温度
a=readchar(); //读温度值的低字节
b=readchar(); //读温度值的高字节
fu=b&0x80;
if(fu!=0)
{
flag=1;//负温标志位置1
b=~b;//取反
a=~a;
tt=((b*256)+a+1)*0.0625;//求负的温度
t=tt;
}
else
{
flag=0;//正温标志位置0
tt=((b*256)+a)*0.0625;//求正的温度
t=tt;
}
return(t);
}
/******************************温度计算*********************************/ worktemp(void)
{
realtemp=readtemp();//将读取的温度赋给realtemp
bai=realtemp/100;
shi=(realtemp%100)/10;
ge=realtemp%10;
xiaoshu=realtemp-(bai*100+shi*10+ge);
{
if(flag==1)//标志位显示判断
{
zifu(0xbe,0x80,2,0,&fuhao); //显示"符号-"
}
else
{zifu(0xbe,0x80,2,5,&fuhao);}
}
if(bai!=0) //百位显示判断
{
zifu(0xbe,0x88,2,bai,&shu);
}
else
{ zifu(0xbe,0x88,2,5,&fuhao);
if(shi!=0) //十位显示判断
{
zifu(0xbe,0x90,2,shi,&shu);
}
else
{zifu(0xbe,0x90,2,5,&fuhao);}
}
zifu(0xbe,0x98,2,ge,&shu); //个位显示
zifu(0xbe,0xa0,2,1,&fuhao);
zifu(0xbe,0xa8,2,xiaoshu,&shu); //小数位显示
zifu(0xbe,0xb0,4,3,&fuhao); //显示温度单位"。
C"
}
/**************************************************************************
*********************************时间模块程序****************************** **************************************************************************/
/**************************时间值和日期的计算*****************************/ workhour()
{
//时间的计算
h1=hour/10;
h2=hour%10; //小时
f1=minute/10;
f2=minute%10;//分钟
s1=second/10;
s2=second%10; //秒
m1=month/10; //日期的计算
m2=month%10;
d1=day/10 ;
d2=day%10 ;
}
/**************************显示时间和日期*********************************/ void shixian()
{
workhour(); // 取时间和日期
zifu(0xba,0x50,2,h1,&shu);//显示"小时"
zifu(0xba,0x58,2,h2,&shu);
zifu(0xba,0x70,2,f1,&shu);//显示"分"
zifu(0xba,0x78,2,f2,&shu);
zifu(0xba,0x90,2,s1,&shu);//显示"秒"
zifu(0xba,0x98,2,s2,&shu);
zifu(0xbc,0x68,2,m1,&shu); //显示"月份"
zifu(0xbc,0x70,2,m2,&shu);
zifu(0xbc,0x80,2,d1,&shu); //显示"日子"
zifu(0xbc,0x88,2,d2,&shu);
}
/*******************************T0中断函数******************************/ void timer() interrupt 1 //中断函数
{
TH0=(65536-50000)/256; //给T0赋初值
TL0=(65536-50000)%256;
count++;
if(count==20) //满一秒钟,秒加1
{
count=0;
second++;
if(second==60) //满一分钟,分加1
{
second=0;
minute++;
if(minute==60) //满一小时,时加1
{
minute=0;
hour++;
if(hour==24) //满了一日,日加1
{
hour=0;
day++ ;
if(day==30) //满了一月,月加1
{
day=0;
month++;
}
}
}
}
}
}
/************************************************************************** *****************************声音模块程序*****************************************
*************************************************************************** ***/
/******************************延时*******************************************/
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(); //调用蜂铃
}
}
}
/************************************************************************** **********************************调节模块程序***********************************
*************************************************************************** ***/ /*****************************调节模式****************************************/
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%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);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]%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 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]%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:{ 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)%256;
EA=1; //开中断
ET0=1;
TR0=1; //启动中断T0
while(1)
{
worktemp(); //温度显示
shixian(); //时间显示
tiaojie(); //时间调节
nling() ; //用于定时闹钟
}
}
21。