单片机电子时钟实验报告Word文档下载推荐.docx
- 文档编号:20915549
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:17
- 大小:19.62KB
单片机电子时钟实验报告Word文档下载推荐.docx
《单片机电子时钟实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单片机电子时钟实验报告Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
通过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语言来编写单片机程序,当然在编程和调试过程中遇到了许多困难。
整个实验下来,得到许多课堂上体验不到的知识和快乐,扩展了思路,提高了能力,可以说,经过这次实验,我们对单片机才算真正有了一个深刻的认识。
以下便是我们组所焊接的单片机,作为成果展示。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 电子 时钟 实验 报告