单片机电子时钟实验报告.docx

上传人:b****2 文档编号:11516394 上传时间:2023-06-01 格式:DOCX 页数:20 大小:19.59KB
下载 相关 举报
单片机电子时钟实验报告.docx_第1页
第1页 / 共20页
单片机电子时钟实验报告.docx_第2页
第2页 / 共20页
单片机电子时钟实验报告.docx_第3页
第3页 / 共20页
单片机电子时钟实验报告.docx_第4页
第4页 / 共20页
单片机电子时钟实验报告.docx_第5页
第5页 / 共20页
单片机电子时钟实验报告.docx_第6页
第6页 / 共20页
单片机电子时钟实验报告.docx_第7页
第7页 / 共20页
单片机电子时钟实验报告.docx_第8页
第8页 / 共20页
单片机电子时钟实验报告.docx_第9页
第9页 / 共20页
单片机电子时钟实验报告.docx_第10页
第10页 / 共20页
单片机电子时钟实验报告.docx_第11页
第11页 / 共20页
单片机电子时钟实验报告.docx_第12页
第12页 / 共20页
单片机电子时钟实验报告.docx_第13页
第13页 / 共20页
单片机电子时钟实验报告.docx_第14页
第14页 / 共20页
单片机电子时钟实验报告.docx_第15页
第15页 / 共20页
单片机电子时钟实验报告.docx_第16页
第16页 / 共20页
单片机电子时钟实验报告.docx_第17页
第17页 / 共20页
单片机电子时钟实验报告.docx_第18页
第18页 / 共20页
单片机电子时钟实验报告.docx_第19页
第19页 / 共20页
单片机电子时钟实验报告.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

单片机电子时钟实验报告.docx

《单片机电子时钟实验报告.docx》由会员分享,可在线阅读,更多相关《单片机电子时钟实验报告.docx(20页珍藏版)》请在冰点文库上搜索。

单片机电子时钟实验报告.docx

单片机电子时钟实验报告

一、实验任务及要求

在焊接的电路板中,4个LED数码管,设计带有闹铃功能的数字时钟,要求:

1、在4位数码管上显示当前时间。

显示格式“时时分分”;

2、由LED闪动做秒显示;

3、利用按键可对时间及闹玲进行设置,并可显示闹玲时间。

当闹玲时间到蜂鸣器发出声响,按停止键使可使闹玲声停止。

二、方案论证与比较

2.1数字时钟方案

数字时钟是本设计的最主要的部分。

根据需要,可利用两种方案实现。

方案一:

本方案采用Dallas公司的专用时钟芯片DS12887A。

该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。

为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。

当电网电压不足或突然掉电时,系统自动转换到内部锂电池供电系统。

而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。

方案二:

本方案完全用软件实现数字时钟。

原理为:

在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。

利用定时器与软件结合实现5毫秒定时中断,每产生一次中断,存储器内相应的计数值加1;若计数值达到200,则将其清零,并将

方案一:

静态显示。

所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。

该方式每一位都需要一个8位输出口控制。

静态显示时较小的电流能获得较高的亮度,且字符不闪烁。

但当所显示的位数较多时,静态显示所需的I/O口太多,造成了资源的浪费。

方案二:

动态显示。

所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。

利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度合适,字符才不闪烁。

显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。

调整参数可以实现较高稳定度的显示。

动态显示节省了I/O口,降低了能耗。

从节省I/O口和降低能耗出发,本设计采用方案二。

三、各个部分的分析

1)显示电路:

通过4个LED显示屏显示分钟和小时

两个两联的LED显示器,通过与单片机P1接口连接实现显示功能。

而实现4个LED灯动态显示,靠的是位选电路

2)位选电路

四位共阳LED数码管,其标号分别为HourH,HourL,MinL,MinH,低电平选通,且任何时候仅有一位输出低电平,显示时对各显示器进行动态扫描,显示器分时轮流工作。

虽然每次只有一个显示器显示,但是由于人的视觉暂留现象我们仍会感觉所有的显示器都在同时显示。

