×
单片机 > 单片机程序设计 > 详情

51单片机的可调数字时钟程序

发布时间:2023-04-10 发布时间:
|

使用51单片机内部定时器中断方式一计算时间,在LCD1602液晶显示小时、分钟、秒,并且可以使用按键调整小时和分钟,每次到整点时整点报时。


代码如下:


//=============================================================

//功能描述:液晶显示时钟,可调时间,准备整点时报时

//MCU:STC89C51,晶振频率:11.0592MHz

//=============================================================

#include

#include

#include


sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚

sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚

sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚

sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚

sbit k1=P1^0; //按键调小时加

sbit k2=P1^1; //按键调小时减

sbit k3=P1^2; //按键调分钟加

sbit k4=P1^3; //按键调分钟减

sbit beep=P1^4; //蜂鸣器


unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字

unsigned char code string[ ]={"Weather:Sunny"}; //定义字符数组显示提示信息

unsigned char count; //定义变量统计中断累计次数

unsigned char s,m,h; //定义变量储存秒、分钟和小时

/*==================================================

函数功能:延时

(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒

==================================================*/

void delay1ms() //@11.0592MHz

{

unsigned char i,j;

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

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

}


void delay100ms() //@11.0592MHz

{

unsigned char i, j;

i = 180;

j = 73;

do

{

while (--j);

} while (--i);

}


/*==================================================

函数功能:延时若干毫秒

==================================================*/

void delay(unsigned char n)

{

unsigned char i;

for(i=0;i

delay1ms();

}


/*==================================================

函数功能:蜂鸣器发出声音

==================================================*/

void sound(){

beep=0;

delay100ms();

beep=1;

delay100ms();

}


/*==================================================

函数功能:判断液晶模块的忙碌状态

==================================================*/

unsigned char BusyTest(void)

{

bit result;

RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态

RW=1;

E=1; //E=1,才允许读写

_nop_(); //空操作

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

result=BF; //将忙碌标志电平赋给result

E=0; //将E恢复低电平

return result;

}

/*==================================================

函数功能:将模式设置指令或显示地址写入液晶模块

==================================================*/

void WriteInstruction (unsigned char dictate)

{

while(BusyTest()==1); //如果忙就等待

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

RW=0;

E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,

// 就是让E从0到1发生正跳变,所以应先置"0"

_nop_();

_nop_(); //空操作两个机器周期,给硬件反应时间

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

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=1; //E置高电平

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

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

}

/*==================================================

函数功能:指定字符显示的实际地址

==================================================*/

void WriteAddress(unsigned char x)

{

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

}

/*==================================================

函数功能:将数据(字符的标准ASCII码)写入液晶模块

==================================================*/

void WriteData(unsigned char y)

{

while(BusyTest()==1);

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

RW=0;

E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,

// 就是让E从0到1发生正跳变,所以应先置"0"

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

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=1; //E置高电平

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

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

}

/*==================================================

函数功能:对LCD的显示模式进行初始化设置

==================================================*/

void LcdInitiate(void)

{

delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间

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

delay(5); //延时5ms,给硬件一点反应时间

WriteInstruction(0x38);

delay(5);

WriteInstruction(0x38); //连续三次,确保初始化成功

delay(5);

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

delay(5);

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

delay(5);

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

delay(5);


}

/*==================================================

函数功能:显示小时、调整小时时间

==================================================*/

void DisplayHour()

{

unsigned char i,j;

if(k1==0) //按钮k1按下时

delay(10); //延时消抖

if(k1==0) //判断k1按下

{

while(!k1); //k1状态取反

h++; //小时数增加

}

if(k2==0) //按钮k2按下时

delay(10); //延时消抖

if(k2==0) //




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义