电子时钟实习报告.docx

上传人:b****7 文档编号:23799888 上传时间:2023-05-20 格式:DOCX 页数:13 大小:48.38KB
下载 相关 举报
电子时钟实习报告.docx_第1页
第1页 / 共13页
电子时钟实习报告.docx_第2页
第2页 / 共13页
电子时钟实习报告.docx_第3页
第3页 / 共13页
电子时钟实习报告.docx_第4页
第4页 / 共13页
电子时钟实习报告.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

电子时钟实习报告.docx

《电子时钟实习报告.docx》由会员分享,可在线阅读,更多相关《电子时钟实习报告.docx(13页珍藏版)》请在冰豆网上搜索。

电子时钟实习报告.docx

电子时钟实习报告

大型作业

 

专业:

班级:

姓名:

学号:

指导老师:

前言

单片计算机即单片微型计算机。

RAM,ROM,CPU构成,定时,计数和多种接口于一体的微控制器。

它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。

而51系列单片机是各单片机中最为典型和最有代表性的一种。

这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。

单片机电子时钟,是利用单片机技术实现计时、时间显示、时间调整、定时调整、闹铃等功能。

完成该项目能够有效的训练大家的单片机应用能力,电子时钟的设计过程中,除了应用单片机前六课题的基础知识外,还使用了外部中断技术、定时器中断技术、键盘查询及动态显示技术,希望大家通过该项目的设计,对单片机应用技术有一个较深的认识。

 

摘要

设计目的:

通过课程设计,熟悉89C51定时器、中断初始化编程方法,定时器应用在时间控制中程序的设计技巧。

使学生巩固和加深对单片机基本知识的理解,学会查寻资料、方案设计、方案比较,以及单元电路设计计算等环节,进一步提高学生综合运用所学知识的能力,提高分析解决实际问题的能力。

锻炼分析、解决电子电路问题的实际本领,通过此综合训练,为以后毕业设计打下一定的基础。

 

设计要求:

(1)上电以后自动进入计时状态,起始于00:

00。

(2)设计调整时间,完成时间设计。

(3)定时时间,驱动闹铃。

(4)采用LED数码管显示,时、分、秒采用数字显示。

 

硬件描述及系统设计构思

1.单片机电子时钟功能

控制器用AT89S51,12M晶振

数码管动态扫描驱动——P2口

数码管段码驱动——P1口

闹铃驱动——P1.0

调整键K1——P3.2(外部中断0,正常、调时、调分、调秒)

定时/正常切换键K2——P3.3

时间参数低位加1键K3——P3.4

时间参数高位加1键K4——P3.5

2.数码管显示工作原理

数码管是一种把多个LED显示段集成在一起的显示设备。

有两种类型,一种是共阳型,一种是共阴型。

共阳型就是把多个LED显示段的阳极接在一起,又称为公共端。

共阴型就是把多个LED显示段的阴极接在一起,即为公共商。

阳极即为二极管的正极,又称为正极,阴极即为二极管的负极,又称为负极。

通常的数码管又分为8段,即8个LED显示段,这是为工程应用方便设计的,分别为A、B、C、D、E、F、G、DP,其中DP是小数点位段。

而多位数码管,除某一位的公共端会连接在一起,不同位的数码管的相同端也会连接在一起。

即所有的A段都会连在一起,其它的段也是如此,这是实际最常用的用法。

数码管显示方法可分为静态显示和动态显示两种。

静态显示就是数码管的8段输入及其公共端电平一直有效。

动态显示的原理是,各个数码管的相同段连接在一起,共同占用8位段引管线;每位数码管的阳极连在一起组成公共端。

利用人眼的视觉暂留性,依次给出各个数码管公共端加有效信号,在此同时给出该数码管加有效的数据信号,当全段扫描速度大于视觉暂留速度时,显示就会清晰显示出来。

 

单片机电子时钟

1.电路原理图

2.元件列表

单片机AT89S51

一片

1M晶振

1个

共阳数码管

6只

PNP管8550

7只

74LS244

1片

蜂鸣器

1个

微动按键

1只

10UF电容

5个

2.7K电阻

7只

104瓷片电容

4只

30P瓷片电容

2只

200Ω电阻

4只

560Ω电阻

8只

10K电阻

12只

100Ω电阻

1只

电子时钟程序

#include

#include

ucharH=0,M=0,S=0,T_Count=0;//设置时间初值,进行时间计数

ucharH_Set=11,M_Set=11,S_Set=11;//设定闹铃时间

uchar*Sp=&S,*Mp=&M,*Hp=&H;//时间指针

ucharSelect2Seg=0;//调时闪烁位号

ucharSelect2Seg_=0;//定时闪烁位号

uchar*Select2SegP;//闪烁位号指针

ucharH_h=0,H_l=0,M_h=0,M_l=0,S_h=0,S_l=0;//时分秒的各位的数值--用于显示

ucharSaveH_h=0,SaveH_l=0,SaveM_h=0,SaveM_l=0,SaveS_h=0,SaveS_l=0;//时分秒的各位的数值--用于调时间时的数据保护

