单片机嵌入式实验报告51秒表Word格式文档下载.docx
《单片机嵌入式实验报告51秒表Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机嵌入式实验报告51秒表Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。
![单片机嵌入式实验报告51秒表Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-11/20/22c5bd34-7907-45fd-9c41-2ece3e4f4064/22c5bd34-7907-45fd-9c41-2ece3e4f40641.gif)
三、使用的系统平台
软件平台:
keil51
keil51是美国keilsoftware出品的51系列兼容单片机C语言软件开发系统,是众多单片机开发软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真于一体,同时还支持PLM、汇编、和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有强大的功能。
硬件平台:
STC89C52单片机、1602液晶显示器、按钮、发光二极管
STC89C52单片机:
STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
具有以下标准功能:
8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。
另外STC89X52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35MHz,6T/12T可选。
1602液晶显示器:
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
四、系统总体设计
如下图所示,整个秒表以STC89C52为核心,按下停止键或启动键控制秒表的停止和开始,同时反映给STC89C52,再经过处理显示在1602液晶显示器上,进行计时。
五、系统的详细设计
硬件:
系统总的原理图如上图所示,按下暂停和启动按键,秒表开始计时并显示在LCD1602液晶显示器上。
对于STC89C52单片机,其内部带有定时/计数系统,此定时功能是通过对外部晶振的脉冲进行计数,从而达到计时功能。
对于LCD1602通过指令来控制它的读写操作。
软件流程图:
六、系统的软件实现
主要函数:
延时函数:
voiddelay1ms()
{
unsignedchari,j;
for(i=0;
i<
10;
i++)
for(j=0;
j<
33;
j++);
}
voiddelay(unsignedcharn)
{
unsignedchari;
n;
delay1ms();
忙状态测试:
unsignedcharBusyTest(void)
bitresult;
RS=0;
//根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1;
//E=1,才允许读写
_nop_();
//空操作
//空操作四个机器周期,给硬件反应3时间
result=BF;
//将忙碌标志电平赋给result
E=0;
//将E恢复低电平
returnresult;
voidWriteInstruction(unsignedchardictate)
{
while(BusyTest()==1);
//如果忙就等待
RS=0;
//根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
//E置低电平(根据表8-6,写指令时,E为高脉冲,
//就是让E从0到1发生正跳变,所以应先置"
0"
//空操作两个机器周期,给硬件反应时间
P0=dictate;
//将数据送入P0口,即写入指令地址
//空操作四个机器周期,给硬件反应时间
//E置高电平
//当E由高电平跳变成低电平时,液晶模块开始执行命令
voidWriteAddress(unsignedcharx)
WriteInstruction(x|0x80);
//显示位置的确定方法规定为"
80H+地址码x"
voidWriteData(unsignedchary)
RS=1;
//RS为高电平,RW为低电平时,可以写入数据
P0=y;
//将数据送入P0口,即将数据写入液晶模块
voidLcdInitiate(void)
delay(15);
//延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38);
//显示模式设置:
16×
2显示,5×
7点阵,8位数据接口
delay(5);
//延时5ms ,给硬件一点时间
//连续三次,确保初始化成功
delay(5);
WriteInstruction(0x0c);
显示开,无光标,光标不闪烁
WriteInstruction(0x06);
光标右移字符移动
WriteInstruction(0x01);
//清屏幕指令将以前的显示内容清除
voidDisplaySecond()
i=s/10;
//取整运算,求得十位数字
j=s%10;
//取余运算,求得各位数字
WriteAddress(0x46);
//写显示地址,将十位数字显示在第2行第11列
WriteData(digit[i]);
//将十位数字的字符常量写入LCD
WriteData(digit[j]);
//将个位数字的字符常量写入LCD
WriteData(46);
WriteData(digit[count/2]);
voidmain(void)
{unsignedchari;
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;
//启动定时器T0
count=0;
//中断次数初始化为0
s=0;
//秒初始化为0
WriteAddress(0x00);
//写地址,从第1行第4列开始显示
i=0;
//从字符数组的第1个元素开始显示
while(string[i]!
='
\0'
)//只要没有显示到字符串的结束标志'
,就继续
WriteData(string[i]);
//将第i个字符数组元素写入LCD
i++;
//指向下一个数组元素
}
//将分号的字符常量写入LCD
while
(1)//无限循环
DisplaySecond();
//显示秒
//给硬件一点反应时间}}
voidTime0(void)interrupt1using1//定时器T0的中断编号为1,使用第1组工作寄存器
count++;
//每产生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,重新等待计数。
初步完成计数功能。
七、总结
经过两个星期的的秒表设计,我认识到自己还有很多不足,一方面,动手能力较差,需要提高;
另一方面,之前学的知识很多都忘记了,为了更好的完成这次秒表设计,必须要温习相关的内容。
但更重要的是经过这两周的学习,我不仅对单片机的理论有了更好的了解,也成功的将理论知识运用到了实践中,提高了我各方面的能力,虽然有一些方面没有达到老师的要求,但是我会吸取经验,下次一定会做得更好。