微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 通过51单片机实现电子时钟功能并通过LCD1602显示

通过51单片机实现电子时钟功能并通过LCD1602显示

时间:11-26 来源:互联网 点击:
通过51单片机实现时钟功能并通过LCD1602显示.rar工程文件点击下载
实验截图如下:


实验中涉及的硬件:51单片机,LCD1602模块,EEPROM AT24C02型号一个,按键3个,蜂鸣器一个

其中LCD1602模块引脚定义如下:


EEPROM引脚连接情况如下:


软件环境:uVision4(Keil_C51_V9.00(点击下载)).rar,Win7Sp1X64

源代码如下:

****************************************************************

author:lee yang

data:2011/11/12

e-mail;liyangdut@live.cn

硬件接口定义:

sda?P2^0; scl?P2^1;

s1=P3^0; //定义按键--功能键

sbit s2=P3^1; //定义按键--增加键

sbit s3=P3^2; //定义按键--减小键

sbit rs=P2^4; //定义1602液晶RS端

sbit lcden=P2^6;//定义1602液晶LCDEN端

sbit rw=P2^5; //定义1602液晶R/W端

sbit beep=P2^3; //定义蜂鸣器端

**********************************************************************

#include//包含52单片机头文件

#define uchar unsigned char

#define uint unsigned int

bit write=0; //写24C02的标志;

sbit sda=P2^0;

sbit scl=P2^1;

void delay0()

{ ;; }

void start() //开始信号

{

sda=1;

delay0();

scl=1;

delay0();

sda=0;

delay0();

}

void stop() //停止

{

sda=0;

delay0();

scl=1;

delay0();

sda=1;

delay0();

}

void respons() //应答

{

uchar i;

scl=1;

delay0();

while((sda==1)&&(i<250))i++;

scl=0;

delay0();

}

void init_24c02()//IIC初始化函数

{

sda=1;

delay0();

scl=1;

delay0();

}

void write_byte(uchar date)//写一个字节函数

{

uchar i,temp;

temp=date;

for(i=0;i<8;i++)

{

temp=temp<1;

scl=0;

delay0();

sda=CY;

delay0();

scl=1;

delay0();

}

scl=0;

delay0();

sda=1;

delay0();

}

uchar read_byte()//读一个字节函数

{

uchar i,k;

scl=0;

delay0();

sda=1;

delay0();

for(i=0;i<8;i++)

{

scl=1;

delay0();

k=(k<1)|sda;

scl=0;

delay0();

}

return k;

}

void write_add(uchar address,uchar date)//指定地址写一个字节

{

start();

write_byte(0xa0);

respons();

write_byte(address);

respons();

write_byte(date);

respons();

stop();

}

char read_add(uchar address)//指定地址读一个字节

{

uchar date;

start();

write_byte(0xa0);

respons();

write_byte(address);

respons();

start();

write_byte(0xa1);

respons();

date=read_byte();

stop();

return date;

}

sbit s1=P3^0; //定义按键--功能键

sbit s2=P3^1; //定义按键--增加键

sbit s3=P3^2; //定义按键--减小键

sbit rs=P2^4; //定义1602液晶RS端

sbit lcden=P2^6;//定义1602液晶LCDEN端

sbit rw=P2^5;

sbit beep=P2^3; //定义蜂鸣器端

uchar count,s1num;

char miao,shi,fen;

uchar code table[]=" 2011-11-12 ";//定义初始上电时液晶默认显示状态

void delay(uint z) //延时函数

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void di()//蜂鸣器发声函数

{

beep=0;

delay(100);

beep=1;

}

void write_com(uchar com)//液晶写命令函数

{

rs=0;

rw=0;

lcden=0;

P0=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

void write_date(uchar date)//液晶写数据函数

{

rs=1;

rw=0;

lcden=0;

P0=date;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

void write_sfm(uchar add,uchar date)//写时分秒函数

{

uchar shi,ge;

shi=date/10;//分解一个2位数的十位和个位

ge=date;

write_com(0x80+0x40+add);//设置显示位置

write_date(0x30+shi);//送去液晶显示十位

write_date(0x30+ge); //送去液晶显示个位

}

void init()//初始化函数

{

uchar num;

lcden=0;

fen=0; //初始化种变量值

miao=0;

shi=0;

count=0;

s1num=0;

init_24c02();

write_com(0x38);//初始化1602液晶

write_com(0x0c);

write_com(0x06);

write_com(0x01);

write_com(0x80);//设置显示初始坐标

for(num=0;num<15;num++)//显示年月日星期

{

write_date(table[num]);

delay(5);

}

write_com(0x80+0x40+6);//写出时间显示部分的两个冒号

write_date(:);

delay(5);

write_com(0x80+0x40+9);

write_date(:);

delay(5);

miao=read_add(1);//首次上电从AT24C02中读取出存储的数据

fen=read_add(2);

shi=read_add(3);

write_sfm(10,miao);//分别送去液晶显示

write_sfm(7,fen);

write_sfm(4,shi);

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

TH0=(65536-50000)/256;//定时器装初值

TL0=(65536-50000)%6;

EA=1; //开总中断

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

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

}

void keyscan()//按键扫描函数

{

if(s1==0)

{

delay(5);

if(s1==0)//确认功能键被按下

{ s1num++;//功能键按下次数记录

while(!s1);//释放确认

di();//每当有按键释放蜂鸣器发出滴声

if(s1num==1)//第一次被按下时

{

TR0=0; //关闭定时器

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top