P0口作为输出口控制8个发光二极管的亮灭,控制数码管的显示。

因此,可以实现4个LED在我们看来同时亮,显示时间。

3)闹铃部分:

使用蜂鸣器实现闹钟功能

其中,buzzer端口接到单片机的P1.7输出。

(端口连接在最后介绍)

4)开关部分:

使用了5个开关控制整个电路的启动,修改时间,设置闹钟,关闭电路等功能

为查询方式典型电路。

其中Setbutton为复位开关,swtich为转换模式开关,即工作模式和调时间模式,Increase为调时间模式中控制时间变化的按钮,STRAT和STOP分别为开启和结束按钮,这5个开关分别接到P2.0-P2.5端口,以控制其输入。

5)串转并电路

为了进一步节省I/O口,有添加了一个额外的串转并电路

由以上电路,我们将P1.0-P1.2扩展到7个I/O口,我们采用的是74HC595芯片,管脚图如下:

7)复位电路

整体电路图如下:

四、软件设计

由于汇编语言繁琐,我们采用的是C语言编程,源程序及注释如下:

#include

#include

//时分

#defineTYPEunsignedchar

#defineHOUR0

#defineMIN1

//显示状态

#defineNORMAL0

#defineBELLTIME1

#defineSETTING_N2

#defineSETTING_C3

//闪烁显示

#defineNoMask0

#defineMaskHour1

#defineMaskMin2

#defineMaskAll3

#defineucharunsignedchar

#defineuintunsignedint

//BitDefinition

//数码管

sbitHourH=P1^3;//低电平,数码管使能

sbitHourL=P1^4;

sbitMinH=P1^5;

sbitMinL=P1^6;

//蜂鸣器

sbitBuzzer=P1^7;//低电平,蜂鸣器响

//键盘

sbitSetButton=P2^0;//按键定义,设置(正常,定时显示切换)键,时位分位转换键,增加键

sbitSwitch=P2^1;

sbitIncrease=P2^2;

sbitStart=P2^3;

sbitStop=P2^4;

//LED

sbitSecLed=P2^5;//秒显示,低电平点亮

sbitClockStartLED=P2^6;//闹钟定闹开始

//74HC595输入管脚定义

sbitSH_CP=P1^0;

sbitDS=P1^1;

sbitST_CP=P1^2;

//FunctionDefinition

voiddelay5ms(void);

voidClock();

voidDisplay();

voidSet();

voidRing();

voidStopRing();

voidShowANum(uchari);

voidStartRing();

voiddelaykey(void);

voidMaskShow(ucharNum,TYPEt);

//VariableDefinition

//正常时间

ucharhour=8;

ucharmin=0;

ucharsec=0;

uintcount=0;

//闹钟定时

ucharmp=1;

ucharst=0;

ucharcHour=8;

ucharcMin=0;

//模式标示

uchardisplayMode=NORMAL;

ucharcurrentSelect=HOUR;

//数码管数字显示编码

ucharH1;

ucharH2;

ucharM1;

ucharM2;

uchartemp;

ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};

//闪烁显示

ucharMaskType=NoMask;

uintblinkcount=0;

//音乐

ucharp=0;

uchartemp=0;

ucharjiepai=0;

ucharyindiao=0;

ucharPai1_4=20;

ucharjpLength=0;

//音调数组

unsignedcharcodemusic[]=

{0xFF,0xFF,0xF8,0x89,0xf9,0x59,0xfa,0x13,0xfa,0x68,0xfb,0x04,0xfb,0x90,0xfc,0x0c,

0xfc,0x44,0xfc,0xad,0xfd,0x0a,0xfd,0x34,0xfd,0X82,0xfd,0xc8,0xfe,0x06,

0xfe,0x22,0xfe,0x56,0xfe,0x85,0xfe,0x9a,0xfe,0xc1,0xfe,0xe4,0xff,0x03,

0xff,0x11

};

//音乐编码

unsignedcharcodeMmusic[]=

