单片机多功能秒表

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

单片机综合实验报告

题目: 多功能数字时钟

班级:

姓名:

学号:

一、实验内容:

设计一个单片机控制的秒表系统。利用单片机的定时器的原理,结合显示电路、LED 数码管以及按键来设计计时器,使系统能够正确地进行加、减(倒)计时,数码管能够正确地显示时间。

目的要求

1)两位LED显示,显示时间为00~99秒。

2)每秒自动加1。

3)一个开始按键、一个复位按键和一个暂停按钮。

4)翻页按钮查看四个不同的计时值。

5)添加倒计时初始值设置功能

6)不同功能通过功能键Setup实现切换。

二、实验电路及功能说明

本实验以51单片机为核心,应用其中断来定时,通过按键来控制时间和日期的调整,通过1602LCD来数字显示时钟,做成一个简易的数字时钟。本实验要求能定时,还要能设置闹铃,由于对C51程序代码的写法不是很熟,没能实现闹铃功能。所以,最后该实验能实现的功能为时间和日期的调整。

其原理图如下图所示:

三、实验程序流程图:

主程序:主程序流程图

子流程图(按键功能设置)

四、实验结果分析

经过proteus仿真可知:该方案可行,能够对时间进行精确的调整,也能对日期进行更

正,基本上能实现上述功能。

五、心得体会

通过该试验我对51的了解更加深入了一层,特别是对C51的写法更加了解,还对1602的基本操作有了一定的了解。同时,也发现C语言的重要性,以后要多加强对C语言的学习.

六、程序清单

#include

#include //库函数头文件,代码中引用了_nop_()函数// 定义控制信号端口

sbit RS=P2^4; //P2.4

sbit RW=P2^5; //P2.5

sbit E=P2^6; //P2.6

sbit set=P1^4; //设置键

sbit add1=P1^5; //加1键

sbit sub1=P1^6; //减1键

sbit enter=P1^7; //确认键

bit k=0,f=0;//k为0表示运行状态,k为1表示设置状态;f为0表示第一行显示,f为1表示第二行显示

char sec,n,m;

unsigned char count,key;

unsigned char lcdd[]="0123456789";

/*声明调用函数*/

void dispd(); //日期显示函数

void dispt(); //时间显示函数

unsigned char keys();//按键扫描函数

void lcd_w_cmd(unsigned char com); //写命令字函数

void lcd_w_dat(unsigned char dat); //写数据函数

unsigned char lcd_r_start(); //读状态函数

void int1(); //LCD初始化函数

void delay(unsigned char t); //可控延时函数

void delay1(); //软件实现延时函数,5个机器周期

/*主函数*/

void main()

{

TMOD=0x01; //设置为定时器模式1

TH0=(65536-50000)/256; //晶振6MHz,定时时间100ms

TL0=(65536-50000)%256;

IE=0x82; //开全局中断和定时中断

TR0=1; //启动定时器

sec=0; //秒

count=0; //中断次数清0

n=-3; //设置键按下次数,第一行日期

m=-3; //设置键按下次数,第二行时间

P0=0xff; // 送全1到P0口int1(); // 初始化LCD

delay(255);

while(1)

{

key=keys(); //读取按键

switch(key)

{

case 0xe0: //按下设置键

{

TR0=0;

k=1;

if(f==0)

{

n=n+3;

if(n==9)

{

n=0;

m=0;

f=1;

}

}

else

{

m=m+3;

if(m==12)

{

m=0;

n=0;

f=0;

}

}

if(f==0)

{

lcd_w_cmd(0x0d);

lcd_w_cmd(0x86+n);

}

else

{

lcd_w_cmd(0x0d);

lcd_w_cmd(0xc4+m);

}

} break;

case 0x70: //按下确认键

{

k=0;

TR0=1;

n=-3;

m=-3;

f=0;

} break;

case 0xd0: //按下加1键

{

if(k==1)

{

if(f==0)

{

(m==6){sec++;if(sec==100) sec=0;}

dispt(); //调用第二行显示函数

lcd_w_cmd(0x0d); //光标闪烁

lcd_w_cmd(0xc4+m);//返回设置值显示地址

}

}

} break;

case 0xb0: //按下减1键

{

if(k==1)

{

if(f==0)

{

if(m==6){sec--;if(sec<0) sec=99;}

dispt(); //调用第二行显示函数

lcd_w_cmd(0x0d); //光标闪烁

lcd_w_cmd(0xc4+m);//返回设置值显示地址

}

}

} break;

}

if(k==0) {dispd();dispt();} //调用LCD显示函数

}

}

/*延时函数*/

void delay(unsigned char t)

{

unsigned char j,i;

for(i=0;i

for(j=0;j<20;j++);

}

/*延时函数1*/

void delay1()

{

_nop_();

_nop_();

_nop_();

}

/*LCD初始化函数*/

void int1()

{

lcd_w_cmd(0x3c); // 设置工作方式

lcd_w_cmd(0x0c); // 设置光标

lcd_w_cmd(0x01); // 清屏

lcd_w_cmd(0x06); // 设置输入方式

lcd_w_cmd(0x80); // 设置初始显示位置

}

/*LCD读状态函数*/

//返回值:返回状态字,最高位D7=0,LCD控制器空闲;D7=1,LCD 控制器忙

unsigned char lcd_r_start()

{

unsigned char s;

RW=1; //RW=1,RS=0,读LCD状态

delay1();

RS=0;

delay1();

E=1; //E端时序

delay1();

s=P0; //从LCD的数据口读状态

delay1();

E=0;

delay1();

RW=0;

相关文档
最新文档