课程设计:基于单片机AT89C52电子时钟课程设计说明书.doc

上传人:yyf 文档编号:3293000 上传时间:2019-08-08 格式:DOC 页数:20 大小:246.51KB
返回 下载 相关 举报
课程设计:基于单片机AT89C52电子时钟课程设计说明书.doc_第1页
第1页 / 共20页
课程设计:基于单片机AT89C52电子时钟课程设计说明书.doc_第2页
第2页 / 共20页
课程设计:基于单片机AT89C52电子时钟课程设计说明书.doc_第3页
第3页 / 共20页
课程设计:基于单片机AT89C52电子时钟课程设计说明书.doc_第4页
第4页 / 共20页
课程设计:基于单片机AT89C52电子时钟课程设计说明书.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《课程设计:基于单片机AT89C52电子时钟课程设计说明书.doc》由会员分享,可在线阅读,更多相关《课程设计:基于单片机AT89C52电子时钟课程设计说明书.doc(20页珍藏版)》请在三一文库上搜索。

1、单片机课程设计报告一、课程设计内容 1)显示时间功能,能正确显示“时”、“分”。2)显示日期功能,能显示“月”、“日”。3)闹钟功能,可按设定的时间闹时。4)具有校准月、日、时、分的功能。二、元器件介绍本次课程设计我使用的单片机是至强51蓝精灵版,而实验中使用到的关键元器件主要有:STC85C52RC,4*4按键,蜂鸣器,数码管等。下面是STC85C52RC的简单介绍: AT89C52是本设计最核心的部件,它是美国ATMEL公司生产的低电压,高性能CMOS 8位单片机,片内含8K bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATM

2、EL公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大。AT89C52单片机适用于许多较为复杂的控制应用场合。下图是AT89C52最常见的一种封装。 如上图所示,AT89C52共有40个管脚,其各个功能如下:VCC 运行时加5VVSS 接地XTAL1 振荡器反相放大器及内部时钟发生器的输入端XTAL2 振荡器反相放大器的输出端RST 复位输入,高电平有效,在晶振工作时,在RST引脚上作用2个机器周期以上的高电平,将使单片机复位。/VPP 片外程序存储器访问允许信号。欲使CPU仅访问外部程序存储器

3、(地址为0000H-FFFFH),端必须保持低电平(接地),如果端为高电平(接Vcc端),CPU则执行内部程序中的指令。LAE/ 当访问外部程序存储器或数据存储器时,ALE(地址允许锁存)输出脉冲用于锁存地址的低8位位数字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。对Flash存储器编程期间,该引脚还用于输入编程脉冲(第二功能)。:程序储存允许()输出是外部程序存储器的读选通信号,当AT89C52由外部存储器取指令(或数据)时,每个机器周期两次有效,即输出两个脉冲。在此期间,当访

4、问外部数据存储器,将跳过两次信号。P0口 是一组8位漏极开路双向I/O口,也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。P1口 是一个内部带上拉电阻的8位准双向I/O口。在对EPROM型单片机编程和验证程序时,它接收低8位地址。P1能驱动(吸收或输出电流)4个LSTTL电路。P1.0还被用作定时器/计数器2的外部计数输入端,即专用功能T2。P1.1被用作专用功能端T2EX,即定时器T2的外部控制端。参见下表。 P1.1和P1.1的第二功能引脚号功能特性P1.0T2(定时/计数器2外部计数脉冲输入),时钟输出P

5、1.1T2XE(定时/计数器2捕获/重装载触发和方向控制)P2口 是一个带有内部上拉电阻的8位准双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻,某个引脚外部信号拉低是会输出一个电流。P3口 是一组带有内部上拉电阻的8位准双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的P3口将用上拉电阻输出电流。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如下表所示: P3口各位的第二功能 端口引脚 第二功能 P3.0RXD

6、 (串行输入口)P3.1TXD (串行输出口)P3.2 (外部中断0) P3.3 (外部中断1)P3.4T0 (定时/计数器0) P3.5T1 (定时/计数器1)P3.6 (外部数据存储器写选通)P3.7 (外部数据存储器读选通)三、设计方案1)实物图2)实验程序流程图主程序开 始T0初始化,中断初始化,启动定时器while(1)死循环调用子程序调用启停子程序keysure( )键盘扫描调用子程序keyhandle( )根据键盘扫描的返回值进行处理调用compare( )函数比较现在显示的时间是否和闹钟时间相同void main()init(); while(1) keysure();keyh

7、andle();compare(); 初始化函数void init()TMOD = 0x01; TH0 = 0xdc; TL0 = 0x00; EA=1; ET0=1; TR0=1; keytemp=8;/这是为了还没有扫描按键时给keyhandle()函数处理用的/ 实验中只是用了T0这一个定时器,也只是使用了T0这个中断。实验中设置TMOD = 0x01使T0工作于方式1。并且由公式t=(65535-M)*6/12MHz,而t为中断溢出时间,为10ms,所以得出初值M=3340=0xdc。键盘扫描函数否是调用keysure()函数用以扫描键盘是否真正被按下键盘是否真的被按下?调用scank

8、ey(),根据按下键位返回值给keyhandle()处理void keysure()static bit flag1; P1 = 0xf0;if(P1 != 0xf0)Delay_1ms(15);if(P1 != 0xf0)keytemp= scankey();flag1=1; 键盘返回值函数scankey()uchar scankey(void) /键盘扫描后返回值/uchar i,j, temp, Buffer4 = 0xef, 0xdf, 0xbf, 0x7f;for(j=0; j4; j+)P1 = Bufferj; _nop_();_nop_();_nop_();temp = 0x0

