24小时制时、分、秒计时器设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

时钟仿真实验报告

一、任务及要求

用51单片机设计时、分、秒计时器,具体要求如下。

1、具有时、分、秒计时功能和8位数码管显示功能,显示格式为:“时-分-秒”;

2、用Proteus设计仿真电路进行结果仿真;

3、4人组成设计小组完成,小组成员有明确分工,1人负责总体方案设计及报告撰写,2人负责功能模块函数设计,1人负责仿真电路设计及调试。

4、完成程序设计、仿真电路设计、结果仿真,完成报告并上传空间课程栏目中的课程设计报告子栏目中。

二、设计方案:

1、总体方案构思:通过使用定时计数器以及中断溢出,50ms中断溢出一次,溢出20次为1S。所以当定时溢出计数变量temp自加20次时计数变量miao自加1,直到加到第60次时miao(秒)清零,并且计数变量fen自加1,直到fen加到第60次时,fen(分)清零且shi(时)

自加1,直到shi加到第24次时,shi(小时)清零。最后经译码后,通过扫描显示模块程序将得到的时钟结果以动态显示的方式显示在8位一体共阳数码管上。

2、程序功能模块说明:此时钟程序包括时钟中断计时、延时函数、显示函数等模块

3、仿真电路构成:此次时钟程序的仿真电路的设计较简单,硬件部分主要有AT89C52单片机芯片一块、八位一体LED共阳数码管一块、8个普通电阻以及8个逻辑非门。其中8个普通电阻用作P0口上拉电阻。另外,由于数码管是共阳的,而实际程序中的位码是以低电平有效的,所以八个逻辑非门用来取反单片机输出的位码。

4、时钟计时程序设计思想分析:采用定时计数器T0,工作方式1,定时50ms,再对定时溢出中断次数计数,若溢出了20次则时间为1秒!

5、函数模块程序流程图:

时钟中断计时模块流程图:

6、仿真电路设计

三、程序代码汇集:

/*时钟及显示程序,适用于寻迹小车实验板*/

#include//头文件

#define uchar unsigned char

#define uint unsigned int

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,

0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳七段编码

uchar temp=0;//定义定时器溢出计数变量,每隔50ms产生1次溢出,temp加1

uchar miao=00; //定义时钟变量,当temp计数加20(20x50ms=1s)时,miao加1

uchar fen=00; //定义时钟变量,当miao计数加60(60x20x50ms=60s)

时,fen加1

uchar shi=00; //定义时钟变量,当fen计数加60时,shi加1 sbit P0_6=P0^6 ;//定义P0端口

/*--定时计数器T0及其中断初始化函数--*/

void timer0init(void)

{

TMOD=0x01;//设置定时器0为工作方式1

TH0=(65536-50000)/256;//16位计数初值除以256得到高8位初值

TL0=(65536-50000)%256;//16位计数初值除以256的余数得到低8位初值

EA=1;//开总中断

ET0=1;//开定时器0中断

TR0=1;//启动定时器0

}

/*----------延时函数---------------*/

void delay(uint n)

{

uint i,j;

for(i=n;i>0;i--)

for(j=124;j>0;j--);

}

/*定时计数器中断程序,每当定时计数器溢出时触发中断,执行该程序*/

void time0() interrupt 1

{

TH0=(65536-50000)/256;//重装初值

TL0=(65536-50000)%256;

if(temp==20)

{

temp=0;

if(miao==59)

{miao=0;

if(fen==59)

{fen=0;

if(shi==23) shi=0;

else shi++;

}

else fen++;

}

else miao++;

}

else temp++;

}

/*--------------显示函数------------*/

void display(void)

{

/*P1=0xfe;*/P1=0x7f;//输出秒的个位的位码 P0=table[miao%10]; //输出秒的个位的段码 delay(5); //亮5ms

/*P1=0xfd;*/P1=0xbf;//输出秒的十位的位码 P0=table[miao/10]; //输出秒的十位的段码 delay(5); //亮5ms

/*P1=0xfb;*/P1=0xdf;

P0=0xbf;

delay(5);

/*P1=0xf7;*/ P1=0xef; //输出分的个位的位码P0=table[fen%10]; //输出分的个位的段码

delay(5);

/*P1=0xef;*/P1=0xf7; //输出分的十位的位码

P0=table[fen/10]; //输出分的十位的段码

delay(5);

/*P1=0xdf;*/P1=0xfb;

P0=0xbf;

delay(5);

/*P1=0xbf;*/P1=0xfd; //输出时的个位的位码

P0=table[shi%10]; //输出时的个位的段码

delay(5);

/*P1=0x7f;*/P1=0xfe; //输出时的十位的位码

P0=table[shi/10]; //输出时的十位的段码

delay(5);

}

/*----------主函数-----------------*/

void main(void)

{

timer0init();//调用初始化函数对定时计数器进行初始化 while(1)

{

display();//调用显示函数显示时间

}

相关文档
最新文档