本科毕业设计说明书(论文)
}
return keyValue[i]; } }
return '$';
第 17 页 共 41页
3.3.3 LCD显示子程序设计
LCD显示是本设计的核心模块之一,为了能在屏幕上总能显示恰当的信息,本设计中LCD显示子程序的功能,应为保障单个字符、字符串的显示,为主程序或其他子程序留出接口,以便需要时可以很容易调用。
本着上述目的,LCD显示子程序的结构如下图所示,它的目的是提供字符与字符串的显示函数。不同层次的函数之间是被调用的关系。
图3.9 显示模块结构图
各函数原型及参数介绍如下:
1void LCDWriteData(uchar Data) // 写数据函数 ○
2void LCDWriteCmd(uchar Cmd) // 写指令函数 ○
3void LCDPosition(uchar row,uchar column) //将坐标转换为LCD的坐标 ○
参数: row为所在行数(1或2),column为在行中的位置(0~15)
本科毕业设计说明书(论文)
4在指定位置写数据函数 ○
void writeChar(uchar row,uchar column, char c)
第 18 页 共 41页
参数: row指定行,column指定列位置,c为待写入的数据。 5写字符串函数 ○
void writeString(uchar row,uchar column1,uchar column2, char *s) 参数:row表示行,column1表示第一行起始地址,column2表示下一行起
始地址,均从1开始。
6 void moveString(char *s) //移动字符串函数 ○
7 void LCDInit(void) //液晶初始化函数 ○
{ LCDWriteCmd(0x38); //设置16*2显示,5*7点阵,8位数据接口 delay(30); LCDWriteCmd(0x01);//清屏 delay(30); LCDWriteCmd(0x06);//地址加一,整屏右移 delay(30); LCDWriteCmd(0x0f);//开显示,光标闪烁,显示光标 }
3.3.4 密码修改子程序设计
在本设计中,密码修改功能是使用外部中断触发的,这意味用户得以随时进行密码的修改,十分方便。因此,密码修改子程序同时也是外部中断0服务程序。若要修改密码,须先输入旧密码密码,密码验证通过后方可设置新密码,新密码输入结束后,验证位数,然后保存新密码。流程如图3.9所示。
本科毕业设计说明书(论文)
第 19 页 共 41页
图3.10 密码修改程序流程图
3.3.5 报警声音子程序设计
本程序的设计类似于电子音乐盒,可以实现1~7七个音符的各种组合,理论上可以播放任意音乐,但音阶始终位于1个八度内。
音调取决于物体振动的频率,频率越高,所发声音音调也就越高。本程序就是利用单片机产生不同频率的方波,来驱动蜂鸣器发出不同音调的声音。
设计中,系统使用了定时中断的方法。这里以起中的音阶“1”为例说明,其初值设为0xF720,对应十进制数63264,则计数65536 - 63264 = 2272次后溢出进入中断,若单片机外接24MHZ晶振,则计数一次对应0.5μs,即计数1136μs
本科毕业设计说明书(论文)
第 20 页 共 41页
后溢出。一个音阶周期为1136μs×2 = 2272μs,对应频率为1 / 2272μs = 440Hz。次频率为音阶“1”所对应的频率值。其他频率对应的计数初值可按照此方法推算出来,具体见表3.1 [17]。
表3.1 不同音阶所对应频率、计数初值
音阶 频率/Hz 计数初值 1 440 0xF720 2 494 0xF888 3 523 0xFC44 4 587 0xF959 5 659 0xFA13 6 698 0xFA67 7 784 0xFB04 由此,可得到报警声音模块的代码如下:
sbit Beep = P3^1;
uchar code scalesH[] = {0xf7,0xf8,0xfc,0xf9,0xfa,0xfa,0xfb}; //7个音符所对应的计数器初值
uchar code scalesL[] = {0x20,0x88,0x44,0x59,0x13,0x67,0x04}; uchar note;
//初始化函数
void AlarmInit()
{ TMOD = 0x01; //T/C0工作在方式一 ET0 = 1; //开定时器中断 EA = 1; //开总中断
TR0 = 0; //关闭定时器0 }
//播放声音
void play(uchar c) {
uint i; switch( c ) {
case 0 : note = 6;
for(i=0;i<3;i++) {
TR0 = 1; delay(300); TR0 = 0; delay(300); } break;
case 1 : for(note=2;note<6;note++) {
TR0 = 1;
本科毕业设计说明书(论文)
delay(300); TR0 = 0; delay(300); } break; }
Beep = 1; }
//定时器0的中断服务函数 void time0() interrupt 1 {
TH0 = scalesH[note]; TL0 = scalesL[note]; Beep = ~Beep; }
第 21 页 共 41页