单片机数字钟报告.docx
- 文档编号:14704286
- 上传时间:2023-06-26
- 格式:DOCX
- 页数:34
- 大小:159.53KB
单片机数字钟报告.docx
《单片机数字钟报告.docx》由会员分享,可在线阅读,更多相关《单片机数字钟报告.docx(34页珍藏版)》请在冰点文库上搜索。
单片机数字钟报告
河海大学物联网工程学院(常州)
专业综合实践报告
题目单片机可调数字钟
专业、学号
授课班号
学生姓名
指导教师
完成时间2014.06.10
目录
一、课设题目3
二、课程设计目标3
三、研究方法及手段应用3
四、设计要求3
五、MCS-51单片机系统简介4
六、硬件电路图6
七、软件流程图6
八、程序源代码7
九、课设心得22
一、课设题目
基于单片机的可调数字钟
二、课程设计目标
1、通过对课题设计方案的分析、选择、比较、熟悉单片机用系统开发、研制的过程,软硬件设计的方法、内容及步骤。
2、培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,提高组成系统、编程、调试的动手能力;
3、提高综合及灵活运用所学知识解决工业控制的能力,培养动手能力和实际应用能力。
三、研究方法及手段应用
软件研制方面
1.采用模块化程序结构设计软件,首先将整个软件分成若干功能模块;
2.根据流程图,编写源程序;
3.上机调试各模块程序;
4.与硬件一起联调,最后完成全部调试工作。
硬件研制方面
1.将整个硬件系统划分为若干功能单元电路,绘出整个系统逻辑电路图,注明各交单元电路间接口信号;
2.完成各单元电路设计,包括选择合适的各类元器件和电路板设计(元件布局和走线)。
四、设计要求
51单片机片机设计了一个具有LED显示(或LCD显示)、键盘输入的时钟系统,使其具有时、分、秒的实时显示和调整功能,增加按键设置时间功能,使数字钟具有时、分、秒的调节功能:
1、自动计时,显示24小时制时间,由6位LED显示器显示时、分、秒。
2、起始时间为:
00:
00:
00。
3、自动计时,显示24小时制时间,由6位LED显示器显示时、分、秒。
4、具备校准功能,可以直接由按键设置当前时间。
5、具有整点报时功能,并且LED灯闪烁一段时间。
五、MCS-51单片机系统简介
AT89C51是美国ATMEL公司生产的低电压、高性能CMOS8位单片机,片内含4KB的可反复擦除的只读程序存储器(PEROM)和128B随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和FLASH存储单元,功能强大AT89C51单片机可为您提供许多高性价比的应用场合。
主要性能参数:
①与MCS-51产品指令系统完全兼容
②4K字节可重擦写FLASH闪速存储器
③1000次擦写周期
④全静态操作:
0HZ-24MHZ
⑤三级加密程序存储器
⑥128
8字节内部RAM
⑦32个可编程I/O口线
⑧2个16位定时/计数器
⑨6个中断源
⑩可编程串行UART通道
AT89C51引脚封装图
芯片引脚介绍:
(1)主电源引脚
VCC:
+5V电源
VSS:
地线。
(2)时钟电路引脚
XTAL1和XTAL2:
外接晶体引线端。
当使用芯片内部时钟时,此二引线端用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。
(3)控制信号引脚
RST/VPD:
复位信号。
当输入的复位信号延续两个机器周期以上的高电平时即为有效,用以完成单片机的复位初始化操作;当单片机掉电时,此引脚上可接备用电源,由VPD向片内RAM提供备用电源,一保持片内RAM中的数据不丢失。
ALE/PROG:
地址锁存控制信号。
在系统扩展时,ALE用于控制把P0口输出的低8位地址锁存起来,以实现低位地址和数据的隔离。
此外,由于ALE是以晶振1/6的固定频率输出的正脉冲,因此,可作为外部时钟或外部定时脉冲使用。
对于EPROM型单片机,在EPRAM编程期间,此引脚接收编程脉冲。
PSEN:
片外程序存储器读选通信号输出端。
EA/VPP:
访问程序存储控制信号。
当EA信号为低电平时,对ROM的读操作限定在外部程序存储器;当EA信号为高电平时,对ROM的读操作是从内部程序存储器开始,并可延至外部程序存储器。
对于EPROM型单片机,在EPRAM编程期间,此引脚接上加21VEPROM编程电源VPP。
(4)I/O引脚
P0.0~P0.7:
P0口8位双向口线。
P1.0~P1.7:
P1口8位双向口线。
P2.0~P2.7:
P2口8位双向口线。
P3.0~P3.7:
P3口8位双向口线。
对于各种型号的芯片,其引脚的第一功能信号是相同的,所不同的只在引脚的第二功能信号。
对于9、30和31三个引脚,由于第一功能信号与第二功能信号是单片机在不同工作方式下的信号,因此不会发生使用上的矛盾。
但是P3口的情况却有所不同,它的第二功能信号都是单片机的重要控制信号。
因此,在实际使用时,都是先按需要选用第二功能信号,剩下的才以第一功能的身份作数据位的输入/输出使用。
六、硬件电路图
七、软件流程图
八、程序源代码
#include
#defineuintunsignedint
#defineucharunsignedchar
/***************定义数码管*****************/
#defineSMG_XSP0//数码管数据段显示
#defineSMG_KZP2//数码管控制位显示
#defineSpeakP3_7//定义蜂鸣器接口
#defineLED1P3_4//定义LED1接口(走时提示指示灯)
#defineLED2P3_5//定义LED2接口(闹钟指示灯亮)
#defineLED3P3_6//定义LED3接口(整点报时指示灯)
#defineKey1P1_0//时间调整允许按键
#defineKey2P1_1//时、分加按键
#defineKey3P1_2//时、分减按键
#defineKey4P3_1//闹钟时间调整允许按键
#defineKey5P3_2//开/关闹钟按键
#defineKey6P3_3//开/关整点报时按键
ucharcodeData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF};//没有小数点
//定义数组数码管0123456789-
ucharcodeData1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x3F};//带小数点
//定义数组数码管0123456789-
ucharhour=12,min=0,sec=0;//系统上电默认时间是12.00.00
ucharhour1=6,min1=0,sec1=0;//系统上电默认闹铃是06.00.00
charnum=0;//时间基数num
uintt=100;//数码管动态扫描延时时间基数源数据3
ucharflag=0;//显示标志位(0:
走时正常1:
调整时钟2:
调整分钟)
uinti=0;j=0;//循环变量i,j
bitnao_z=0;//闹钟标志位(0:
关闭闹钟1:
开启闹钟)
ucharflag_nao_z=0;//闹钟显示模式(0:
显示正常走时时间1:
显示闹钟时间2:
调整闹钟时钟3:
调整闹钟分钟)
bitbao_shi=0;//整点报时标志位(0:
不允许整点报时1:
允许整点报时)
voiddelay(uinttime)//扫描延时函数
{
uintx,y;
for(x=time;x>0;x--)
for(y=110;y>0;y--);
}
voiddelay_fmq(uinttime)//延时函数(蜂鸣器)
{
uintx,y;
for(x=time;x>0;x--)
for(y=5;y>0;y--);
}
voidfmq()//蜂鸣器函数(按键提示)
{
for(i=0;i<100;i++)
{
Speak=0;
delay_fmq(10);
}
Speak=1;
}
voidTime0_init()//定时器0初始化函数
{
TMOD=0x01;//定时器0为方式1
TL0=(65536-50000)%256;
TH0=(65536-50000)/256;//12M晶振定时时间50ms
ET0=1;//开定时器0中断
EA=1;//开总中断
TR0=0;//先不启动定时器0
}
voidTime0()interrupt1//定时器0中断服务函数
{
TH0=(65536-50000)/256;//重新载装初值,设置50ms中断一次
TL0=(65536-50000)%256;
num++;//时间基数加1
while(num==20)//1秒时间到
{
num=0;//num清0
sec++;//秒加1
if(flag_nao_z!
=0)//闹钟显示模式不等于0(不显示正常走时时间,即显示闹钟时间)
{
LED1=~LED1;//指示灯按照2Hz频率闪烁(在调整闹钟时间时,提示正在走时)
}
else//否则闹钟显示模式等于0(显示正常走时时间)
{
LED1=1;//在正常走时的时候,指示灯不亮
}
if(nao_z==1)//当闹钟标示位为1:
开启闹钟
{
LED2=0;//闹钟指示灯亮
if(hour==hour1&min==min1)//当时,分和闹钟时,分相同
{
Speak=~Speak;//蜂鸣器接口取反(2Hz频率响)
}
else//否则时,分和闹钟时,分不相同
{
Speak=1;//关闭蜂鸣器
}
}
else//否则关闭闹钟
{
LED2=1;//闹钟指示灯不亮
}
}
while(sec==60)//1分时间到
{
sec=0;//秒清0
min++;//分加1
}
while(min==60)//1小时时间到
{
min=0;//分清0
hour++;//时加1
}
while(hour==24)//24小时到
{
hour=0;//时清0
}
}
voiddisp(hour,min,sec)//数码管正常显示模式
{
SMG_XS=Data[hour/10];//小时十位
SMG_KZ=0xdf;//控制第1个数码管亮
delay(t);//延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[hour%10];//小时个位
SMG_KZ=0xef;//控制第2个数码管亮
delay(t);//延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[min/10];//分十位
SMG_KZ=0xf7;//控制第3个数码管亮
delay(t);//延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[min%10];//分个位
SMG_KZ=0xfb;//控制第4个数码管亮
delay(t);//延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec/10];//秒十位
SMG_KZ=0xfd;//控制第5个数码管亮
delay(t);//延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec%10];//秒个位
SMG_KZ=0xfe;//控制第6个数码管亮
delay(t);//延时一下(消隐)
SMG_KZ=0xff;
}
voiddisp1(hour,min,sec)//数码管模式1:
调小时模式(时钟在数码管上闪烁)
{
j++;//j加1
while(j==40){j=0;}//j为40时,j清0
if(j<20)//j小于20时,分,秒都显示
{
SMG_XS=Data[hour/10];//小时十位
SMG_KZ=0xdf;//控制第1个数码管亮
delay(t);//延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[hour%10];//小时个位
SMG_KZ=0xef;//控制第2个数码管亮
delay(t);//延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[min/10];//分十位
SMG_KZ=0xf7;//控制第3个数码管亮
delay(t);//延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[min%10];//分个位
SMG_KZ=0xfb;//控制第4个数码管亮
delay(t);//延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec/10];//秒十位
SMG_KZ=0xfd;//控制第5个数码管亮
delay(t);//延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec%10];//秒个位
SMG_KZ=0xfe;//控制第6个数码管亮
delay(t);//延时一下(消隐)
SMG_KZ=0xff;
}
else//否则20 { SMG_XS=Data[hour/10];//小时十位 SMG_KZ=0xff;//控制第1个数码管不亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data1[hour%10];//小时个位 SMG_KZ=0xff;//控制第2个数码管不亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data[min/10];//分十位 SMG_KZ=0xf7;//控制第3个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data1[min%10];//分个位 SMG_KZ=0xfb;//控制第4个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data[sec/10];//秒十位 SMG_KZ=0xfd;//控制第5个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data[sec%10];//秒个位 SMG_KZ=0xfe;//控制第6个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; } } voiddisp2(hour,min,sec)//数码管模式2: 调分钟模式(分钟在数码管上闪烁) { j++;//j加1 while(j==40){j=0;}//j为40时,j清0 if(j<20)//j小于20时,分,秒都显示 { SMG_XS=Data[hour/10];//小时十位 SMG_KZ=0xdf;//控制第1个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data1[hour%10];//小时个位 SMG_KZ=0xef;//控制第2个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data[min/10];//分十位 SMG_KZ=0xf7;//控制第3个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data1[min%10];//分个位 SMG_KZ=0xfb;//控制第4个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data[sec/10];//秒十位 SMG_KZ=0xfd;//控制第5个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data[sec%10];//秒个位 SMG_KZ=0xfe;//控制第6个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; } else//否则20 { SMG_XS=Data[hour/10];//小时十位 SMG_KZ=0xdf;//控制第1个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data1[hour%10];//小时个位 SMG_KZ=0xef;//控制第2个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data[min/10];//分十位 SMG_KZ=0xff;//控制第3个数码管不亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data1[min%10];//分个位 SMG_KZ=0xff;//控制第4个数码管不亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data[sec/10];//秒十位 SMG_KZ=0xfd;//控制第5个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data[sec%10];//秒个位 SMG_KZ=0xfe;//控制第6个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; } } voiddisp3(hour1,min1,sec1)//数码管模式3(显示闹钟时间) { SMG_XS=Data[hour1/10];//闹钟时十位 SMG_KZ=0xdf;//控制第1个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data1[hour1%10];//闹钟时个位 SMG_KZ=0xef;//控制第2个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data[min1/10];//闹钟分十位 SMG_KZ=0xf7;//控制第3个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data1[min1%10];//闹钟分个位 SMG_KZ=0xfb;//控制第4个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data[sec1/10];//闹钟秒十位 SMG_KZ=0xfd;//控制第5个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data[sec1%10];//闹钟秒个位 SMG_KZ=0xfe;//控制第6个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; } voiddisp4(hour1,min1,sec1)//数码管模式4: 调整闹钟时钟(闹钟时钟在数码管上闪烁) { j++;//j加1 while(j==40){j=0;}//j为40时,j清0 if(j<20)//j小于20闹钟时,分,秒都显示 { SMG_XS=Data[hour1/10];//闹钟时十位 SMG_KZ=0xdf;//控制第1个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data1[hour1%10];//闹钟时个位 SMG_KZ=0xef;//控制第2个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data[min1/10];//闹钟分十位 SMG_KZ=0xf7;//控制第3个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data1[min1%10];//闹钟分个位 SMG_KZ=0xfb;//控制第4个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data[sec1/10];//闹钟秒十位 SMG_KZ=0xfd;//控制第5个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; SMG_XS=Data[sec1%10];//闹钟秒个位 SMG_KZ=0xfe;//控制第6个数码管亮 delay(t);//延时一下(消隐) SMG_KZ=0xff; } else//否则20 { SMG_XS=Data[hour1/10];//闹
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 数字 报告