1、三、 使用的系统平台软件平台:keil51 keil51是美国keil software出品的51系列兼容单片机C语言软件开发系 统,是众多单片机开发软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真于一体,同时还支持PLM、汇编、和C语言的程序设计,它的界面和常用的微软VC+的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有强大的功能。 硬件平台:STC89C52单片机、1602液晶显示器、按钮、发光二极管 STC89C52单片机:STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。STC89C5
2、2使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RA
3、M、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。 1602液晶显示器:1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块
4、(显示字符和数字)。目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。四、 系统总体设计 如下图所示,整个秒表以STC89C52为核心,按下停止键或启动键控制秒表的停止和开始,同时反映给STC89C52,再经过处理显示在1602液晶显示器上,进行计时。 五、 系统的详细设计硬件: 系统总的原理图如上图所示,按下暂停和启动按键,秒表开始计时并显示在LCD1602液晶显示器上。 对于STC89C52单片机,其内部带有定时/计数系统,此定时功能是通过对外部晶振的脉冲进行计数,从而达到计时功能。
5、 对于LCD1602通过指令来控制它的读写操作。软件流程图:六、 系统的软件实现主要函数: 延时函数:void delay1ms() unsigned char i,j; for(i=0;i10;i+) for(j=0;j33;j+); void delay(unsigned char n) unsigned char i;n; delay1ms();忙状态测试: unsigned char BusyTest(void) bit result;RS=0; /根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1; /E=1,才允许读写 _nop_(); /空操作 /空操作四个机
6、器周期,给硬件反应3时间 result=BF; /将忙碌标志电平赋给result E=0; /将E恢复低电平 return result;void WriteInstruction (unsigned char dictate) while(BusyTest()=1); /如果忙就等待 RS=0; /根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; /E置低电平(根据表8-6,写指令时,E为高脉冲, / 就是让E从0到1发生正跳变,所以应先置0 /空操作两个机器周期,给硬件反应时间 P0=dictate; /将数据送入P0口,即写入指令地址 /空操作四个机器周期,给硬件反应时间
7、/E置高电平 /当E由高电平跳变成低电平时,液晶模块开始执行命令 void WriteAddress(unsigned char x) WriteInstruction(x|0x80); /显示位置的确定方法规定为80H+地址码x void WriteData(unsigned char y) RS=1; /RS为高电平,RW为低电平时,可以写入数据 P0=y; /将数据送入P0口,即将数据写入液晶模块void LcdInitiate(void)delay(15); /延时15ms,首次写指令时应给LCD一段较长的反应时间 WriteInstruction(0x38); /显示模式设置:162
8、显示,57点阵,8位数据接口 delay(5); /延时5ms,给硬件一点时间 /连续三次,确保初始化成功 delay(5); WriteInstruction(0x0c);显示开,无光标,光标不闪烁 WriteInstruction(0x06);光标右移字符移动 WriteInstruction(0x01); /清屏幕指令将以前的显示内容清除void DisplaySecond() i=s/10; /取整运算,求得十位数字 j=s%10; /取余运算,求得各位数字WriteAddress(0x46); /写显示地址,将十位数字显示在第2行第11列 WriteData(digiti); /将十
9、位数字的字符常量写入LCD WriteData(digitj); /将个位数字的字符常量写入LCD WriteData(46); WriteData(digitcount/2);void main(void) unsigned char i;LcdInitiate(); /调用LCD初始化函数TMOD=0x01; /使用定时器T0的模式1 TH0=(65536-46083)/256; /定时器T0的高8位设置初值 TL0=(65536-46083)%6; /定时器T0的低8位设置初值 EA=1; /开总中断 ET0=1; /定时器T0中断允许 TR0=1; /启动定时器T0count=0; /
10、中断次数初始化为0s=0; /秒初始化为0 WriteAddress(0x00); /写地址,从第1行第4列开始显示 i=0; /从字符数组的第1个元素开始显示 while(stringi!=0) /只要没有显示到字符串的结束标志,就继续 WriteData(stringi); /将第i个字符数组元素写入LCD i+; /指向下一个数组元素 /将分号的字符常量写入LCD while(1) /无限循环 DisplaySecond(); /显示秒 /给硬件一点反应时间 void Time0(void ) interrupt 1 using 1 /定时器T0的中断编号为1,使用第1组工作寄存器 co
11、unt+; /每产生1次中断,中断累计次数加1 if(count=20) /如果中断次数计满20次 count=0; /中断累计次数清0 s+; /秒加1 if(s=60) /如果计满60秒 s=0; /秒清0 TH0=(65536-46083)/256; /定时器T0高8位重新赋初值 /定时器T0低8位重新赋初值 七系统的测试结果 程序烧写进52单片机,单品机控制1602显示,可显示出“stopwatch”字样。当按下S1键,计数启动。当按下S2键,计数暂停。当按下S3键,计数置0,重新等待计数。初步完成计数功能。七、 总结 经过两个星期的的秒表设计,我认识到自己还有很多不足,一方面,动手能力较差,需要提高;另一方面,之前学的知识很多都忘记了,为了更好的完成这次秒表设计,必须要温习相关的内容。但更重要的是经过这两周的学习,我不仅对单片机的理论有了更好的了解,也成功的将理论知识运用到了实践中,提高了我各方面的能力,虽然有一些方面没有达到老师的要求,但是我会吸取经验,下次一定会做得更好。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1