单片机多功能秒表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
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;