1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 单片机c语言按键调整时钟 关于单片机电子时钟按键部分(调时间的)如何设计...

单片机c语言按键调整时钟 关于单片机电子时钟按键部分(调时间的)如何设计...

时间:2022-05-25 03:23:20

相关推荐

单片机c语言按键调整时钟 关于单片机电子时钟按键部分(调时间的)如何设计...

给你一个示例参考

//实验平台:TX-1C开发板(板子上是有源蜂鸣器,程序按无源编写的,不影响正常使用)

//K1键调整选择,K2键+,长按连+,K3键-,长按连-,K4键闹钟设置

//定时器初始化程序根据晶振频率选择

//用计数法代替软件延时,提高走时精度

//数码管采用分时动态显示,约2ms显示1位

#include

#define uint unsigned int

#define uchar unsigned char

#define key_S 300 //宏定义短按(约20ms)

#define key_L 6000//宏定义长按(约2/3s)

#define key_M 3000//宏定义长按(约1/3s)

sbit K1 = P3^4; //调整选择/退出

sbit K2 = P3^5; //++,长按连+

sbit K3 = P3^6; //--,长按连-

sbit K4 = P3^7; //调整时间

sbit dula=P2^6; //段选

sbit wela=P2^7; //位选

sbit allow=P2^5; //LED使能

sbit Buzzer=P2^3; //蜂鸣器

