C51做闹钟:用1602显示时间,到点时间,蜂鸣器响或者灯亮,按K4停止
小灯亮
#include <reg51.h>
sbit k4=P3^3;
sbit led = P2^1;
sbit rs=P2^6;
sbit rw=P2^5;
sbit e=P2^7;
char flag=0,count=0;
int miao = 57;
int fen = 59;
int shi = 6;
void delayms(int ms);
bit check_busy();
void lcdcom(unsigned char com);
void lcddat(unsigned char dat);
void main()
{
lcdcom(0x01);//清屏
lcdcom(0x06);//光标右移,地址自动加1
lcdcom(0x0e);//显示开,有光标,光标不闪烁
lcdcom(0x38);//8位数据总线,2行显示,5*7点阵
lcdcom(0x80);
lcddat('t');
lcddat('i');
lcddat('m');
lcddat('e');
lcddat(':');
TMOD = 0X01; //定时器0 工作方式为1,16位定时器
TH0 = 0X3C;
TL0=0xB0;//定时器50ms,设置初始值
ET0=1; //打开定时器0的中断开关(允许定时器0中断)
EA=1; //总中断打开
TR0=1; //启动定时器0
while(1)
{
lcdcom(0xc6);
lcddat(0+0x30);
lcddat(shi%10+0x30);
lcddat(':');
lcddat(fen/10+0x30);
lcddat(fen%10+0x30);
lcddat(':');
lcddat(miao/10+0x30);
lcddat(miao%10+0x30);
if(shi==7&&fen==0&&miao==0)
{ flag==1 ;
led =0;
}
if (k4==0)
{flag =0; led=1;}
while(k4==0);
delayms(10);
IE0=0;
}
}
void time0() interrupt 1
{
TH0 = 0X3C;
TL0=0XB0; //定时器50ms,初始的的值
count++;
if(count ==20)
{
miao++;
count=0;
if(miao==60)
{
fen ++;
miao=0;
}
if(fen==60)
{
shi++;
fen =0;
miao =0;
}
}
}
void delayms(int ms)
{ int i,j;
for(j=0;j<ms;j++)
for(i=0;i<180;i++);
}
bit check_busy()
{ bit stat;
rs=0;//读状态
rw=1;//读有效
e=0;
delayms(1);
e=1;
delayms(1);
stat=P0&0x80;
e=0;
delayms(1);
return stat;
}
void lcdcom(unsigned char com)
{ while( check_busy());
rs=0;//写指令
rw=0;//写有效
e=0;
delayms(1);
P0=com; //指令,此时1602并不接收
e=1; //产生下降沿,1602接收指令
delayms(1);
e=0;
delayms(1);
}
void lcddat(unsigned char dat)
{ while( check_busy());
rs=1;//写数据
rw=0;//写有效
e=0;
delayms(1);
P0=dat; //数据,此时1602并不接收
e=1; //产生下降沿,1602接收数据
delayms(1);
e=0;
delayms(1);
}
蜂鸣器响
#include <reg51.h>
sbit k4=P3^3;
sbit led = P2^1;
sbit rs=P2^6;
sbit rw=P2^5;
sbit e=P2^7;
char flag=0,count=0;
char i;
int miao = 58;
int fen = 59;
int shi = 6;
sbit beep=P1^5;//定义蜂鸣器的引脚
void delayms(int ms);
bit check_busy();
void lcdcom(unsigned char com);
void lcddat(unsigned char dat);
void main()
{
lcdcom(0x01);//清屏
lcdcom(0x06);//光标右移,地址自动加1
lcdcom(0x0e);//显示开,有光标,光标不闪烁
lcdcom(0x38);//8位数据总线,2行显示,5*7点阵
lcdcom(0x80);
lcddat('t');
lcddat('i');
lcddat('m');
lcddat('e');
lcddat(':');
TMOD = 0X01; //定时器0 工作方式为1,16位定时器
TH0 = 0X3C;
TL0=0xB0;//定时器50ms,设置初始值
ET0=1; //打开定时器0的中断开关(允许定时器0中断)
EA=1; //总中断打开
TR0=1; //启动定时器0
while(1)
{
lcdcom(0xc6);
lcddat(0+0x30);
lcddat(shi%10+0x30);
lcddat(':');
lcddat(fen/10+0x30);
lcddat(fen%10+0x30);
lcddat(':');
lcddat(miao/10+0x30);
lcddat(miao%10+0x30);
if( k4==0)
{
delayms(1);
flag=0;
while(k4==0);
delayms(1);
}
}
}
void time0() interrupt 1
{
TH0 = 0X3C;
TL0=0XB0; //定时器50ms,初始的的值
count++;
if(count ==20)
{
miao++;
count=0;
if(miao==60)
{
fen ++;
miao++;
}
if(fen==60)
{
shi++;
fen =0;
miao =0;
}
}
if(shi==7&&fen==0&&miao==0)
flag=1 ;
if (flag ==1) beep=~beep;
}
void delayms(int ms)
{ int i,j;
for(j=0;j<ms;j++)
for(i=0;i<60;i++);
}
bit check_busy()
{ bit stat;
rs=0;//读状态
rw=1;//读有效
e=0;
delayms(1);
e=1;
delayms(1);
stat=P0&0x80;
e=0;
delayms(1);
return stat;
}
void lcdcom(unsigned char com)
{ while( check_busy());
rs=0;//写指令
rw=0;//写有效
e=0;
delayms(1);
P0=com; //指令,此时1602并不接收
e=1; //产生下降沿,1602接收指令
delayms(1);
e=0;
delayms(1);
}
void lcddat(unsigned char dat)
{ while( check_busy());
rs=1;//写数据
rw=0;//写有效
e=0;
delayms(1);
P0=dat; //数据,此时1602并不接收
e=1; //产生下降沿,1602接收数据
delayms(1);
e=0;
delayms(1);
}
蜂鸣器的用法:
beep 是P1^5引脚,给高低电频(自定义脉冲信号)使蜂鸣器响起,
给低电平就响,高电平不响。
如果蜂鸣器的声音过小时,Because 是程序中的延迟时间过长。
这时需要延迟时间缩短,尽量减少用while循环。
如果有帮助的话,请点个赞~~~