单片机电子时钟实验报告Word文档格式.docx

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

单片机电子时钟实验报告Word文档格式.docx

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

单片机电子时钟实验报告Word文档格式.docx

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

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

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

2)位选电路

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

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

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

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

3)闹铃部分:

使用蜂鸣器实现闹钟功能

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

(端口连接在最后介绍)

4)开关部分:

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

为查询方式典型电路。

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

5)串转并电路

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

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

7)复位电路

整体电路图如下:

四、软件设计

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

#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();

Set();

StartRing();

Ring();

StopRing();

}

voidClock()interrupt1

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;

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=0x0F8;

TL1=0x30;

blinkcount++;

if(blinkcount>

=100)

blinkcount=0;

if(displayMode==BELLTIME)

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

if(currentSelect==HOUR)

MaskType=MaskHour;

if(currentSelect==MIN)

MaskType=MaskMin;

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;

ClockStartLED=1;

st=0;

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;

MinH=1;

MaskShow(M2,MIN);

MinL=0;

MinL=1;

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

H1=cHour/10;

H2=cHour%10;

M1=cMin/10;

M2=cMin%10;

HourH=0;

MaskShow(M1,MIN);

MinH=0;

MaskShow(M2,MIN);

voidMaskShow(ucharNum,TYPEt)

if(MaskType==MaskHour)

if(t==HOUR)

ShowANum(10);

ShowANum(Num);

elseif(MaskType==MaskMin)

if(t==MIN)

elseif(MaskType==MaskAll)

ShowANum(10);

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;

ST_CP=1;

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))

if(Switch==0)

currentSelect=!

currentSelect;

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

if(Increase==0&

displayMode==SETTING_C)

if(Increase==0)

cHour++;

if(cHour>

=25)

cHour=0;

cMin++;

if(cMin>

=60)

cMin=0;

displayMode==SETTING_N)

if(hour>

if(min>

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

unsignedchara,b;

for(b=19;

b>

0;

b--)

for(a=130;

a>

a--);

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

for(b=173;

for(a=143;

五、总结

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

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

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

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

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

当前位置:首页 > IT计算机 > 电脑基础知识

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

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