{

////音阶测试

//1,4,2,4,3,4,4,4,5,4,6,4,7,4,8,4,

//9,4,10,4,11,4,12,4,13,4,14,4,15,4,

//16,4,17,4,18,4,19,4,20,4,21,4,22,4,

//两只老虎

1,4,2,4,3,4,1,8,1,4,2,4,3,4,1,8,3,2,4,8,5,5,3,2,4,8,5,5,

5,5,6,2,5,5,4,4,3,4,1,8,5,5,6,2,5,5,4,4,3,4,1,8,3,4,1,4,2,8,3,4,1,4,2,8

0xff,0x00//结束标记

};

voidmain()

{

//设置T0,T1

TMOD=0x11;

TH0=0x0EC;

TL0=0x78;

TH1=0x0F0;

TL1=0x60;

ET0=1;

ET1=1;

EA=1;

TR0=1;

//设置定时器的优先级

PT0=1;//5ms标准时钟设为高优先级,保证计时的准确性

PT1=0;

//顺序执行(主循环)

while

(1)

{

//设置何时开启T1定时器

if(displayMode!

=NORMAL||mp==0)

TR1=1;

else

{

TR1=0;

MaskType=NoMask;

}

//方法并行

Display();

Display();

Set();

StartRing();

Ring();

StopRing();

}

}

voidClock()interrupt1

{

TH0=0x0EC;

TL0=0x78;

count++;

if(mp==0)

{

//控制音乐节拍

if(jpLength--<=0)

{

jiepai=Mmusic[2*p+1];

jpLength=Pai1_4*jiepai;//控制每个音调持续多少个1/4节拍

p++;

if(Mmusic[2*p+1]==0x00)

p=0;//重放

//控制屏幕随乐曲闪烁

if(MaskType==NoMask)

MaskType=MaskAll;

else

MaskType=NoMask;

}

}

if(count%100==0)//控制秒灯闪烁,每秒闪一次

{

SecLed=~SecLed;

}

}

voidMaskClock()interrupt3

{

if(mp==0)//生成音调频率方波

{

yindiao=Mmusic[2*p];

TH1=music[2*yindiao];

TL1=music[2*yindiao+1];

Buzzer=~Buzzer;

}

else//响铃时,屏蔽闪烁显示的功能

{

if(displayMode==BELLTIME||displayMode==SETTING_C)

{

TH1=0x0F0;

TL1=0x60;

}

else

{

TH1=0x0F8;

TL1=0x30;

}

blinkcount++;

if(blinkcount>=100)

{

blinkcount=0;

if(displayMode==BELLTIME)

{

if(MaskType==NoMask)

MaskType=MaskAll;

else

MaskType=NoMask;

}

elseif(displayMode==SETTING_C||displayMode==SETTING_N)

{

if(currentSelect==HOUR)

{

if(MaskType==NoMask)

MaskType=MaskHour;

else

MaskType=NoMask;

}

if(currentSelect==MIN)

{

if(MaskType==NoMask)

MaskType=MaskMin;

else

MaskType=NoMask;

}

}

}

}

}

voidStartRing()

{

if(Start==0)

{

ClockStartLED=0;

st=1;

Start=1;

}

}

voidRing()

{

if(st==1&&cHour==hour&&cMin==min)

{

//Buzzer=0;

mp=0;

}

}

voidStopRing()

{

if(Stop==0)

{

Buzzer=1;

mp=1;

p=0;

ClockStartLED=1;

st=0;

MaskType=NoMask;

}

}

voidDisplay()

