单片机课程设计报告1
《单片机课程设计报告1》由会员分享,可在线阅读,更多相关《单片机课程设计报告1(12页珍藏版)》请在装配图网上搜索。
1、1 引言 在对单片机进行理论的学习之后,为了能更深一层对其学习,通过对一个综合题目的设计与调试了解单片机在各种制作中和中小规模集成电路的作用及实用方。 进一步学习与掌握各种组合逻辑电路与时序电路的原理与使用方法。熟悉集成电路及有关元器件的使用,熟悉面包板的使用。熟悉51单片机的结构,掌握keil 、proteus软件的使用方法及仿真电路的设计。 2 设计方案及原理 2.1 数字钟的设计方案 控制部分用单片机STC89C52最小模块进行控制,输入模块用四个微动开关实现对数字钟时间的设置和日期、时间之间的转换,输出显示模块一个八位用的七段共阴数码管。 数字钟电路主要由显示器“时
2、”,“分”,“秒”,“年”,“月”,“日”和单片机,还有校时电路组成。8个数码管的段选接到单片机的P0口,位选接到单片机的P3口。 控制模块的四个微动开关接在P1口上。 软件部分由一个主函数和若干个子函数组成,子函数主要有定时子函数、显示子函数、设置子函数三部分,通过主函数对几个子函数的调用实现对数字钟显示、设置的控制。 2.2 数字钟的原理 数码管按照数码管动态显示的工作原理工作,将标准秒信号送入“秒单元”,“秒单元”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分单元”的时钟脉冲。“分单元”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号
3、将被送到“时单元”。“时单元”采用24进制计时器,可实现对一天24小时的累计。然后累加24小时日加1,日加满一个月月加1,月加满12个月年加1。 显示电路将“时”、“分”、“秒”,“年”,“月”,“日”通过七段显示器显示出来。校时电路时用来对“时”、“分”、“秒”,“年”,“月”,“日”显示数字进行校对调整,按一下S_SET键,秒单元就加1 ,按一下M_SET键,分就加1,按一下H_SET键,时就加1。通过模式转换键用上述方法进行设置,也可通过此键在日期,时间循环转换。 3硬件设计 3.1数字钟硬件电路原理图 根据要求,设计一个时钟。能够显示时间格式为 时.分.秒,并且设置键盘,根据按
4、键任意调整时间。利用8051内部定时器0与软件结合来实现1秒定时中断。四个开关方便的对秒、分、时分别调整,保证功能完善,工作可靠,定时采用片内定时器定时,提高了电子时钟的准确度。根据题目要求设计的总体框。如图1所示。 图1 数字钟硬件电路图 3.2Proteus仿真图 根据硬件原理电路,在Keil中生成.hex的可执行文件,Proteus中画图的仿真结果,如图2所示。 图2 Proteus仿真结果 4软件设计 数字钟软件设计流程图如图2所示。 图2 流程图 5总结 本次设计的单片机电子钟系统中,其误差主要来源包括晶体频率误差,定时器溢出误差,
5、延迟误差。晶体频率产生震荡,容易产生走时误差;定时器溢出的时间误差,造成走时误差;延迟时间过长或过短,都会造成与基准时间产生偏差,造成走时误差。 软件程序的调试分模块调试,统调是最后一环。软件调试可以采取离线调试和在线调试两种方式。前者不需要硬件仿真器,可借助于软件仿真器即可;后者一般需要仿真系统的支持。本次课题,Keil软件来调试程序,通过各个模块程序的单步或跟踪调试,使程序逐渐趋于正确,最后统调程序。 仿真部分采用protus 7 professional软件,此软件功能强大且操作较为简单,可以很容易的实现各种系统的仿真。刚开始在此软件上进行仿真的时候显示乱码,不能够正常的显示,经过分
6、析是由于显示函数中出现了逻辑错误,经过几次修正调试成功后再进行仿真,结果显示正常。
6参考文献
[1]李华,王思明等.单片机原理及应用[M].兰州大学出版社,2001.5
[2]马忠梅等.单片机C语言应用程序设计[M]. 北京航空航天大学出版社,2003.7
[3]皮大能,南光群等.单片机课程设计指导书[M]. 北京理工大学出版社,2010.7
[4]周润景,丁莉等.单片机电路设计、分析与制作[M]. 机械工业出版社,2010.8
附录
#include
7、ar #define uint unsigned int sbit S_SET=P1^0; sbit M_SET=P1^1; sbit H_SET=P1^2; sbit RESET_SET=P1^3; sbit beep=P2^0; sbit d=P0^7; uint year=2012; uchar SECOND,MINITE,HOUR,TCNT,RESET,SECOND0,MINITE0,HOUR0,SECOND1,MINITE1,HOUR1,day=6,mon=7,temp=0; uchar code scan[8]={0xfe,0xfd,0xfb,0xf7,0xef
8、,0xdf,0xbf,0x7f}; uchar code table[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x39,0x00}; uchar table1[]={31,31,29,31,30,31,30,31,31,30,31,30,31}; //闰年 uchar table2[]={31,31,28,31,30,31,30,31,31,30,31,30,31}; //非闰年 uchar dispbuf[8]; unsigned char getmonday(unsigned int year,uns
9、igned char mon);
void delay(uint us) //延时子程序
{
int i,j;
for(i=0;i 10、
dispbuf[0]=HOUR/10;
dispbuf[1]=HOUR%10;
for(i=0;i<8;i++)
{
P3=0xff;
value=table[dispbuf[i]];
P0=value;
P3=scan[i];
delay(1);
}
}
void time0() interrupt 1 //定时器中断计时
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TCNT++;
if(TCNT==20)
{
SEC 11、OND++;
TCNT=0;
if(SECOND==60)
{
MINITE++;
SECOND=0;
if(MINITE==60)
{
HOUR++;
MINITE=0;
if(HOUR==24)
{
HOUR=0;
day++;
if(day==(getmonday(year,mon)+1))
{
day=1;
if(++mon==13)
{
mon=1 12、;
year++;
}
}
}
}
}
}
}
unsigned char getmonday(unsigned int year,unsigned char mon) //得到某月的天数
{
unsigned char days;
switch (mon)
{
case 4:
case 6:
case 9:
case 11:days=30;
break;
case 2: if(year%4==0) days=29 13、;
else days=28;
break;
default:days=31;
break;
}
return days;
}
void SJ_SET() //时间设置子程序
{
if(S_SET==0)
{
delay(10);
SECOND++;
if(SECOND==60)
{
SECOND=0;
}
}
while(S_SET==0)SCANDISP();
if(M_SET==0)
{
delay(10);
14、 MINITE++;
if(MINITE==60)
{
MINITE=0;
}
}
while(M_SET==0)SCANDISP();
if(H_SET==0)
{
delay(10);
HOUR++;
if(HOUR==24)
{
HOUR=0;
}
}
while(H_SET==0)SCANDISP();
SCANDISP();
}
void datedisplay() //日期显示子程序
{
uchar i;
dis 15、pbuf[7]=day%10;
dispbuf[6]=day/10;
dispbuf[5]=mon%10;
dispbuf[4]=mon/10;
dispbuf[3]=year%1000%100%10;
dispbuf[2]=(year%1000%100)/10;
dispbuf[1]=(year%1000)/100;
dispbuf[0]=year/1000;
for(i=0;i<8;i++)
{
P3=0xff;
P0=table[dispbuf[i]];
P3=scan[i];
if(i==3||i==5)
16、 d=1;
delay(1);
}
}
void DATE_SET() //日期设置子程序
{
datedisplay();
if(H_SET==0)
{
delay(10);
if(H_SET==0)
year++;
while(H_SET==0)
datedisplay();
}
if(M_SET==0)
{
delay(10);
if(M_SET==0)
mon++;
while(M_SET==0)
datedisplay();
}
if(S_ 17、SET==0)
{
delay(10);
if(S_SET==0)
day++;
while(S_SET==0)
datedisplay();
}
}
void main() //主函数
{
uchar d=10;
beep=1;
SECOND0=MINITE0=HOUR0=0;
SECOND1=MINITE1=HOUR1=0;
HOUR=0;
MINITE=0;
SECOND=1;
TCNT=0;
TMOD=0X01;
TH0=(65536-50000)/256;
T 18、L0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(RESET_SET==0)
{
delay(10);
if(RESET_SET==0)
{
temp++;
while(!RESET_SET);
}
}
if(temp==2)
temp=0;
if(temp==0)
SJ_SET();
if(temp==1)
DATE_SET();
}
}
- 12 - / 12文档可自由编辑打印
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。