9、1; for(i=0; i4; i+)if(!(P1 & temp) return (i+j*4);temp 59) hour=0; break; case 2 : nhour+;keytemp=9; if(nhour24) nhour=0; break; case 3 : month+;keytemp=10; if(month12) month=0; break; default: break; if(which=2)/此减数/ switch(who) case 1 : min+;keytemp=8; if(min59) min=0; break; case 2 : nmin+;keytem

10、p=9; if(nmin59) nmin=0; break; case 3 : day+;keytemp=10; if(day30) day=0; break; default: break; flag=0; if(keytemp=15&flag=1)/此减数/ if(which=1) switch(who) case 1 : hour-;keytemp=8; if(hour0) hour=23; break; case 2 : nhour-;keytemp=9; if(nhour0) nhour=23; break; case 3 : month-;keytemp=10; if(month0

11、) month=12; break; default: break; if(which=2) switch(who) case 1 : min-;keytemp=8; if(min0) min=59; break; case 2 : nmin-;keytemp=9; if(nmin0) nmin=59; break; case 3 : day-;keytemp=10; if(day199) sec+; i=0; if(sec59) sec=0; min+; if(min59) min=0; hour+; if(hour23) day+; hour=0; display();/每次中断程序中都调

12、用一次LED扫描程序/LED扫描子程序void display()static char i=0;char disbuf4; disbuf1=s1%10; disbuf0=s1/10; disbuf3=s2%10; disbuf2=s2/10;P0=0xff;P2=bi;P0=duanmadisbufi;i+;if(i3)i=0;if(sec&0x01)&i=2)P0&=0x7f;3)实验中使用电路模块电路图LED显示模块蜂鸣器模块键盘扫描模块D0D7分别对应IO口的P1.0P1.7以下是全部源程序 #include #define uchar unsigned char #define ui

13、nt unsigned int #includeuchar code duanma=0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0xbf;unsigned char code b=0xfe,0xfd,0xfb,0xf7;char sec=0,min=0,hour=2,nsec=0,nmin=1,nhour,month=12,day=1,keytemp;bit flag=0;char who=0;char which=1;sbit led1=P30;sbit led2=P31;sbit led3=P32;sbit led4=P33;sbi

14、t SPK=P36;/蜂鸣器的接口/#define uint unsigned intchar s1,s2;void display()static char i=0;char disbuf4; disbuf1=s1%10; disbuf0=s1/10; disbuf3=s2%10; disbuf2=s2/10;P0=0xff;P2=bi;P0=duanmadisbufi;i+;if(i3)i=0;if(sec&0x01)&i=2)P0&=0x7f;void init()TMOD = 0x01; TH0 = 0xdc; TL0 = 0x00; EA=1; ET0=1; TR0=1; keyte

15、mp=8;/这是为了没有扫描到按键时给keyhandle()函数处理用的/ void tiem0(void) interrupt 1 static unsigned char i=0; TH0 = 0xdc; TL0 = 0x00; i+; if(i199) sec+; i=0; if(sec59) sec=0; min+; if(min59) min=0; hour+; if(hour23) day+; hour=0; display();uchar scankey(void)uchar i,j, temp, Buffer4 = 0xef, 0xdf, 0xbf, 0x7f;for(j=0;

16、 j4; j+)P1 = Bufferj; _nop_();_nop_();_nop_();temp = 0x01; for(i=0; i4; i+)if(!(P1 & temp) return (i+j*4);temp 59) hour=0; break; case 2 : nhour+;keytemp=9; if(nhour24) nhour=0; break; case 3 : month+;keytemp=10; if(month12) month=0; break; default: break; if(which=2)/此减数/ switch(who) case 1 : min+;

17、keytemp=8; if(min59) min=0; break; case 2 : nmin+;keytemp=9; if(nmin59) nmin=0; break; case 3 : day+;keytemp=10; if(day30) day=0; break; default: break; flag=0; if(keytemp=15&flag=1)/此减数/ if(which=1) switch(who) case 1 : hour-;keytemp=8; if(hour0) hour=23; break; case 2 : nhour-;keytemp=9; if(nhour0

18、) nhour=23; break; case 3 : month-;keytemp=10; if(month0) month=12; break; default: break; if(which=2) switch(who) case 1 : min-;keytemp=8; if(min0) min=59; break; case 2 : nmin-;keytemp=9; if(nmin0) nmin=59; break; case 3 : day-;keytemp=10; if(day0) day=30; break; default: break; flag=0; flag=0; vo

19、id Delay_1ms(uint i)uchar x,j;for(j=0;ji;j+)for(x=0;x=148;x+);void keysure()static bit flag1; P1 = 0xf0;if(P1 != 0xf0)Delay_1ms(15);if(P1 != 0xf0)keytemp= scankey();flag1=1;else if(flag1) flag=1; void compare()if(nmin=min&nhour=hour&nsec=sec) SPK=0; if(keytemp=11) SPK=1;void main()init(); while(1) keysure();keyhandle();compare(); 四、总结总结就删掉啦,上传这篇东西希望能帮到有需要的童鞋们,但最好就不要down下来就什么都不学,连程序都看不懂就交了。但也是说说而已,该怎么着始终还是会怎么着的。本课程设计纯属梦呓,存在许多缺点,如有不爽,敬请无视。

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

当前位置:首页 > 研究报告 > 信息产业


经营许可证编号:宁ICP备18001539号-1