ucharlight=0;//灯亮

bitKey3Down=1;//允许KEY3按键值增加1的标志(个位加一)

bitKey4Down=1;//允许KEY4按键值增加1的标志(十位加一)

bitSetTime=0;//定时标志1为定时24

/*蜂鸣器报警*/

voidSPK(void)

{

if(SetTime==0)spk=0;//闹铃响

}

voidTunOffSPK(void)

{

spk=1;//闹铃不响

}

voidinit_INT0(void)/*外部中断0初始化*/

{

EA=1;//打开中断总允许位

EX0=1;//打开外部中断0允许位

PX0=0;//设定外部外部中断0为低优先级中断

IT0=1;//设置外部中断0为边沿(下降沿)触发方式

}

voidinit_t0()/*t0--初始化为50mS定时,并启动*/

{

TMOD=(TMOD&0xF0)|0x01;//定时器0,方式1:

16位定时。

TH0=0x3C;//设置定时器T0初值

TL0=0xB0;

EA=1;//打开中断总允许位

ET0=1;//允许T0中断

PT0=1;//设定定时器T0为高优先级中断

TR0=1;//启动T0

}

voidinit_INT1(void)/*外部中断1初始化*/

{

EA=1;//打开中断总允许位

EX1=1;//打开外部中断1允许位

PX1=0;//设定外部外部中断1为低优先级中断

IT1=1;//设置外部中断1为边沿(下降沿)触发方式

}

/*t1--初始化为50mS定时,并启动*/

voidinit_t1(void)

{

TMOD=(TMOD&0x0F)|0x10;//定时器1,方式1:

16位定时

TH1=0x3C;//设置定时器T1初值

TL1=0xB0;

EA=1;//打开中断总允许位

ET1=1;//允许T1中断

PT1=0;//设定定时器T1为高优先级中断

TR1=1;//启动T1

}

/*外部中断0子程序*/

voidInt0(void)interrupt0using2

{if(SetTime)//判断定时标志是否为0

Select2SegP=&Select2Seg_;//此时为定时闪烁

elseSelect2SegP=&Select2Seg;//否则此时是调时闪烁if(++(*Select2SegP)==4)*Select2SegP=0;//

当闪烁的位数为4时则停止闪烁即闪烁的位数为0

TunOffSPK();//蜂鸣器不响

}

/*T0定时1S中断子程序1*/

voidTimer0()interrupt1using1

{

TH0=0x3C;//设置定时器T0初值

TL0=0xB0;

if((T_Count++)==20)//判断循环是否到达20

{S++;//秒位开始加1

T_Count=0;//把循环置零重新开始循环spk=~spk;

if(S==60){M++;S=0;}//如果秒位到达60,则分钟位加1,秒位置0

if(M==60){H++;M=0;}//如果分钟位为60,则时位开始加1,分钟位置零

if(H==24){H=0;}//如果时位达到24,时位置零

if((H==H_Set)&&(M==M_Set)&&(S==S_Set))//判断定时时间是否到达

SPK();//执行此子程序即蜂鸣器响起

}}

voidInt1(void)interrupt2/*外部中断1子程序*/

{

SetTime=~SetTime;//此时不再定时

*Select2SegP=0;//此时闪烁的位数置为0

TunOffSPK();//执行子程序蜂鸣器停止鸣笛

}

voidTimer1()interrupt3using3/*T1定时50mS中断子程序1*/

{

TH1=0x3C;//给定时器T1的高8位赋初值*/

TL1=0xB0;//给定时器T1的低8位赋初值*/

if(light++>8)//数码管从0亮到8light=0;//对其置零

}

ucharcodeDIY_data[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xFF};//数码管数据定义//"0-9","-",不亮5

ucharcodeWX_data[]={0xfe,0xFd,0xfb,0xf7,0xef,0xdf};//自左到右分别是面

/*数码管循环显示,N为位序号,D为数据序号

voidDSP_Data(ucharN,ucharD)

{uchari=N,j=D;//定义i,j

seg7_data=DIY_data[N];//把数码管的各个数据赋值给P0口

wx=WX_data[D];//把数码管的选择位赋给P2口

}

voidDLYmS(ucharN)/*软件延时NmS*/

{uchark=125;//把25赋值给K

for(;N>0;N--)

for(;k>0;k--);//利用FOR循环实现延时

}

voidtestKey2(void)

{if(SetTime)//判断是否定时

{Sp=&S_Set;Mp=&M_Set;Hp=&H_Set;//分别把调时位赋值给时分秒

Select2SegP=&Select2Seg_;//此时闪烁位为定时

}

else

{Sp=&S;Mp=&M;Hp=&H;//否则为调时,把时间赋值给时分秒

Select2SegP=&Select2Seg;//此时闪烁位为调时闪烁

}}

voidScan_kl(void)//检测KEY3(调整时间个位键)子程序