uchar code table[]={//0~F数组

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

uint Cnt200us; //定义200微秒变量

uchar hour=12,min=0,sec=0; //定义时、分、秒变量

uchar hour4=0,min4=0;//定义闹钟时、分变量

ucharChoice=0,Choice4=0; //调整走时的选择变量、设置闹钟的选择变量

bit Buzzer_sign; //蜂鸣器闹钟标志

bit Twinkle,second=1;//闪烁标志、秒标志

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

定时器0/1初始化程序 @12.000MHz

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

/*

void Timer0Init(void)

{

TMOD= 0x22; //设置定时器模式

TL0 = 0x38; //设置定时初值200微秒

TH0 = 0x38; //设置定时重载值200微秒

TL1 = 0x06; //设置定时初值250微秒

TH1 = 0x06; //设置定时初值250微秒

TR0 = 1; //定时器0开始计时

// TR1 = 1; //定时器1开始计时

EA=1; //开总中断

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

ET1=1; //开定时器1中断

}

*/

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

定时器0/1初始化程序 @11.0592MHz

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

void Timer_Init()

{

TMOD = 0x22;//设置自动重载模式

TL0 = 0x48; //设置定时初值200微秒

TH0 = 0x48; //设置定时重载值200微秒

TL1 = 0x1A; //设置定时初值250微秒

TH1 = 0x1A; //设置定时重载值250微秒

TR0 = 1; //定时器0开始计时

// TR1 = 1; //定时器1开始计时

EA=1; //开总中断

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

ET1=1; //开定时器1中断

}

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

按键扫描程序

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

void key_scan()

{

static bit key1_sign,key4_sign; //按键自锁标志变量

static uint count1,count2,count3=0,count4=0;//消抖计数变量

if(!K1) //检测按键1按下

{

count1++;//消抖计数1自+1

if((count1>=key_S)&&(key1_sign==0))//检测消抖计数与按键1自锁标志

{

key1_sign=1; //按键1自锁标志置1

Choice++;//调整选择变量自+1

if(Choice>=4) //调整时间选择0正常走时,1调时,2调分,3调秒

{

Choice=0; //调整时间选择清0

TF0=0;//定时器溢出标志TF0清0

Cnt200us=0; //时间变量Cnt200us自+1

}

}

}

else

{

key1_sign=0;//按键1自锁标志清0

count1=0;//消抖计数count1清0

}

if(!K2)

{

count2++;

if(count2>=key_L) //长按快调

{

if(Choice==1) //选择变量1调时

{

hour++;

if(hour>=24)

hour=0;

}

if(Choice==2) //选择变量2调分

{

min++;

if(min>=60)

min=0;

}

if(Choice==3) //选择变量3调秒

{

sec++;

if(sec>=60)

sec=0;

}

if(Choice4==1) //选择变量1调时

{

hour4++;

if(hour4>=24)

hour4=0;

}

if(Choice4==2) //选择变量2调分

{

min4++;

if(min4>=60)

min4=0;

}

count2=key_M;

}

}

else //按键抬起

{

if(count2>key_S && count2

{

if(Choice==1) //选择变量1调时

{

hour++;

if(hour>=24)

hour=0;

}

if(Choice==2) //选择变量2调分

{

min++;

if(min>=60)

min=0;

}

if(Choice==3) //选择变量3调秒

{

sec++;

if(sec>=60)

sec=0;

}

if(Choice4==1) //选择变量1调时

{

hour4++;

if(hour4>=24)

hour4=0;

}

if(Choice4==2) //选择变量2调分

{

min4++;

if(min4>=60)

min4=0;

}

}

count2=0;//count2清0

}

if(!K3)

{

count3++;

if(count3>=key_L) //长按

{

if(Choice==1) //选择变量

{

hour--;

if(hour>=24)

hour=23;

}

if(Choice==2) //选择变量

{

min--;

if(min>=60)

min=59;

}

if(Choice==3) //选择变量

{

sec--;

if(sec>=60)

sec=59;

}

if(Choice4==1) //选择变量

{

hour4--;

if(hour4>=24)

hour4=23;

}

if(Choice4==2) //选择变量

{

min4--;

if(min4>=60)

min4=59;

}

count3=key_M;

}

}

else //按键抬起

{

if(count3>key_S && count3

{

if(Choice==1) //选择变量

{

hour--;

if(hour>=24)

hour=23;

}

if(Choice==2) //选择变量

{

min--;

if(min>=60)

min=59;

}

if(Choice==3) //选择变量

{

sec--;

if(sec>=60)

sec=59;

}

if(Choice4==1) //选择变量

{

hour4--;

if(hour4>=24)

hour4=23;

}

if(Choice4==2) //选择变量

{

min4--;

if(min4>=60)

min4=59;

}

}

count3=0;//count3清0

}

if(!K4) //检测按键1按下

{

count4++;//消抖计数1自+1

if((count4>=key_S)&&(key4_sign==0))//检测消抖计数与按键1自锁标志

{

key4_sign=1; //按键1自锁标志置1

Choice4++;//调整选择变量自+1

if(Choice4>=4) //调整闹钟时间选择0闹钟关闭,1调时,2调分,3开启闹钟

{

Choice4=0; //调整时间选择清0

}

}

}

else

{

key4_sign=0;//按键1自锁标志清0

count4=0;//消抖计数count1清0

}

}

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

数码管显示程序

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

void display()

{

static uchar num=0;//分时显示变量

if((Choice4>0)&&(Choice4<3))//闹钟设置显示部分

{

P0=0x00; //消隐

dula=1;

dula=0;

switch(num)

{

case 0:

P0=0x7e; //时十位位码

wela=1;

wela=0;

P0=table[hour4/10]; //时十位段码

dula=1;

dula=0;

num++;

break;

case 1:

P0=0x7d; //时个位位码

wela=1;

wela=0;

if((Twinkle==1)&&(Choice4==1))//时点闪烁

P0=table[hour4%10];

else

P0=table[hour4%10]|0x80;//时个位段码+点

dula=1;

dula=0;

num++;

break;

case 2:

P0=0x7b; //分十位位码

wela=1;

wela=0;

P0=table[min4/10]; //分十位段码

dula=1;

dula=0;

num++;

break;

case 3:

P0=0x77; //分个位位码

wela=1;

wela=0;

if((Twinkle==1)&&(Choice4==2))//分点闪烁

P0=table[min4%10];

else

P0=table[min4%10]|0x80;//分个位段码+点

dula=1;

dula=0;

num++;

break;

case 4:

P0=0xef; //秒十位位码

wela=1;

wela=0;

P0=0x40; //秒十位段码

dula=1;

dula=0;

num++;

break;

case 5:

P0=0xdf; //秒个位位码

wela=1;

wela=0;

P0=0x40; //秒个位段码

dula=1;

dula=0;

num=0;

break;

}

}

else //正常走时显示部分

{

P0=0x00; //消隐

dula=1;

dula=0;

switch(num)

{

case 0:

P0=0x7e; //时十位位码

wela=1;

wela=0;

P0=table[hour/10]; //时十位段码

dula=1;

dula=0;

num++;

break;

case 1:

P0=0x7d; //时个位位码

wela=1;

wela=0;

if((Twinkle==1)&&(Choice==1))//时点闪烁

P0=table[hour%10];

else

P0=table[hour%10]|0x80;//时个位段码+点

dula=1;

dula=0;

num++;

break;

case 2:

P0=0x7b; //分十位位码

wela=1;

wela=0;

P0=table[min/10]; //分十位段码

dula=1;

dula=0;

num++;

break;

case 3:

P0=0x77; //分个位位码

wela=1;

wela=0;

if((Twinkle==1)&&(Choice==2))//分点闪烁

P0=table[min%10];

else

P0=table[min%10]|0x80;//分个位段码+点

dula=1;

dula=0;

num++;

break;

case 4:

P0=0xef; //秒十位位码

wela=1;

wela=0;

P0=table[sec/10]; //秒十位段码

dula=1;

dula=0;

num++;

break;

case 5:

P0=0xdf; //秒个位位码

wela=1;

wela=0;

if(Choice4==3)

P0=table[sec%10]|0x80;//闹钟启动后秒个位+点

else if((Twinkle==1)&&(Choice==3))//秒点闪烁+点

P0=table[sec%10]|0x80;

else

P0=table[sec%10];//秒个位段码

dula=1;

dula=0;

num=0;

break;

}

}

}

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

闹钟程序

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

void Buzzer_nz()

{

if((Choice4==3)&&(hour4==hour)&&(min4==min)&&(sec<30))

Buzzer_sign=1;

else Buzzer_sign=0;

if((second==1)&&(Buzzer_sign==1)) //计时周期1s

{

TR1 = 1;//定时器1开,蜂鸣器响一下

second=0;//定时周期1s变量清0

}

}

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

主程序

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

void main(void)

{

Timer_Init();//初始化定时器

allow=0; //关闭LED

while(1)

{

key_scan();//按键扫描

display();//显示

Buzzer_nz();//闹钟

}

}

/*-----------------------------

定时器0中断服务程序200微秒

------------------------------*/

void timer0() interrupt 1

{

Cnt200us++;//时间变量Cnt200us自+1

if((Cnt200us>1250 && Cnt200us<2500)||(Cnt200us>3750 && Cnt200us<5000))//闪烁频率2Hz

Twinkle=1;//闪烁标志

else Twinkle=0;

if(Cnt200us>=4991)//在此可以调整精度

{

Cnt200us=0;//变量Cnt200us清0

second=1;

if(Choice!=3) //调整选择变量为3停止走秒

sec++;//秒自+1

if(sec>=60)//如果秒>=60

{

sec=0;//秒清0

min++;//分自+1

if(min>=60) //分>=60

{

min=0; //分清0

hour++; //小时自+1

if(hour>=24) //小时>=24

hour=0; //小时清0

}

}

}

}

/*-----------------------------

定时器1中断服务程序250微秒

(无源蜂鸣器驱动程序)

------------------------------*/

void timer1() interrupt 3

{

static uint count3=0; //中断计数变量

count3++; //中断计数变量count3自+1

Buzzer=~Buzzer;//蜂鸣器端口取反

if(count3>=500)//0.1秒时间到500

{

count3=0;//计数清0

Buzzer=1;//蜂鸣器端口清0

TR1 = 0; //定时器1关闭

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。