资源描述
郑州轻工业学院
实 训 报 告
实训名称: 单片机数字电子时钟实训
姓 名:
院 (系): 软件学院
专业班级:
学 号:
指导教师: 杨 学 东
成 绩:
时间: 2014年6月9日 至 2013年6月15日
单片机数字电子时钟实训报告
目 录
一、实训目的
1、时钟设计的要求
2、设计要求
二、工作原理
三、系统的组成
1键盘
2单片机系统
四、电子时钟程序代码编写
1、主程序流程以及部分代码
2、定时器中断流程以及部分代码
3、时间显示流程以及部分代码
五、心得体会
一、实训目的
本次实训是使用89C51单片机,通过C语言来编写的程序,然后在单片机上来运行程序来实现预定的控制目的。本实训主要是通过单片机的LCD来显示时间(主要是小时、分钟和秒钟的显示)。而且可以通过四个按键来调节时间(主要是开始、暂停、复位和一个备用键)。通过本次的实训(我们的目标是掌握数字电子钟的制作,实现分、秒、毫秒的显示功能)能对单片机编程有熟练的了解和简单的引用,能独立自主的编写简单的高级语言通过单片机来实现一定的功能。
1、时钟设计的要求
数字钟是一个将“分”,“ 秒”,“ 毫秒”显示与人的视觉器官的计时装置。它的计时周期为1小时,显示满刻度为59分59秒990时,钟电路主要由译码显示器、“分”,“秒”,“ 毫秒”计数器
2设计要求:
设计一个基于51单片机的数字电子钟,画出防真电路图.
键盘显示图
时钟显示器图
二、工作原理
整个系统工作时,毫秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,将标准毫秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60秒,发出一个“时脉冲”信号,该信号将被送到“分钟计数器”。
1、键盘
键盘是控制和修改时钟的重要输入模块,通过键盘可以暂停,开始,复位。
2、片机系统
AT89C51是一种低功耗、高性能的片内含有4K字节闪烁可编程可擦除只读存储器,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
单片机是一种集成电路芯片,采用超大规模技术把具有数据处理能力(如算术运算,逻辑运算、数据传送、中断处理)的微处理器(CPU),随机存取数据存储器(RAM),只读程序存储器(ROM),输入输出电路(I/O口),可能还包括定时计数器,串行通信口(SCI),显示驱动电路(LCD或LED驱动电路),脉宽调制电路(PWM),模拟多路转换器及A/D转换器等电路集成到一块单块芯片上,构成一个最小然而完善的计算机系统。这些电路能在软件的控制下准确、迅速高效地完成程序设计者事先规定的任务。
四、系统软件设计流程
1、主程序流程
主程序先开始,然后启动定时器,启动后在进行按键检测,然后就可以显示时间。
主程序流程图
2、定时器中断流程 分
定时器中断时先检测一毫秒是否到,到的话秒就加1,没到就检测秒,秒到就加1,没到检测分,分到加1,没到就显示时间。
时间
定时器中断流程图
3、时间显示流程
时间显示是先毫秒十位计算显示,然后是毫秒百位,再是秒个位,秒十位,然后是分个位,然后是分十位。
结束
时间显示流程图
五、心得体会
通过本次单片机电子时钟的实训,确实学到了很多的东西。虽然说实训过程中遇到了很多的问题,但是通过和老师同学的学习和探讨,通过课下图书馆相关书籍的借阅问题都得到了解决。主要是以前没有过这方面的学习,所以说我感觉真正做实验的时候比较吃力,为了弄懂它,不但要学习单片机这方面的知识还要学习电学的知识。所以我借阅了80C51单片机和电路基础,学习之后对很多知识都能基本了解。
代码
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit LEN1 = P2^6;
sbit LEN2 = P2^7;
sbit KEY1 = P3^4;
sbit KEY2 = P3^5;
sbit KEY3 = P3^6;
sbit KEY4 = P3^7;
uint counter;
uchar xsh[6]=0;
ucharcode duanma[]={0XED,0X81,0XF4,0XB5,0X99,0X3D,0X7D,0X85,0XFD,0XBD};
uchar code weima[]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF};
void display(uchar disp,uchar num);
void xianshi(void);
void delay1ms(uint ms);
void Timer0Init(void);
uchar key();
uchar key1();
uchar key2();
uchar key3();
uchar key4();
void main()
{
Timer0Init();
P3=0xff;
ET0 =1;
EA =1;
LEN1 =1;
LEN2 =1;
while(1)
{
uchar a;
uint counterbuf;
counterbuf=counter;
xianshi();
a=key();
if(a==1)
{
TR0=0;
}
else if(a==2)
{
TR0=1;
}
else if(a==3)
{
counter=0;
}
else if(a==4)
{
;;
}
else ;;
}
}
void timer0() interrupt 1 //中断
{
TL0 = (65536-11000)%256;
TH0 = (65536-11000)/256;
counter++;
xsh[5]=counter%10;
if(xsh[0]==5 && xsh[1]==9 && xsh[2]==5 && xsh[3]==9 && xsh[4]==9 && xsh[5]==9)
{
delay1ms(10);
counter=0;
}
if(xsh[1]==9 && xsh[2]==5 && xsh[3]==9 && xsh[4]==9 && xsh[5]==9)
{
delay1ms(10);
xsh[0]++;
xsh[1]=0;
xsh[2]=0;
xsh[3]=0;
xsh[4]=0;
}
if(xsh[2]==5 && xsh[3]==9 && xsh[4]==9 && xsh[5]==9)
{
delay1ms(10);
xsh[1]++;
xsh[2]=0;
xsh[3]=0;
xsh[4]=0;
}
if(xsh[3]==9 && xsh[4]==9 && xsh[5]==9)
{
delay1ms(10);
xsh[2]++;
xsh[3]=0;
xsh[4]=0;
}
if(xsh[4]==9 && xsh[5]==9)
{
delay1ms(10);
xsh[3]++;
xsh[4]=0;
}
if(xsh[5]==9)
{
delay1ms(10);
xsh[4]++;
}
//
}
void xianshi(void)
{
display(0,xsh[0]);
delay1ms(2);
display(1,xsh[1]);
delay1ms(2);
display(2,xsh[2]);
delay1ms(2);
display(3,xsh[3]);
delay1ms(2);
display(4,xsh[4]);
delay1ms(2);
display(5,xsh[5]);
delay1ms(2);
}
void display(uchar disp,uchar num)
{
LEN2=1;
P0=weima[disp];//P0=weima[1];
LEN2=0;
LEN1=1;
P0=duanma[num];//P0=duanma[8];
LEN1=0;
}
uchar key()
{
if (key1()==1) return 1;
else if (key2()==1) return 2;
else if (key3()==1) return 3;
else if (key4()==1) return 4;
else return 0;
}
uchar key1()
{
if(KEY1==0&&KEY2==1&&KEY3==1&&KEY4==1)
{
delay1ms(50);
if(KEY1==0&&KEY2==1&&KEY3==1&&KEY4==1)
{
while(KEY1==0&&KEY2==1&&KEY3==1&&KEY4==1);;
P1=~P1;
return 1; // 暂停
}
else return 0;
}
else return 0;
}
uchar key2()
{
if(KEY1==1&&KEY2==0&&KEY3==1&&KEY4==1)
{
delay1ms(50);
if(KEY1==1&&KEY2==0&&KEY3==1&&KEY4==1)
{
while(KEY1==1&&KEY2==0&&KEY3==1&&KEY4==1);;
P1=~P1;
return 1; // 开始
}
else return 0;
}
else return 0;
}
uchar key3()
{
if(KEY1==1&&KEY2==1&&KEY3==0&&KEY4==1)
{
delay1ms(50);
if(KEY1==1&&KEY2==1&&KEY3==0&&KEY4==1)
{
while(KEY1==1&&KEY2==1&&KEY3==0&&KEY4==1);;
P1=~P1;
return 1; // 复位
}
else return 0;
}
else return 0;
}
uchar key4()
{
if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==0)
{
delay1ms(50);
if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==0)
{
while(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==0);;
P1=~P1;
return 1; // 备用
}
else return 0;
}
else return 0;
}
void Timer0Init(void)
{
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = (65536-10000)%256;
TH0 = (65536-10000)/256;
TF0 = 0;
TR0 = 1;
}
void delay1ms(uint ms)
{
uint j,k;
for(j=ms;j>0;j--)
for(k=120;k>0;k--);
}
展开阅读全文