{if((kl==0)&&(Key3Down==1))/*如果kl键按下与允许各位加1*/

{Key3Down=0;/*此时不允许各位加1*/

testKey2();/*执行此子程序*/

TunOffSPK();/*执行此程序*/

switch(*Select2SegP)//判断闪烁位

{

case0:

break;//如果输出为0则停止此程序

case1:

SaveS_h=*Sp/10;//保护秒十位

*Sp+=1;//秒位加1

*Sp=SaveS_h*10+*Sp%10;//高位的数乘以10与所调置的数对10求余的和即使所要调制的数

break;

case2:

SaveM_h=*Mp/10;//保护分十位11

*Mp+=1;//分位加1

*Mp=SaveM_h*10+*Mp%10;//高位的数乘以10与所调置的数对10求余的和即使所要调制的数

break;

case3:

SaveH_h=*Hp/10;//保护时十位

*Hp+=1;/*时位加1*/

if(SaveH_h<=1){*Hp=SaveH_h*10+*Hp%10;}/*如果时位的高位小于等于1时高位的数乘以10与所调置的数对10求余的和即使所要调制的数*/

elseif(*Hp%10>3)*Hp=SaveH_h*10;/*如果时对10求余大于3时那么时位就等于高位乘以10*/

break;

default:

break;/*如果皆没有时就跳出此程序*/

}}

if(kl==1)Key3Down=1;/*如果kl等于1时,则允许低为加1*/

}

voidScan_kh(void)/*检测KEY4(调整时间十位键)子程序*/

{

if((kh==0)&&(Key4Down==1))/*如果kh键按下与允许高位加1*/

{Key4Down=0;/*不允许高位加1*/

testKey2();/*执行此程序*/

TunOffSPK();/*执行此程序*/

switch(*Select2SegP)/*判断闪烁指针位*/

{

case0:

break;/*输出为0时停止此程序*/

case1:

SaveS_l=*Sp%10;//保护秒个位

*Sp+=10;/*秒位加10*/

if(*Sp>=60)*Sp=SaveS_l;/*如果秒位大于60时,则把低位的数赋值给秒位*/

break;

case2:

SaveM_l=*Mp%10;//保护分个位2

*Mp+=10;/*分位加10*/

if(*Mp>=60)*Mp=SaveM_l;/*如果分位的数大于60则此时分位数就等于分的低位数值*/

break;

case3:

SaveH_l=*Hp%10;//保护时个位

*Hp+=10;/*时位加10*/

if(SaveH_l>3){if(*Hp/10>1)*Hp=SaveH_l;}/*如果时位数的低位数大于3;如果时位的数除以10商大于1则时位的数就等于时位数的低位*/

elseif(*Hp/10>2)*Hp=SaveH_l;/*如果时位的数除以10商大于2则时的数等于时位数的低位数*/

break;

default:

break;/*否则跳出此程序*/

}

}

if(kh==1)Key4Down=1;/*如果kh键不按下则允许高位调时*/

}

voidDisplay(void)/*显示程序*/

{

testKey2();/*执行此子程序*/

if(*Select2SegP!

=1|light>4)/*如果闪烁位号位不为1或数码管显示数大于4时*/

{

DSP_Data(*Sp%10,0);DLYmS(N1);/*0号数码管显示秒位的个位数即秒数对10求余*/

DSP_Data(*Sp/10,1);DLYmS(N1);/*1号数码管对秒位的十位显示即十位的数等于秒位数对10求商得到然后延时*/

}

if(*Select2SegP!

=2|light>4)/*如果闪烁位号位不为2或数码管显示数大于4时*/

{

DSP_Data(*Mp%10,2);DLYmS(N1);/*2号数码管对分位的个位显示即分位数对10求余然后延时*/

DSP_Data(*Mp/10,3);DLYmS(N1);/*3号数码管对分位的十位显示即分位数对10求商然后延时*/

}

if(*Select2SegP!

=3|light>4)/*如果闪烁位号位不为3或数码管显示数大于4时*/

{

DSP_Data(*Hp%10,4);DLYmS(N1);/*4号数码管对时位的个位显示即时位数对10求余然后延时*/

DSP_Data(*Hp/10,5);DLYmS(N1);/*5号数码管对时位的十位显示即时位数对10求商然后延时*/

Scan_kl();/*执行检测KEY3(调整时间个位键)子程序*/

Scan_kh();/*执行检测KEY4(调整时间十位键)子程序*/

}}

voidmain()/*主函数*/

{//uchari;/*定义i*/

init_t0();/*定时器T0程序*/

init_t1();/*定时器T1程序*/

init_INT0();/*外部中断0程序*/

init_INT1();/*外部中断1程序*/

while

(1)

{

Display();/*执行显示程序*/

}}

实习小结

本次的设计使我从中学到了一些很重要的东西,那就是如何从理论到实践的转化,怎样将我所学到的知识运用到我以后的工作中去。

在大学的课堂的学习只是在给我们灌输专业知识,而我们应把所学的用到我们现实的生活中去,此次的电子时钟设计给我奠定了一个实践基础,我会在以后的学习、生活中磨练自己,使自己适应于以后的竞争,同时在查找资料的过程中我也学到了许多新的知识,在和同学协作过程中增进同学间的友谊,使我对团队精神的积极性和重要性有了更加充分的理解。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 职高对口

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1