{

//分析COUNT,合成HOUR,MIN

if(count>=200)

{

count=count-200;

sec++;

if(sec==60)

{

sec=0;

min++;

if(min==60)

{

min=0;

hour++;

if(hour==25)

{

hour=0;

}

}

}

}

//显示时间

if(displayMode==NORMAL||displayMode==SETTING_N)

{

HourH=1;

HourL=1;

MinH=1;

MinL=1;

H1=hour/10;

H2=hour%10;

M1=min/10;

M2=min%10;

MaskShow(H1,HOUR);

HourH=0;

delay5ms();

HourH=1;

MaskShow(H2,HOUR);

HourL=0;

delay5ms();

HourL=1;

MaskShow(M1,MIN);

MinH=0;

delay5ms();

MinH=1;

MaskShow(M2,MIN);

MinL=0;

delay5ms();

MinL=1;

}

if(displayMode==BELLTIME||displayMode==SETTING_C)

{

H1=cHour/10;

H2=cHour%10;

M1=cMin/10;

M2=cMin%10;

MaskShow(H1,HOUR);

HourH=0;

delay5ms();

HourH=1;

MaskShow(H2,HOUR);

HourL=0;

delay5ms();

HourL=1;

MaskShow(M1,MIN);

MinH=0;

delay5ms();

MinH=1;

MaskShow(M2,MIN);

MinL=0;

delay5ms();

MinL=1;

}

}

voidMaskShow(ucharNum,TYPEt)

{

if(MaskType==MaskHour)

{

if(t==HOUR)

ShowANum(10);

else

ShowANum(Num);

}

elseif(MaskType==MaskMin)

{

if(t==MIN)

ShowANum(10);

else

ShowANum(Num);

}

elseif(MaskType==MaskAll)

{

ShowANum(10);

}

else

ShowANum(Num);

}

voidShowANum(ucharNum)

{

uchari;

temp=DSY_CODE[Num];

//串行输入74HC595

for(i=0;i<8;i++)

{

temp<<=1;

DS=CY;

SH_CP=1;

_nop_();

nop_();

SH_CP=0;

}

//传送至存储寄存器,出现在输出端

ST_CP=0;

_nop_();

ST_CP=1;

_nop_();

ST_CP=0;

}

voidSet()

{

//响铃时,显示模式锁定在正常,停闹后解除

if(mp==0)

{

displayMode=NORMAL;

}

//显示转换键作用(注:

响铃时,屏蔽显示转换)

if(mp!

=0&&SetButton==0)

{

delaykey();

if(SetButton==0)

{

displayMode++;

if(displayMode>=4)

displayMode=0;

}

}

//设置模式下,时分转换键作用

if(Switch==0&&(displayMode==SETTING_C||displayMode==SETTING_N))

{

delaykey();

if(Switch==0)

currentSelect=!

currentSelect;

}

//设置模式下,数值增加键作用

if(Increase==0&&displayMode==SETTING_C)

{

delaykey();

if(Increase==0)

{

if(currentSelect==HOUR)

{

cHour++;

if(cHour>=25)

cHour=0;

}

else

{

cMin++;

if(cMin>=60)

cMin=0;

}

}

}

if(Increase==0&&displayMode==SETTING_N)

{

delaykey();

if(Increase==0)

{

if(currentSelect==HOUR)

{

hour++;

if(hour>=25)

hour=0;

}

else

{

min++;

if(min>=60)

min=0;

}

}

}

}

voiddelay5ms(void)//精确延时5毫秒

{

unsignedchara,b;

for(b=19;b>0;b--)

for(a=130;a>0;a--);

}

voiddelaykey(void)//按键去抖延时

{

unsignedchara,b;

for(b=173;b>0;b--)

for(a=143;a>0;a--);

}

五、总结

本次实验,我主要负责分配任务和部分程序的编写。

在这次实验中,特别是在编程方面和电路设计方面,为了做这个电子时钟,我们组把单片机的书读了许多遍,包括单片机结构原理、指令、定时器、中断、子程序调用、LED显示等等,同时也自学了许多知识,包括如何用C语言来编写单片机程序,当然在编程和调试过程中遇到了许多困难。

整个实验下来,得到许多课堂上体验不到的知识和快乐,扩展了思路,提高了能力,可以说,经过这次实验,我们对单片机才算真正有了一个深刻的认识。

以下便是我们组所焊接的单片机,作为成果展示。

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

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2