for(j=0;j<120;j++);
}
//*********************写液晶命令程序****************
voidwrite_com(ucharcom)
{
rs=0;
rw=0;
en=0;
Delay1ms
(2);
P2=com;
Delay1ms(4);
en=1;
Delay1ms(4);
en=0;
}
//*********************写液晶数据程序*********************
voidwrite_data(uchardt)//bunengyongdata
{
rs=1;
rw=0;
en=0;
Delay1ms
(2);
P2=dt;
Delay1ms(4);
en=1;
Delay1ms(4);
en=0;
}
//**********************液晶初始化程序***********************
voidinitial_lcd()//henyongyiwangjigaibufen
{
Delay1ms(20);
write_com(0x38);//16*2xianshi,5*7xianshi,8weishijujiekou
Delay1ms(5);
write_com(0x0c);//kaixianshi,buxianshiguangbiao
Delay1ms(5);
write_com(0x06);//xueyigezifuhouacjia1
Delay1ms(5);
write_com(0x01);
}
//***********************定时器0定时1S****时钟程序************************
voidtime0(void)interrupt1using0
{
TH0=0x3c;
TL0=0xb0;
jishu++;
if(jishu==20)
{
jishu=0;
miao++;
}
}
//***********************定时器1蜂鸣器************************
voidtime1(void)interrupt3using0
{
TH1=0xff;
TL1=0x44;
fm=~fm;
}
//**********************拆分显示显示程序*************
voidchaixian(ucharxmiao)
{
ucharxmiao1,xmiao2,xmiao3;
xmiao1=xmiao/100;
xmiao2=xmiao%100/10;
xmiao3=xmiao%10;
write_com(0x80+0x04);
write_data('n');
write_data('u');
write_data('m');
write_data(0x30+num);
write_com(0x80+0x0a);
if(xmiao==100)
{
write_data(0x30+xmiao1);
write_data(0x30+xmiao2);
write_data(0x30+xmiao3);
}
if(xmiao<100)
{
write_com(0x80+0x0c);
write_data(0x00);
write_com(0x80+0x0a);
write_data(0x30+xmiao2);
write_data(0x30+xmiao3);
}
}
//******************************定时程序
voiddingshi(uchari)
{
write_com(0x01);
TR0=1;
while(miao-1!
=i)
{
tmiao=i-miao;
chaixian(tmiao);
if(zz==1)
{
break;
}
if(fanhui==0)
{
miao=0;
jishu=0;
write_com(0x01);
write_com(0x80+0x02);
write_data('T');
write_data('i');
write_data('a');
write_data('o');
write_data(0x00);
write_data('M');
write_data('o');
write_data(0x00);
write_data('S');
write_data('h');
write_data('i');
break;
}
}
if(zz==0&&(miao-1)==i)
{
TR1=1;
write_com(0x01);
write_com(0x80+0x04);
write_data('T');
write_data('i');
write_data('m');
write_data('e');
write_com(0x80+0x09);
write_data('E');
write_data('n');
write_data('d');
while(fanhui==1)
{
}
TR1=0;
miao=0;
jishu=0;
write_com(0x01);
write_com(0x80+0x02);
write_data('T');
write_data('i');
write_data('a');
write_data('o');
write_data(0x00);
write_data('M');
write_data('o');
write_data(0x00);
write_data('S');
write_data('h');
write_data('i');
}
TR0=0;
}
//******************************键盘扫描程序***************************
voidkeyscan()
{
ucharnum1;
if(tiao==0)
{
Delay1ms(10);
if(tiao==0)
{
num++;
if(num==6)
{
num=0;
}
if(num==1)
{
write_com(0x01);
write_com(0x80+0x04);
write_data('n');
write_data('u');
write_data('m');
write_data(0x30+num);
write_com(0x80+0x0a);
write_data(0x30+1);
write_data(0x30+0);
}
if(num==2)
{
write_com(0x01);
write_com(0x80+0x04);
write_data('n');
write_data('u');
write_data('m');
write_data(0x30+num);
write_com(0x80+0x0a);
write_data(0x30+2);
write_data(0x30+0);
}
if(num==3)
{
write_com(0x01);
write_com(0x80+0x04);
write_data('n');
write_data('u');
write_data('m');
write_data(0x30+num);
write_com(0x80+0x0a);
write_data(0x30+3);
write_data(0x30+0);
}
if(num==4)
{
write_com(0x01);
write_com(0x80+0x04);
write_data('n');
write_data('u');
write_data('m');
write_data(0x30+num);
write_com(0x80+0x0a);
write_data(0x30+5);
write_data(0x30+0);
}
if(num==5)
{
write_com(0x01);
write_com(0x80+0x04);
write_data('n');
write_data('u');
write_data('m');
write_data(0x30+num);
write_com(0x80+0x0a);
write_data(0x30+1);
write_data(0x30+0);
write_data(0x30+0);
}
while(tiao==0)
{
}
}
}
if(kaishi==0)
{
Delay1ms(10);
if(kaishi==0)
{
while(kaishi==0)
{
}
switch(num)
{
case1:
num1=10;break;
case2:
num1=20;break;
case3:
num1=30;break;
case4:
num1=50;break;
case5:
num1=100;break;
}
if(zz==0)
{
ucharmiao=0;
TR0=1;
dingshi(num1);
}
if(zz==1)
{
zz=0;
TR0=1;
dingshi(num1);
}
}
}
}
//*****************************暂停键*****************************
voidint1(void)interrupt2using0
{
zz=1;
TR0=0;
while(zanting==0)
{
}
}
//**************************主程序********************************
voidmain()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=0xff;
TL1=0x44;
IE=0x8e;
initial_lcd();
while
(1)
{keyscan();
}
}
四、各部分电路设计
1.单片机简介
单片机是把中央处理器(CPU),存储器和输入输出接口电路等主要微型机部件集成在一块芯片上,因此称为单片机,主要用于测控领域。
自从1976年Intel公司推出第一代8位的MCS—48系列单片机,它以体积小、控制功能全、价格低等优点为单片机的发展打下了坚实的基础。
随后单片机发生了深刻的变革,目前市面上最常用的51系列单片机也是8位的,因为其品种全、兼容性强、软硬件资料丰富的特点,因此历经几十年仍然是最常用的单片机系列。
随着技术的进步和发展,16位单片机32位单片机相继产生,其性能也有了长足的提高,但是其基本组成仍然没有改变。
设计中应用到的STC89C52是Atmel公司生产的51系列单片机中的一个典型代表。
图4-1STC89C52引脚图
从图中可以看到STC89C52有P0、P1、P2、P3四个输出输入口,其中P3.2口接开关用来控制数码管显示的起停,当开关闭合时P3.2为低电平可以控制数码管的显示,当P3.2为高电平时可以关闭数码管或显示实时时间。
其中+5V的高电平有电源电路提供,晶振电路是接到18、19管脚上用来给单片机提供12M赫兹的脉冲,复位电路接成上电复位电路的形式。
2.动态LCD液晶显示器显示
液晶是人机交互最重要的通道,液晶不光要显示文字信息,还要显示波形信息,所以,编写一套完善的函数库是必不可少的,其中应该包括显示ASCII码、字符串、整型数字、浮点数、汉字、画点、画线等一系列函数。
上层函数的建立离不开底层的驱动,最底层驱动应该是建立在液晶基本时序与指令的基础上。
如图4-21,是液晶模块的基本时序图。
图4-21DMF5001液晶模块基本时序图
根据时序图和控制指令,不难写出基本的读写函数。
这些函数就是构建上层的基础。
之后,还必须了解液晶的基本显示方式和充填方式。
如图4-22,是液晶模块的缓冲区与显示屏的映射关系。
T6963控制芯片内部有64KB的缓冲区,可以由程序划分为图形、文本、文本特征3类缓冲区,在不同缓冲区里写入不同数据,在液晶屏上将映射相应的信息,这也就是液晶模块显示信息的原理。
图4-22DMF5001液晶映射方式
因为T6963内部含有ASCII码字库,所以要想显示字符信息,只需在文本区内填入相应的信息即可。
如果要显示汉字或图形,则必须先在单片机内部的ROM区建模,然后将这些信息写入液晶的图形缓冲区,在液晶控制模块的控制下,相应的信息就会映射在显示屏上,也就是我们看到的汉字或图形信息了。
如果要实时显示AD采集的波形图以及FFT处理后的频谱图,这里将就动态波形显示用到的技术加以详细介绍。
波形的显示离不开“点”的显示,所谓“点动成线”也就这个道理,对于只有黑白两级灰度的液晶来说,画一个“点”就是将一个像素点亮。
所以我们根据时序图,先建立在LCD屏上显示“点”的底层函数。
在液晶屏上绘制“点”,有两点需要注意,一是缓冲区空间的大小,二是像素的充填方式。
在DMF5001液晶模块中,“点”的绘制需要在图形缓冲区中进行。
对于160×128像素的显示屏,图形缓冲区一共占用(160×128)/8=2560字节的空间,每一个字节对应一个地址,也就是一共有2560个地址。
考虑到DMF5001图形的充填方式是从上到下,横向填充,加上控制指令本身就支持对一个像素亮灭的控制。
所以很容易根据缓冲区的地址,控制液晶屏上某一个点的亮灭,也就是所谓的画“点”了。
五、整体电路图
见附图
六、设计总结
1.设计过程中遇到的问题及解决方法
本设计是以AT89C51为核心的倒计时秒表,对该系统的硬件和软件结构进行了相应的描述。
开始是电路焊接过程中出现的问题,比如说电路板焊接短路、LCD端口连接错误等,结果造成不能实现预期功能,经过不断实验,细心焊接,最后终于实现了LCD的显示,并且正常工作。
2.设计体会
经过紧张而有辛苦的一周的课程设计结束了。
当我快要完成老师下达给我的任务的时候,我仿佛经过一次翻山越岭,登上了高山之颠,顿感心旷神意,眼前豁然开朗。
课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程。
”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义。
我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础。
3.对设计的建议
这样的课程设计可以学到很多东西,在与老师和同学的交流过程中,互动学习,将知识融会贯通。
老师提出的革新非常的好,认为本学期的实验模式非常实用。
但是提议可以申请将课程延长,由于时间有限没有完成实物,因此我感觉有足够的时间和精力才能作出好的东西。
时间的紧缺成为一个很大的问题。
也希望老师可以为我们指导一下以后的发展方向。
如果可以让每个人都有目的性的学习,会提高学习效率和热情。
七、参考文献
1.张培仁,张志坚,高修峰.十六位单片微处理器原理及应用[M].北京,清华大学出版社.2005.
2.田会方,吴兴强.基于LabVIEW与凌阳SPCE061A实现串口数据采集[J].微计算机信息.2006.
3.BC7281B中文技术手册[M].北京比高科技公司.2002.
附图