- UID
- 195693
- 阅读权限
- 30
- 推广
-
- 幽默
-
- 注册时间
- 2011-5-10
- 最后登录
- 1970-1-1
|
注册家电维修技术论坛,与同行畅聊维修技术,享更多技术论坛功能。
您需要 登录 才可以下载或查看,没有帐号?快速注册
x
二进制时钟
#include<reg52.h>
sbit key1= P3^1; //秒、分、时间的切换键
sbit key2 =P3^2 ; //加1
sbit key3 =P3^3 ; //减1
sbit speaker=P3^7;
unsigned char count1=0 ;
/****************************************************/
unsigned char hour = 11, min = 0,sec = 0; //时钟赋初值
/******************T0__50mS中断程序*******************/
void T0_1s(void) interrupt 1 // 50mS中断程序
{
static unsigned char count = 0;
TR0 = 0;
TH0 = (65536 - 50000 ) / 256; //设置T0初始值为:15536
TL0 = (65536 - 50000 ) % 256; //记数为50000次//50000*1us=50ms*20=1s
TR0 = 1;
count++;
if(count == 20) //中断服务程序
{ //定时1s时间到(需要中断20次)
count = 0;
sec++;
if(sec==60) //1分钟时间到
{
sec=0;
min++;
if(min==60) //1小时时间到
{
min=0;
hour++;
if(hour==12) //24小时时间到
{
sec =0;
min =0;
hour=0;
}
}
}
}
}
/*************************************************************
void delay_5ms() //动态扫描显示--软件延时
{
unsigned char i,j;
for(i=0;i<20;i++)
for(j=0;j<50;j++) //50
;
}
***************************************************************/
void disp_led()
{
/****************显示时钟 ******************************/
P1=~(((hour/10<<4)|(hour%10))); //显示时钟
P2=~(((min/10<<4)|(min%10))); //显示分钟
P0=~(((sec/10<<4)|(sec%10))); //显示秒
}
/*******************闹钟程序****************************/
void clock()
{ unsigned int i;
if(hour==8 && min==0 && sec==0)
{ speaker=0;
for(i=0;i<500;i++) //15秒蜂鸣器
{
disp_led();
}
speaker=1;
}
}
/*********************蜂鸣器按键声*****************************/
void speak()
{ unsigned char m;
speaker=0;
for(m=0;m<3;m++)
{
disp_led();
}
speaker=1;
}
/********************按键扫描程序***************************/
void delay_10ms() //键盘去抖动--软件延时
{
unsigned char i,j;
for(i=0;i<20;i++)
for(j=0;j<40;j++)
;
}
/*******************调时钟按键扫描*******************************/
void key_scan() //键盘扫描子程序
{
if(key1==0) //检测是否有键按下
{
delay_10ms(); //去抖动延时
if(key1==0) //再次确认否有键按下
{ { speak();
count1++; //切换次数
TR0=0; //关计时
ET0=0;
}
if(count1==4)
{ count1=0; //到4次后重新记
TR0=1; //开计时
ET0=1;
}
}
while(key1==0) disp_led(); //等待按键释放,并且调用显示程序
}
if(count1==1)
{ if(key2==0) //调整秒钟加//检测是否有键按下
{
delay_10ms(); //去抖动延时
if(key2==0) //再次确认否有键按下
{ speak(); //按键声
sec++;
if(sec==60) sec=0;
}
while(key2==0) disp_led(); //等待按键释放,并且调用显示程序
}
if(key3==0) //调整秒钟减//检测是否有键按下
{
delay_10ms(); //去抖动延时
if(key3==0) //再次确认否有键按下
{ speak();
sec--;
if(sec==-1) sec=59;
}
while(key3==0) disp_led(); //等待按键释放,并且调用显示程序
}
}
if(count1==2)
{
if(key2==0) //调整分钟加//检测是否有键按下
{
delay_10ms(); //去抖动延时
if(key2==0) //再次确认否有键按下
{ speak();
min++;
if(min==60) min=0;
}
while(key2==0) disp_led(); //等待按键释放,并且调用显示程序
}
if(key3==0) //调整分钟减//检测是否有键按下
{
delay_10ms(); //去抖动延时
if(key3==0) //再次确认否有键按下
{ speak();
min--;
if(min==-1) min=59;
}
while(key3==0) disp_led(); //等待按键释放,并且调用显示程序
}
}
if(count1==3)
{ if(key2==0) //调整小时加//检测是否有键按下
{
delay_10ms(); //去抖动延时
if(key2==0) //再次确认否有键按下
{ speak();
hour++;
if(hour==12)
{ hour=0;
min=0;
sec=0;
}
}
while(key2==0) disp_led(); //等待按键释放,并且调用显示程序
}
if(key3==0) //调整小时减//检测是否有键按下
{
delay_10ms(); //去抖动延时
if(key3==0) //再次确认否有键按下
{ speak();
hour--;
if(hour==-1) hour=11;
}
while(key3==0) disp_led(); //等待按键释放,并且调用显示程序
}
}
}
/*********************主函数***********************/
void main()
{
TMOD = 0x01;
TH0 = (65536 - 50000 ) / 256; //设置T0初始值
TL0 = (65536 - 50000 ) % 256;
ET0 = 1; //开中断
EA = 1; //开CPU
TR0 = 1; //开定时
while(1)
{
disp_led(); //时钟显示
key_scan(); //时钟扫描
clock(); //闹钟
}
}
/***********************************************************/ |
-
|