标题:
单片机秒表设计,启动仿真开始计时LCD1602显示时分秒
[打印本页]
作者:
18896597781
时间:
2021-5-27 16:43
标题:
单片机秒表设计,启动仿真开始计时LCD1602显示时分秒
功能介绍:实现手表功能,
LCD显示时分秒,
附件包含完整程序及仿真设计。
仿真图.png
(400.93 KB, 下载次数: 71)
下载附件
2021-5-27 16:38 上传
单片机源程序如下:
#include <REG51.h>
#include <intrins.h>
#define N 50000
#define uint unsigned int
#define uchar unsigned char
#define LCD_DB P1
void display_time(); //声明显示时间函数
void LCD_init(); //申明1602初始化函数
void LCD_write_command(uchar dat); //申明1602写命令函数
void LCD_write_data(uchar dat); //申明1602写数据函数
void delay_n40us(uint n); //申明延迟函数
uchar shi,fen,miao; //全局变量时分秒
uchar tt[]="Welcome 51Luntan";
uint num=0;
/*****************************************
电路连接?
P1------DB0~DB7
P2.0------RS
P2.1------RW
P2.2------E
*****************************************/
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_E=P2^2;
//********延时函数***************
void delay_n40us(uint n)
{ uint i;
uchar j;
for(i=n;i>0;i--)
for(j=0;j<2;j++);
}
void LCD_init(void)
{
LCD_write_command(0x38);//设置8位格式,2行,5x7
LCD_write_command(0x0c);//整体显示,关光标,不闪烁
LCD_write_command(0x06);//设定输入方式,增量不移位--------------
LCD_write_command(0x01);//清除屏幕显示----------------
delay_n40us(100); //实践证明,我的LCD1602上,用for 循环200 次就能可靠完成清屏指令。
}
//********************************
//********写指令函数***********设置先向1602写入的数据为地址*
void LCD_write_command(uchar dat)
{
LCD_DB=dat;
LCD_RS=0;//指令
LCD_RW=0;//写入
LCD_E=1;//允许
LCD_E=0;//产生下降沿
delay_n40us(1);//实践证明,我的LCD1602 上,用for 循环1 次就能完成普通写指令。
}
//*******************************
//********再写数据函数*****向1602中写入数据********
void LCD_write_data(uchar dat)
{
LCD_DB=dat;
LCD_RS=1;//数据
LCD_RW=0;//写入
LCD_E=1;//允许
LCD_E=0;//产生下降沿
delay_n40us(1);
}
//************显示时间**************
void display_time()
{
LCD_init();
LCD_write_command(0x80); //从第一行显示T
LCD_write_data('T');
delay_n40us(15000);
LCD_write_data('i');
delay_n40us(15000);
LCD_write_data('m');
delay_n40us(15000);
LCD_write_data('e');
delay_n40us(15000);
LCD_write_data(':');
delay_n40us(15000);
LCD_write_command(0x80+5); //***显示时
LCD_write_data(0x30+shi/10); //****取十位显示
delay_n40us(15000);
LCD_write_data(0x30+shi%10); //***取个位显示
delay_n40us(15000);
LCD_write_data(':');
LCD_write_data(0x30+fen/10); //显示分
delay_n40us(15000);
LCD_write_data(0x30+fen%10);
delay_n40us(15000);
LCD_write_data(':');
LCD_write_data(0x30+miao/10); //显示秒
delay_n40us(15000);
LCD_write_data(0x30+miao%10);
delay_n40us(15000);
}
//*****T0中断函数50ms中断一次**************
void t0_time() interrupt 1
{
++num;
TH0=(65536-N)/256;
TH0=(65536-N)%256;
if(num==20) //计时满一秒钟
{
num=0;
++miao;
LCD_write_command(0x80+11);
LCD_write_data(0x30+miao/10);
delay_n40us(15000);
LCD_write_data(0x30+miao%10);
delay_n40us(15000);
if(miao==60) //计时满一分钟
{
miao=0;
++fen;
LCD_write_command(0x80+8);
LCD_write_data(0x30+fen/10);
delay_n40us(15000);
LCD_write_data(0x30+fen%10);
delay_n40us(15000);
LCD_write_data(':');
delay_n40us(15000);
if(fen==60) //计时满一小时
{
fen=0;
++shi;
LCD_write_command(0x80+5);
LCD_write_data(0x30+shi/10);
delay_n40us(15000);
LCD_write_data(0x30+shi%10);
delay_n40us(15000);
LCD_write_data(':');
delay_n40us(15000);
if(shi==24) //计时满一天
{
shi=0;
}
}
}
}
}
//**************main函数***********
main()
{
int h;
shi=0;
fen=0;
miao=0;
display_time(); //显示初始时间0
LCD_write_command(0x80+64);//从第二行开始显示
for(h=0;h<16;++h) //显示定义好的字符串
{
LCD_write_data(tt[h]);
delay_n40us(15000);
}
TH0=(65536-N)/256; //载入计数初值高八位
TH0=(65536-N)%256; //载入计数初值低八位
EA=1; //开中断权限
ET0=1; //开T0中断
TR0=1; //定时开始
TMOD=0x01; //选用模式1定时
while(1); //等待中断
}
复制代码
所有资料51hei提供下载:
利用定时中断设计手表LCD1602显示时分秒.zip
(64.88 KB, 下载次数: 43)
2021-5-27 16:34 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1