需要一个单片机电子时钟,带秒表功能,请好心人发给我,[email protected],谢谢!

如题所述

#include <reg51.h>

#include <intrins.h>

#define uint unsigned int

#define uchar unsigned char

sbit LCD_RS=P2^0;

sbit LCD_RW=P2^1;

sbit LCD_EN=P2^2;

sbit SPK=P3^0;

sbit key1=P1^0;

sbit key2=P1^1;

sbit key3=P1^2;

sbit key4=P1^3;

uchar Display_Buffer[16]="                ";

uchar Count,hour=12,min=12,sec=12;

bit flag,H_or_M;

uchar display[]="This is colck";

void _delay_ms(uint x)

{

uchar i;

while(x--)

{

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

}

}

/********************************************************************** 

*函数名称:LCD_Write_Command

*输 入:uchar cmd

*输 出:无 

*功 能:向LCD1602写指令 

**********************************************************************/ 

void LCD_Write_Command(uchar cmd)

{

LCD_RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令

LCD_RW=0;

LCD_EN=0;//EN置低电平

P0=cmd;//将数据送入P2口,即写入指令或地址

LCD_EN=1;//EN置高电平

_delay_ms(1);//稍延时,给硬件反应时间

LCD_EN=0;//当EN由高电平跳变成低电平时,液晶模块开始执行命令

}

/********************************************************************** 

*函数名称:LCD_Write_Data

*输 入:uchar dat

*输 出:无 

*功 能:向LCD1602写数据 

**********************************************************************/ 

void LCD_Write_Data(uchar dat)

{

LCD_RS=1;//RS为高电平,RW为低电平时,可以写入数据

LCD_RW=0;

LCD_EN=0;//EN置低电平

P0=dat;//将数据送入P0口,即将数据写入液晶模块

LCD_EN=1;//EN置高电平

_delay_ms(1);//稍延时,给硬件反应时间

LCD_EN=0;//当EN由高电平跳变成低电平时,液晶模块开始执行命令

}

/********************************************************************** 

*函数名称:Init_LCD 

*输 入:无 

*输 出:无 

*功 能:初始化LCD1602 

**********************************************************************/ 

void Init_LCD(void)

{

LCD_Write_Command(0x38);//显示模式设置:16×2显示,5×7点阵,8位数据接口

_delay_ms(1);

LCD_Write_Command(0x06);//显示模式设置:光标右移,字符不移

_delay_ms(1);

LCD_Write_Command(0x0c);//显示模式设置:显示开,无光标,光标不闪烁

_delay_ms(1);

LCD_Write_Command(0x01);//清屏幕指令,将以前的显示内容清除

_delay_ms(1);

}

/********************************************************************** 

*函数名称:LCD_POS

*输 入:uchar pos 

*输 出:无 

*功 能:字符显示位置

**********************************************************************/ 

void LCD_POS(uchar pos)

{

LCD_Write_Command(0x80|pos);//显示位置的确定方法规定为"80H+地址码x"

}

/********************************************************************** 

*函数名称:Show_String

*输 入:uchar *str 

*输 出:无 

*功 能:LCD1602显示字符串处理函数

**********************************************************************/ 

void Show_String(uchar *str)

{

while(*str!='\0')//只要没有写到结束标志,就继续写

LCD_Write_Data(*str++);//将字符常量写入LCD,并指向下一个字符

}

void song(void)

{

uchar i,j,k;

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

{

SPK=~SPK;

for(k=0;k<50;k++);

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

}

}

/////lcd1602液晶显示//////

void Display_Time(uchar Hour,uchar Min,uchar Sec)

{

Display_Buffer[0]=Hour/10+'0';//小时十位

Display_Buffer[1]=Hour%10+'0';//小时个位

Display_Buffer[2]=':';//显示:号

Display_Buffer[3]=Min/10+'0';//显示分钟十位

Display_Buffer[4]=Min%10+'0';//显示分钟个位

Display_Buffer[5]=':';//显示:号

Display_Buffer[6]=Sec/10+'0';//显示秒十位

Display_Buffer[7]=Sec%10+'0';//显示秒个位

LCD_POS(0x40);//显示在液晶第1行第0列

Show_String(Display_Buffer);

}

/////按键处理//////

void Set_time(void)

{

flag=0;

if(key1==0||key2==0||key3==0)//若key1,key2,key3其中有键按下,则为真

{

TR0=0;//定时器0停止

flag=1;//按键标志位为真

}

while(flag)//判断那一个按键按下

{

if(key1==0)//判断key1是否按下

{

while(!key1);//等待释放

H_or_M=!H_or_M;//选择是修改时还是分钟

}

else if(key2==0)//判断key2是否被按下

{

while(!key2);//等待释放

if(H_or_M)//若H_OR_M为真,则修改小时

{

if(++hour==24)//若小时=24,则小时=0 

hour=0;//小时加1

}

else//否则修改分钟

{

if(++min==60)//若分钟等于60,则分钟等于0

min=0;//分钟加1

}

}

else if(key3==0)//判断key3是否被按下

{

while(!key3);//等待释放

if(H_or_M)//若H_OR_M为真,则修改小时

{

if(--hour==0xff) //小时减1,若小时等于-1,则小时等于23

hour=23;

}

else//否则修改分钟

{

if(--min==0xff)//分钟减1,若分钟等于-1,则分钟等于59

min=59;

}

}

else if(key4==0)//判断key4是否被按下

{

while(!key4);//等待释放

flag=0;//按键标志清零

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

}

Display_Time(hour,min,sec);//传H,M,S值显示到液晶

}

}

void timer0_init(void)//定时器0初始化

{

TMOD=0x01;//定时器0,方式1

ET0=1;//

EA=1;//总中断允许

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

TH0=(65535-50000)/256;//装高8位初值

TL0=(65535-50000)%256;//装低8位初值

}

void main(void)//主函数

{

//P0=0xff;

P1=0xff;//端口初始化

P3=0xff;

Init_LCD();//液晶初始化

timer0_init();//定时器0初始化

LCD_POS(0);//显示在液晶第1行第0列

Show_String(display);

while(1)//无限循环

{

Display_Time(hour,min,sec);//液晶显示时间

//_delay_ms(500);//延时

Set_time();//时间调整

}

}

void timer0() interrupt 1//定时器0中断

{

TH0=(65535-50000)/256;//重装定时器0高8位

TL0=(65535-50000)%256;//重装定时器0低8位

Count++;//计数加1

if(Count==20)//如果COUNT等于20

{

Count=0;//计数清零

sec++;//秒加1

if(sec==60)//判断秒是否等于60

{

sec=0;//秒清零

min++;//分钟加1

if(min==60)//判断分钟是否等于60

{

min=0;//若等于60,则清零分钟

hour++;//小时加1

if(hour==24)//判断小时是否等于24

{

hour=0;//若小时等于24,则清零小时,分钟,秒

min=0;

sec=0;

}

song();

}

}

}

}

基于LCD1602液晶数字时钟程序,原理图如下:

温馨提示:答案为网友推荐,仅供参考
相似回答