嵌入式系统综合设计实习报告.docx
- 文档编号:13368758
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:17
- 大小:114.69KB
嵌入式系统综合设计实习报告.docx
《嵌入式系统综合设计实习报告.docx》由会员分享,可在线阅读,更多相关《嵌入式系统综合设计实习报告.docx(17页珍藏版)》请在冰点文库上搜索。
嵌入式系统综合设计实习报告
电子时钟的设计
专业:
电子信息工程(应用性本科)
班级:
电信08-2班
姓名:
陈剑光
学号:
3081818229
设计时间:
2010年10月15日
一、引言.............................................................3
二、设计课题.........................................................3
1、基本原理......................................................3
2、原理框图......................................................3
3、硬件电路原理图...............................................4
4、软件设计......................................................5
(1)、流程图..................................................5
(2)、代码附录................................................7
5、测试过程.....................................................10
(1)、测试数据...............................................10
(2)、数据分析...............................................10
三、结论............................................................11
引言
时钟,自从它发明的那天起,就成为了人类的朋友,但随着时间的推移,科学技术的不断发展,人们对时间计量的精度要求越来越高,应用越来越广。
怎样让时钟更好的为人民服务,怎样让我们的老朋友焕发青春呢?
这就要求人们不断设计出新型时钟。
现今,高精度的计时工具大多数都使用了石英体振荡器,于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校,数字式电子钟用集成电路计时时,译码代替机械式转动,用LED显示器代替显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
本次实习利用单片机实现数字时钟功能的主要内容,其中AT89S52是核心元件同时采用数码管动态显示“时”,“分”,“秒”。
与传统机械表相比,它具有走时准确,显示直观等特点。
它的计时周期为24小时,显满刻度为“23时59分59秒”,另外具有校时功能。
本设计由单片机AT89S52芯片和LCD1602为核心,辅以必要的电路,构成了一个单片机电子时钟。
二、课题设计
1、基本原理
电子钟实际上是一个对标准频率(1Hz)进行计数的计数电路。
振荡器产生的时钟信号经过分频器形成秒脉冲信号,秒脉冲信号输入计数器进行计数,并把累计结果以“时”、“分”、“秒”的数字显示出来。
秒计数器电路计满60后触发分计数器电路,分计数器电路计满60后触发时计数器电路,当计满24小时后又开始下一轮的循环计数。
由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路可以对分和时进行校时。
2、原理框图
3、硬件电路原理图
AT89C52:
单片机芯片。
DB9:
RS232接口。
16PIN:
LCD1602A接口。
CON9:
JB01-03A
MAX202:
RS232电平转换器。
IC1AT89C52:
单片机芯片。
POWCON3:
电源插入插座。
SP:
电源开关。
IC57805:
三端稳压器。
SW1:
按键1
SW2:
按键2
SW3:
按键3
SW4:
按键4
S1:
复位按钮。
LEDP:
电源指示灯。
4、软件设计
(1)流程图
主程序流图
秒中断程序流程图。
中断和清零程序流程图。
程序通过扫描来判断按钮是否按下进行执行相应的中断来实现相应的功能。
(2)代码附录
#include
#defineucharunsignedchar
ucharcodedislcd[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x65,0x69,0x6d,0x54,};
sbitrs=P2^6;
sbitrw=P3^6;
sbite=P2^5;
sbitkey1=P3^3;//key1、key5可以调整分针,key2、key4可以调整时针。
key3为复位键
sbitkey2=P3^2;
sbitkey3=P1^2;
sbitkey4=P3^4;
sbitkey5=P3^5;
unsignedintcou,sec,min,hou;
unsignedintm,n;
voiddelay()//延时子函数功能:
延时
{
unsignedintj;
for(j=0;j<255;j++);
}
voiddelay1()//延时子函数功能:
用于按键延时
{
unsignedinti,j;
for(i=0;i<20;i++)
for(j=0;j<160;j++);
}
voidlcd_wmc(uchari)//通过数据口向液晶写命令
{
P0=i;
rs=0;
rw=0;
e=0;
delay();
e=1;
}
voidlcd_wmd(uchari)//通过数据口向液晶写数据
{
P0=i;
rs=1;
rw=0;
e=0;
delay();
e=1;
}
voidlcd_init()//1602液晶初始化
{
lcd_wmc(0x01);//清屏
lcd_wmc(0x38);//
lcd_wmc(0x0c);
lcd_wmc(0x06);
}
voidlcd_time()//函数名:
时间显示//功能:
在液晶第一行显示时间
{
lcd_wmc(0x80);
lcd_wmd(dislcd[14]);
lcd_wmc(0x81);
lcd_wmd(dislcd[12]);
lcd_wmc(0x82);
lcd_wmd(dislcd[13]);
lcd_wmc(0x83);
lcd_wmd(dislcd[11]);
lcd_wmc(0x84);
lcd_wmc(0x85);
lcd_wmd(dislcd[hou/10]);
lcd_wmc(0x86);
lcd_wmd(dislcd[hou%10]);
lcd_wmc(0x87);
lcd_wmd(dislcd[10]);
lcd_wmc(0x88);
lcd_wmd(dislcd[min/10]);
lcd_wmc(0x89);
lcd_wmd(dislcd[min%10]);
lcd_wmc(0x8a);
lcd_wmd(dislcd[10]);
lcd_wmc(0x8b);
lcd_wmd(dislcd[sec/10]);
lcd_wmc(0x8c);
lcd_wmd(dislcd[sec%10]);
lcd_wmd(0x8d);
//lcd_wmc(0xc3);
}
voidmain()//函数名:
主函数
{
P0=0xff;
cou=0;
sec=00;
min=00;
hou=00;
TMOD=0x01;
TH0=0xca;
TL0=0x0e;
EA=1;
ET0=1;
TR0=1;
lcd_init();
lcd_time();
while
(1)//按键程序
{
if(key1==0)//键值key1是否有效
{
delay1();//键值有效,等待key1弹起
if(key1==1)//key1弹起,分针加
{
min++;
if(min>59)
{
min=0;
hou++;
}
lcd_wmc(0x88);
lcd_wmd(dislcd[min/10]);
lcd_wmc(0x89);
lcd_wmd(dislcd[min%10]);
}
}
if(key2==0)
{
delay1();
if(key2==1)
{
hou++;
if(hou>23)
hou=0;
lcd_wmc(0x85);
lcd_wmd(dislcd[hou/10]);
lcd_wmc(0x86);
lcd_wmd(dislcd[hou%10]);
}
}
if(key4==0)
{
delay1();
if(key4==1)
{
if(hou>0)
{
hou--;
}
if(hou<1)
{
hou=0;
lcd_wmc(0x88);
lcd_wmd(dislcd[min/10]);
lcd_wmc(0x89);
lcd_wmd(dislcd[min%10]);
}
}
}
if(key5==0)//键值key5是否有效
{
delay1();//键值有效,等待key5弹起
if(key5==1)//key5弹起,分针减
{
if(min>0)
{
min--;
}
if(min==0)
{
min=0;
lcd_wmc(0x88);
lcd_wmd(dislcd[min/10]);
lcd_wmc(0x89);
lcd_wmd(dislcd[min%10]);
}
}
}
}
}
voidtime0()interrupt1//函数名:
定时器0中断函数//功能:
时间调整
{
TH0=0xca;
TL0=0x0e;
cou++;
if(cou>=100)
{
cou=0;
sec++;
lcd_time();
if(sec>59)
{
sec=0;
min++;
lcd_time();
if(min>59)
{
min=0;
hou++;
lcd_time();
if(hou>23)
hou=0;
}
}
}
}
5、调试过程
(1)测试数据
1.用数字万用表测量输入电源的电压值
2.用万用表在STC89C52的2脚测输出电压,观看他的电压值,记录下来
3.测量各级电阻的阻值。
4.调试各个按钮,看是否生效。
5.要是都没有问题,就把时间调准,把我路由器电源接上一直放在宿舍观看一天,观察时间跟电脑相比,存在多大的误差。
(2)数据分析
1.经测试,电源的电压值稳定在9V。
(结论:
电源电压输出值正常)
2.经测试单片机芯片STC89C52的两个管脚的电压值是5V
(结论,见过查阅有关资料,供电正常)
3.经测试,各个电阻的阻值都是正常。
4.经过调试,每个校时按钮都可以准确无误的控制时分的加减,还有复位按钮也可以正常的将时间清零。
5.经过一个星期连续观察(不关闭电源的情况下),时间跟电脑的误差为零。
实际调试中出现了不少问题,如LCD无显示,校时按钮不起作用。
仔细检测后发现主要是电路的一些接线有错或者程序的编写存在逻辑问题。
下面是我们的通电源逐级调试,逐级排除故障错误的调试调试过程:
(1)烧录程序进去,LCD无显示,经过检查电路板,原来是header5*2焊接反了,用焊锡吸锡器将针脚的焊锡吸掉,取出那个header5*2,重新正确焊接,单片机就工作了
(2)
(3)按钮不起作用,也是没有准确定义各个接口引起的,修改程序即可修正错误。
(4)排除LCD不显示的,是LCD初始化错误,没有准确的定义管脚,经过修改,LCD正常显示了。
(5)还有显示端口不存在的,经过检查分析,原来是usb转串口驱动安装不准确。
三、结论
这是我一次用单片机做成功的小制作硬件。
在制作过程中,我对52单片机的了解进一步的加深,对KEIL软件的使用更加灵活。
查阅相关单片机电子钟设计的网站,对单片机c语言的编写也有了初步了解。
我学到了许多自己以前没有接触过的知识,真是受益匪浅在写报告时Microsoft–word也是不可缺少的办公软件,以前我对这个软件很陌生,通过这次的报告的编写,我对它的运用得到了进一步的认识。
单片机作为我们的必修课之一,虽然在开学初我对这门课并没有什么兴趣,觉得那些程序枯燥乏味,但在这次实习后我发现自己在一点一滴的努力中对单片机的兴趣也在逐渐增加。
我觉得做单片机实习是十分有意义的,而且是十分必要的。
在已度过的大学时间里,我们大多数接触的是专业课。
我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?
如何把我们所学的专业基础课理论知识运用到实践中去呢?
我想做类似的课程设计就为我们提供了良好的实践平台。
要做好一个课程设计,就必须做到:
在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。
总之这次单片机的实习让我把理论设计和工程实践相结合、巩固基础知识与培养创新意识相结合、个人作用和集体协作相结合等方面全面的培养学生的全面素质。
这些在我今后的学习和工作当中都会有很大的帮助。
这次单片机只设计了简单的时分秒,还没有设计出可以计算年月日,星期的,希望在以后的学习中能进一步改进这个程序,让他更完美,还可以设计自动报时,增加相应的电子器件,让他有闹铃功能,还可以增加通讯功能,让上位机可以跟她通讯,从网上下载天气预报的消息,通过调试助手发送字符上去,让他能自动那些消息可以像证券公布信息那样,滚动播出字符消息
最后我要感谢这次实习中给与我帮助的各位老师,谢谢您们!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 综合 设计 实习 报告