给你一个示例参考

//实验平台: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;                                //定义闹钟时、分变量

uchar  Choice=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关闭

}

}

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

  1. 单片机c语言24小时的计时程序框图,电子时钟单片机课程设计(WIT)要点解析.doc

    电气信息学院 单片机原理及应用课程设计报告 课题名称 电子时钟的设计 专业班级 电气自动化 学 号 学生姓名 指导教师 评 分 2014年12月22日至12月28日答辩记录 1.例举设计过程中遇到的问 ...

  2. 电子时钟单片机c语言程序,一款51单片机电子钟制作(C语言)

    //主程序/ void main()//主程序开始 { chushi();//初始化 while(1)//大循环 { if(g!=1)//如果g不等于1,就执行下一句,否则跳过下一句 disy(fen ...

  3. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》...

    引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...

  4. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》... 1

    引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...

  5. 单片机c语言电梯程序设计,基于51单片机的模拟电梯控制系统设计.doc

    摘要:本文介绍了一种电梯模拟控制系统,包括怎样利用对STC89C52进行编程从而对电梯实现自由控制的方式.该系统采用了STC89C52芯片进行控制,用单片机进行编程,能实现的功能非常多而且方便设计,并 ...

  6. 单片机c语言编程教学大纲,2014《单片机原理及应用》课程教学大纲.doc

    <单片机原理及应用>课程教学大纲 第一部分 大纲说明 一.课程的性质.目的与任务 <单片机原理及应用>是计算机科学与技术.计算机应用技术.电子信息工程专业的专业课.本课程是以M ...

  7. 单片机c语言程序设计叶俊明,单片机C语言程序设计

    本书的主要内容有51单片机的芯片引脚和*小系统.Keil C51编写软件与Proteus仿真软件的使用.C51语言.51单片机的基础实践.51单片机的中断系统.51单片机常见的接口电路以及十个实验例子 ...

  8. 单片机c语言篮球比分_基于单片机的篮球比赛计时计分器的设计

    摘 要:本系统是采用单片机AT89C51作为本设计的核心原件.利用7段共阴LED作为显示器件.在此设计中共接入了2个7段共阴LED显示器,用于记录得分和比赛时间,显示范围可以达到0到99分,基本满足赛 ...

  9. 单片机c语言 王东锋,基于51单片机的输液报警系统设计

    高扬 摘 要:本设计是以AT89C51单片机为核心,利用光电传感器来检测设备液体的流动情况.当吊瓶内有点滴落下时,可通过红外检测装 1前言 随着信息技术和计算机技术的发展,信息革命在工业.医疗和控制领 ...

  10. 单片机c语言编程编码器数值,基于单片机的光电编码器测速报告详解.doc

    课程设计报告 课程名称: 微机原理课程设计 题 目: 基于51单片机的光电编码器测速 摘要 光电编码器是高精度位置控制系统常用的一种位移检测传感器.在位置控制系统中,由于电机既可能正转,也可能反转,所 ...

最新文章

  1. handlebars.js 用 br替换掉 内容的换行符
  2. 计算机安装与维修 等级,电脑升级究竟要怎么升级?维修多年的老师傅说出其中答案!...
  3. diff 比较两个文件的差异
  4. 字符串匹配问题(信息学奥赛一本通-T1355)
  5. Pandas列百分数转化为小数
  6. 十二月无书稿,总个结(2011)
  7. C++新特性探究(一):nullptr
  8. Serve Django Applications with uWSGI and Nginx
  9. 现在人真的很奇怪,看见有钱人点头哈腰
  10. 对C语言实验报告的建议,c语言实验报告.docx
  11. Android空调遥控器代码,空调代码—万能遥控器要如何正确设置空调代码?
  12. 仿真的硬件选型原则:CPU
  13. 如何使用ffmpeg下载腾讯课堂视频(亲自多次尝试有效)
  14. HDU1862 FLY
  15. 荐书丨10 本豆瓣高分技术图书,强烈推荐!
  16. js html监听ctrl v,js监听组合按键
  17. jekyll-paginate 缺失
  18. Burp Suite安装配置详解(附Java 环境安装)
  19. FreeRTOS 任务简介
  20. c++之 std::tie

热门文章

  1. 2022-07-9 第七小组 wly html学习笔记
  2. studio64给项目提供网络权限_九龙商业中心电能管理系统项目小结
  3. Android 媒体库图片,音频,视频,文件的查询
  4. 光谱拟合辅助工具ASERA的安装
  5. go orm框架对比
  6. 安装 ubuntu后选择拼音输入法设置
  7. Flink模拟天猫双十一实时统计系统
  8. C#彩信接口开发经验及具体开发实现
  9. Real-Time Rendering——9.9.2 Scale of Subsurface Scattering and Roughness地下散射和粗糙度的标度
  10. 支付宝踩过的坑sign check fail: check Sign and Data Fail��JSON also��