单片机报告.docx
- 文档编号:3517211
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:14
- 大小:51.46KB
单片机报告.docx
《单片机报告.docx》由会员分享,可在线阅读,更多相关《单片机报告.docx(14页珍藏版)》请在冰豆网上搜索。
单片机报告
课程设计(综合实验)报告
名称:
单片机课程设计
题目:
利用AT89C52芯片及相关元器件制
作简易时钟
院系:
自动化系
班级:
测控0902
学生姓名:
周建宁
学号:
200902030230
学生姓名:
王世炜
学号:
200902030225
指导教师:
林永君
设计周数:
第十五周
成绩:
日期:
2012年6月3日
单片机课程设计报告
-----时钟制作
一、实验目的:
随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入。
它不但具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,而且特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域(数子时钟在日常生活中最常见,应用也最广泛),单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合来实现所需功能。
我们此次做的数子时钟是以单片机(AT89C52)为核心,结合相关的元器件。
再配以相应的软件,达到制作简易数子时钟的目的。
主要从硬件设计和软件编程两个大的方面:
硬件电路设计主要包括中央处理单元电路、数码显示电路、人机接口电路等几部分组成,软件用C语言来实现。
二、实验要求
1)巩固、加深和扩大单片机应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力;
2)培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,提高组成系统、编程、调试的动手能力;
3)针对课题设计方案的分析、选择、比较、熟悉单片机所用系统开发、研制的过程,软硬件设计的方法、内容及步骤;
4)掌握数子时钟的工作原理。
三、实验原理图
四、实验所需器件及主要器件说明
1
30pF电容
2个
7
开关
2个
2
CRYSTAL
1个
8
蜂鸣器
1个
3
10K电阻
1个
9
LCD1602显示
1个
4
10UF电解电容
1个
10
发光二极管
4个
5
RESPACK-8
2个
11
绿油板
1块
6
AT89C52
1个
12
导线
若干
五、实验程序框图
六、实验程序及解释说明
//**********头文件区************
#include
#include
#include
#include
#include
//*********宏定义方便使用*******
#defineucharunsignedchar
#defineuintunsignedint
//*********定义变量区***********
sbitlcdrw=P1^3;//lcd读写信号
sbitlcden=P1^7;//LCD使能信号
sbitlcdrs=P1^2;//LCD数据/命令选择信号
sbitled1=P3^0;//发光二极管引脚1~6
sbitled2=P3^3;
sbitled3=P3^1;
sbitled4=P3^2;
sbitled5=P1^0;
sbitled6=P1^1;
sbitK1=P1^4;//定义按键
sbitK2=P1^5;
sbitLED_SMG=P1^7;//定义数码管输出
sbitspeak=P1^6;//定义蜂鸣器
unsignedintnum,nu;
codeunsignedcharss[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x1,0x9};//数码管0~9共阳极显示
ucharcodetab_index1[]="ncepugameyear";//LCD显示内容
ucharcodetab_index2[]="it'sdotatime!
";
ucharcodetab_index3[]="ready?
let'sgo!
";
ucharcodetab_index4[]="TKSFVSXXKAR";
uchartab_time[]={0,0,10,0,0,10,0,0};//装时间转换数据
ucharcodetab_char[]="0123456789:
";//
ucharcodetab_chartime[]="Time";
ucharcount,hour=23,minu=50,sec=30;
//*********函数声明区***********
voidlcd_dis();//lcd显示函数
voidlcd_init();//LCD初始化函数
voidwrite_com(uchar);//写命令函数
voidwrite_data(uchar);//写数据函数
voiddelay(uint);//延时函数
voidtrans();//时间转换函数
voidwrite_char();//写字符串函数
voidint_time0();//定时器0中断函数
voidtime();//计时函数
//键盘扫描函数
voidkeyscan1(void)
{
inta1;
if(K1==0)
{
a1=K1;
delay
(1);
if(K1==0)
if(a1==K1)
num++;
}
if(num>3)
num=0;
}
voidkeyscan2(void)
{
inta2;
if(K2==0)
{
a2=K2;
delay
(1);
if(K2==0)
if(a2==K2);
nu++;
}
if(nu>8)
nu=0;
}
//*********主函数开始***********
voidmain()
{
ucharm=0;
nu=0;
TMOD=0x01;//定时器0方式1
EA=1;
ET0=1;
TH0=0xb8;//20ms初值,11.0592MHZ
TL0=0X00;
TR0=1;
led1=1;//初始化二极管及蜂鸣器,数码管
led2=1;
led3=0;
led4=1;
speak=1;
LED_SMG=0;
write_com
(1);
lcd_init();
while
(1)
{
led3=~led3;
led4=~led4;
time();
trans();
lcd_dis();
keyscan2();
if(nu==0)
{
P2=ss[0];
led1=1;led2=1;led5=1;led6=1;speak=1;
}
if(nu==1)
{
P2=ss[1];
led5=~led5;led6=~led6;delay(1000);
}
if(nu==2)
{
P2=ss[2];
led5=~led5;led6=~led6;delay(100);
}
if(nu==3)
{
P2=ss[3];
led5=~led5;led6=~led6;delay
(1);
}
if(nu==4)
{
P2=ss[4];
speak=0;led1=0;led2=0;led5=0;led6=0;
}
}
}
//中断函数
voidint_time0()interrupt1
{
TMOD=0x01;//定时器0方式1
EA=1;
ET0=1;
TH0=0xb8;
TL0=0X00;//20ms初值,11.0592MHZ
TR0=1;
count++;
}
//计时函数
voidtime()
{
if(count>=50)//20ms*50=1s
{
count=0;
sec++;
if(sec>=60)
{
sec=0;
minu++;
if(minu>=60)
{
minu=0;
hour++;
if(hour>=24)
{
hour=0;
}
}
}
}
}
//*********时间转换函数开始*****
voidtrans()
{
tab_time[0]=hour/10;
tab_time[1]=hour%10;
tab_time[3]=minu/10;
tab_time[4]=minu%10;
tab_time[6]=sec/10;
tab_time[7]=sec%10;
}
//*********lcd显示函数开始******
voidlcd_dis()
{
ucharm;
write_com(0x80+1);//设置光标位置
for(m=0;m<5;m++)//显示"Time"
{
write_data(tab_chartime[m]);
delay
(2);
}
write_char();//显示时间
write_com(0x80+0x40);//设置光标位置为第二行
keyscan1();
if(num==0)
{
for(m=0;m<15;m++)//显示预设语句
write_data(tab_index1[m]);
delay
(2);
}
if(num==1)
{
for(m=0;m<15;m++)
write_data(tab_index2[m]);
delay
(2);
}
if(num==2)
{
for(m=0;m<15;m++)
write_data(tab_index3[m]);
delay
(2);
}
if(num==3)
{
for(m=0;m<15;m++)
write_data(tab_index4[m]);
delay
(2);
}
}
//*********LCD初始化函数开始****
voidlcd_init()
{
lcdrw=0;
lcden=0;
write_com(0x38);//设置显示模式:
16X2,5X7,8位数据接口
write_com(0x0c);//开显示,显示光标,光标闪烁
write_com(0x06);//读写一个字符后,地址指针及光标加一,且光标加一整屏显示不移动
write_com(0x80);//设置光标指针
}
//*********写字符串函数开始*****
voidwrite_char()
{
ucharn,a;
for(n=0;n<8;n++)
{
a=tab_time[n];//分别取时分秒十个位数字
write_data(tab_char[a]);//显示对应数字符号
}
}
//*********写命令函数开始*******
voidwrite_com(ucharcom)
{
lcdrs=0;//低电平写命令
P0=com;//写入命令
delay(3);//延时约3ms
lcden=1;//LCD使能端置高电平
delay(5);//延时约5ms
lcden=0;//LCD使能端拉低电平
}
//*********写数据函数开始*******
voidwrite_data(uchardat)
{
lcdrs=1;//低电平写数据
P0=dat;//写入命令
delay(3);//延时约3ms
lcden=1;//LCD使能端置高电平
delay(5);//延时约5ms
lcden=0;//LCD使能端拉低电平
}
//*********延时函数开始*********
voiddelay(uintk)
{
uinti,j;
for(i=k;i>0;i--)
for(j=110;j>0;j--);
}
7、实验中遇到的问题:
在实验过程中,我们遇到了许多问题,也通过自己的努力解决了许多问题。
刚开始实验的时候,我们拿到材料却感到无从下手。
然后我们一步步分析,通过使用Protues仿真软件,我们初步将实验原理图完成。
接下来,我们借助互联网的搜索能力,查询我们需要的程序,将他人的模版程序读懂之后,自己动手修改成与我们的实验板相连的程序。
修改程序过程中主要遇到了两个问题,第一个是在连接LCD1602的过程中,由于对引脚功能及连接线路不明白,将VEE始终空接(而实际却要将VEE与VSS同时接地),造成了LCD不能正常显示,起初一直以为是程序的问题,可是换了N多程序之后才发现是接线的问题,为了调整LCD显示,浪费了一下午的时间。
第二个是在加入按键后,调试按键程序的过程中。
我们的设想是通过K1控制LCD显示字符。
开始时,程序无论怎样调试,总会显示成乱码……后来偶然的一次去掉键盘扫描函数,再按按键才发现,也会显示成乱码。
顿时感觉到是连线的问题,原来,最小系统版的K1是P1^4接口,而我却将LCD的RS接到了P1^4口,造成显示错误。
除了这两个困扰很长时间的问题,其他的小问题我们通过讨论都一一解决了。
八、实验感悟
科学技术在不断进步,机械时钟早已被淘汰,取而代之的是更高精度、使用寿命更长、更加直观的且无机械的小巧时钟。
现如今,我们早已不在只是需要时钟看时间这么间单的功能,因为这已经无法适应当今社会的快节奏生活。
现在,我们需要用一个小小的时钟实现多个功能,比如:
日历、时间、秒表、闹钟等。
那么就要我们去不断地改进时钟,使他更加人性化、更能提高生活质量、更受人们喜爱、功能更加强大。
机械钟的时代早已过去,电子钟的时代也早已到来,作为新时代的我们应该更加提高自身能力,适应时代的发展。
随着单片机技术的飞速发展,在其推动下,现代的电子产品几乎渗透到了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高。
时间对于人们来说总是那么的宝贵,可以说时间和金钱是划上了等号。
准确的掌握时间和分配时间对人们来说至关重要。
因此时钟就显得尤为重要。
利用单片机制作的电子时钟更具有编程灵活、便于电子功能的扩充、精确度高、便于携带、显示直观等特点使得此类电子时钟更加的受到人们的喜爱。
为此我和同伴亲身去体验了一下制作时钟乐趣。
知识来源于实践,通过这次的时钟制作,我们进一步加深了对单片机的认识,并且熟悉了单片机系统的设计流程,收获颇丰。
本次实践基本达到了预定的实践要求,制作的时钟也达到了预期的目标。
在实验时在自己动手实践之余我们也不得不感叹科技的力量是巨大的,只是一些小小的芯片以及器件组合在一起就可以完成以前需要很大空间的机械时钟所有的功能。
知识是重要的,特别是知识联系实践,把我们所学到的理论知识应用到实际生活当中去是对我们掌握的知识的最大尊重。
要学会用知识改变一切。
九、参考文献
张齐编著《单片机原理及应用系统设计》
高卫东编著《51单片机原理与实践》
张齐、朱宁西编著《单片机应用系统设计技术》
附录一:
自制简易时钟功能及使用说明
一、功能:
LCD双行显示:
上面一行显示二十四小时制时间,下面一行通过K1按键控制字符显示,每按一次换一个语句(共4条预设语句)并循环显示。
K2按键控制:
数码管显示0---4,初始时LED2亮,且两个白色发光二极管交替闪烁,K2每按一次两个LED灯及两个白色发光二极管交替闪烁,当数码管显示4时,蜂鸣器响,两个彩色发光二极管亮起(起报警功能)。
二、使用说明:
1.按照原理图连接实物电路;
2.检查电路是否连接正确,若连接无误,则执行下一步;
3.将已编好的程序导入芯片中;
4.按下小板的电源开关,打开电源为线路供电(工作电压5v);
5.观察灯、LCD是否正常工作,若不是正常工作,先检查电路是否接触不良或是其他毛病。
排除硬件问题后检查程序是否有错,有错就调整。
直至自制的简易时钟正常显示初始时的工作状态;
6.LCD上行显示24小时制时间,下行显示一行英文语句,按下K1键时,每按一次就可在LCD下行看到不同的英文语句,当第四次按下K1时,由于超出了预设的语句个数,所以第四次按下K1后在LCD下行看到的语句是初始时看到的语句,时间显示不受影响;
7.初始时LED灯为灭的状态,两个白色发光二极管交替闪烁,数码管显示0,每按一次K2,数码管显示增一,LED及白色发光二极管闪烁频率增加,当K2按下第五次时,数码管显示4,蜂鸣器响起,两个彩色发光二极管亮(起到报警功能(当时钟某一状态超出预设状态临界值时的报警));
8.观察工作过程中的工作状态是否正常,若不正常,先检查线路接触是否良好,在检查程序是否无误。
排除这些问题后若还是不能正常工作,那么可能是元器件或芯片有损坏,更换坏的部分;
9.自制时钟所有工作状态显示结束后,先将小板上的电源开关关闭后,再将电源总开关断开;
10.收拾存放自制时钟。
附录二:
1602引脚功能说明:
第1脚:
VSS为地电源。
第2脚:
VDD接5V正电源。
第3脚:
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光源正极。
第16脚:
背光源负极。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)