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

程序功能:在8个数码管上显示时间(24小时制),包含时、分、秒各2位,共6位,时分秒之间
用短横隔开,可以使用按键对各位进行调时校准,被调整的那位所对应的数码管会闪烁,被调整的
位循环方向可以左移也可以右移,调整的数值可加可减。  
***************************************************************************************/

#include "reg52.h"
typedef unsigned int u16;  //对数据类型进行声明定义
typedef unsigned char u8;

#define GPIO_KEY P1

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 KeyValue; //用来存放按键扫描读取到的键值

//预设时间各位数值,这里设置23:59:55是为了尽快观察进制变化是否正常
u8 a=2;     //小时,十位
u8 b=3;     //小时,个位
u8 c=5; //分钟,十位
u8 d=9; //分钟,个位
u8 e=5; //秒,十位
u8 f=5; //秒,个位

u16 smgwei[8]={2,3,10,5,9,10,5,5};//8位数码管对应的段码,10在smgduan数组中对应smgduan[10]=0x40,显示到数码管上是中间的一短横

u8 setwei=0; //调整时间各位的位置参数,默认为0,即不调整任何位。
u16 times[8];//循环次数累计,累计指令条数,粗略估算时间,控制被调整位闪烁频率。

u8 code smgduan[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//数码管段选,显示0~9的值
0x40};//0x40数码管显示是短横

void delay(u16 i)  //延时子函数
{
while(i--);
}

void sub()      //调整时间数值,数值减小
{
switch(setwei)   //先判断调整时间中的哪一位,然后被选中位的数值自减
{ //减法可能越界,所以需要根据不同各位的进制来控制越界
case(1):smgwei[0]--;if(smgwei[0]==-1) smgwei[0]=2;break;
case(2):smgwei[1]--;if(smgwei[0]==0&&smgwei[1]==-1) 
{smgwei[1]=3;smgwei[0]=2;}
else if(smgwei[1]==-1)  
{smgwei[1]=9;smgwei[0]--; }
break;
case(3):;break;
case(4):smgwei[3]--;if(smgwei[3]==-1) {smgwei[3]=5;smgwei[1]--;}break;
case(5):smgwei[4]--;if(smgwei[4]==-1) {smgwei[4]=9;smgwei[3]--;}break;
case(6):;break;
case(7):smgwei[6]--;if(smgwei[6]==-1) {smgwei[6]=5;smgwei[4]--;}break;
case(8):smgwei[7]--;if(smgwei[7]==-1) {smgwei[7]=9;smgwei[6]--;}break;
}
}

void add()      //调整时间数值,数值增大
{
switch(setwei) //和减法类似,也是先判断被选中的位。再修改其值。
{ //不过加法的越界问题在main秒数递增进位过程中处理了
case(1):smgwei[0]++;break;
case(2):smgwei[1]++;break;
case(3):;break;
case(4):smgwei[3]++;break;
case(5):smgwei[4]++;break;
case(6):;break;
case(7):smgwei[6]++;break;
case(8):smgwei[7]++;break;
}
}

//4*4矩阵键盘按键扫描,因为需用到4个按键,所以让每一列的按键控制同一功能
void KEY_Scan()
{
char k=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//读取按键是否按下
{
delay(1000);//延时10ms进行消抖
if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
{
//测试列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}

while((k<50)&&(GPIO_KEY!=0x0f)) //按键松手检测
{
delay(10000);
k++;
}

switch(KeyValue)
{ //被调整位的值也需要控制越界
case(0):setwei--;if(setwei==-1)  setwei=8; break;
case(1):setwei++;if(setwei==9) setwei=0;   break;
case(2):sub();break;
case(3):add();break;
}
}
}
}

void Timer0Init()
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}

//数码管动态显示函数
void show()   //修改后数码管显示函数
{
u8 j;
P2|=0x1c;   //8个数码管 ,使用for循环,轮流选通这8个数码管并传送不同的数据给P0
for (j=0;j<8;j++)
{ //同时根据条件,选择数码管常亮或者闪烁
P2+=4;
P0=(setwei==(j+1)&&times[j]>500)?0x00:smgduan[smgwei[j]];
times[j]++; 
if (times[j]>1000) times[j]=0;    
delay(10);P0=0x00;
}
}
// void show()   //修改前的数码管显示子函数
// {
// LSA=0;LSB=0;LSC=0;  
// P0=(setwei==1&&times[0]>500)?0x00:smgduan[a];
// times[0]++; 
// if (times[0]>1000) times[0]=0;    
// delay(10);P0=0x00;
// LSA=1;LSB=0;LSC=0;  
// P0=(setwei==2&&times[1]>500)?0x00:smgduan[b];
// times[1]++; 
// if (times[1]>1000) times[1]=0;
// delay(10);P0=0x00;
// LSA=0;LSB=1;LSC=0;   
// P0=0X40;
// delay(10);P0=0x00;
// LSA=1;LSB=1;LSC=0;  
// P0=(setwei==3&&times[2]>300)?0x00:smgduan[c];
// times[2]++; 
// if (times[2]>600) times[2]=0;
// delay(10);P0=0x00;  
// LSA=0;LSB=0;LSC=1;   
// P0=(setwei==4&&times[3]>300)?0x00:smgduan[d];
// times[3]++; 
// if (times[3]>600) times[3]=0;
// delay(10);P0=0x00;
// LSA=1;LSB=0;LSC=1;  
// P0=0X40;
// delay(10);P0=0x00;
// LSA=0;LSB=1;LSC=1;  
// P0=(setwei==5&&times[4]>100)?0x00:smgduan[e];
// times[4]++; 
// if (times[4]>200) times[4]=0;
// delay(10);P0=0x00;
// LSA=1;LSB=1;LSC=1;  
// P0=(setwei==6&&times[5]>100)?0x00:smgduan[f];
// times[5]++; 
// if (times[5]>200) times[5]=0;
// delay(10);P0=0x00;
// }

void main()
{
Timer0Init();  //定时器0初始化
while(1)
{ KEY_Scan(); //扫描是否有调时按键按下 
//由于秒数自加,需根据进制不同选择判断条件和对应操作
if(smgwei[7]==10) {smgwei[7]=0;smgwei[6]+=1;}
if(smgwei[6]==6) {smgwei[6]=0;smgwei[4]+=1;}
if(smgwei[4]==10) {smgwei[4]=0;smgwei[3]+=1;}
if(smgwei[3]==6) {smgwei[3]=0;smgwei[1]+=1;}
if(smgwei[1]==10) {smgwei[1]=0;smgwei[0]+=1;}
if((smgwei[0]*10+smgwei[1])>=24) {smgwei[0]=0;smgwei[1]=0;} 
show();
}
}

void Timer0() interrupt 1
{
static u16 i;
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
i++;
if(i==1000)
{
i=0;
smgwei[7]++;
}
}

51单片机调时电子钟相关推荐

  1. 51单片机c语言电子钟(已加入调时 '整点报时功能1),51单片机c语言电子钟(已加入调时、闹铃、整点报时功能1)万年历2...

    51单片机c语言电子钟(已加入调时.闹铃.整点报时功能1)万年历2 51单片机c语言电子钟(已加入调时.闹铃.整点报时功能1)万年历1 ·一个固定数组 ·时钟,秒表,日历,闹钟 */ #include ...

  2. 时钟加闹钟c语言程序,51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)...

    <51单片机c语言电子钟(已加入调时.闹铃.整点报时功能)>由会员分享,可在线阅读,更多相关<51单片机c语言电子钟(已加入调时.闹铃.整点报时功能)(13页珍藏版)>请在技术 ...

  3. 基于51单片机的DS12C887电子钟万年历带农历温度

    基于51单片机的DS12C887电子钟万年历( proteus仿真+程序+讲解视频) 仿真图proteus 7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0028 ...

  4. 基于51单片机的数字电子钟万年历闰年判断闹钟设计

    基于51单片机的数字电子钟万年历闰年判断闹钟设计 视频 1 开发环境 2 功能说明介绍 3 仿真图 4 程序 5 原理图 6 视频讲解 7 设计报告 7.1 设计目的 7.2 概述 8 资料清单下载链 ...

  5. 基于51单片机的数字电子钟

    目录 摘  要 1.课程设计任务 1.1课程设计题目 1.2设计的要求 2.设计总体方案 2.1初步设计方案 2.2芯片的选型 2.2.1时钟芯片的选择 2.2.2温度传感器的选择 2.2.3显示电路 ...

  6. 基于51单片机的LCD电子钟设计

    代码部分 /16电子信息工程 1班 项目:基于51单片机的LCD电子钟设计/ #include<reg52.h> #define uchar unsigned char #define u ...

  7. 基于51单片机的LCD1602电子钟闹钟proteus仿真设计

    本设计是基于51单片机的LCD1602电子钟闹钟proteus仿真设计 源码+仿真+原理图+器件清单 仿真软件版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 编 ...

  8. 单片机c语言怎样设置闹钟,51单片机c语言电子钟(已加入调时、闹铃、整点报时功能).doc...

    #include#define uchar unsigned char #define uint unsigned int /*七段共阴管显示定义*/ //此表为 LED 的字模, 共阴数码管 0-9 ...

  9. 单片机简易电子钟设计c语言,基于51单片机的简易电子钟设计

    单片机实现电子钟主要有两种方案.一种是利用单片机内部的定时/计数器产生标准秒信号,并根据时间系统的进位原则进行加1调整.另一种方法是为单片机配置一片可独立走时的实时钟(RTC)芯片,单片机通过串行信号 ...

最新文章

  1. 下载perl的mysql模块_安装用于操作MySQL的Perl模块
  2. 一些比较好的设计网站的收藏
  3. 图的基本算法实现(邻接矩阵与邻接表两种方法)
  4. Citrix Provisioning Services 7.13企业实战
  5. DS之信息挖掘:利用pandas库统计某一列col中各个值出现的次数(降序输出)
  6. mysql怎么写Connection_MySQL里面的CONNECTION_ID
  7. dojo Quick Start/dojo入门手册--package机制
  8. 政府门户网站建设解决方案
  9. [网络安全自学篇] 五十一.恶意样本分析之HGZ进程和网络行为动态分析及防御
  10. python 通信中间件_apachemiddleware-有用的Python中间件,用于mod\wsgi部署-James Gardner 0.1.1 0.1.0...
  11. hdu 2553 N皇后问题 搜索 回溯法
  12. fh 幅频特性曲线怎么画fl_初学者怎么练习线条?教你如何画出流畅线条的技巧...
  13. 做系统ghost步骤图解_u盘装系统步骤
  14. angualr Http error处理
  15. python复数类型及其特点和分布地区_各种气候类型及其特点、分布规律、主要分布地区、数值特征...
  16. 金融工程 | 远期与期货的运用
  17. 微信授权扫码点餐-新特性React16
  18. C语言试题164之求定积分
  19. lua脚本加密,lua代码加密使用说明
  20. 昭通计算机一级b考试试题及答案,2022云南昭通事业单位考试综合应用能力(B类)考试如何备考?...

热门文章

  1. 出海品牌如何做好海外网红营销?
  2. java企业面试填空题_Java企业面试题填空题及答案
  3. Unity11 灯光与烘培、摄像机、音频组件、视频组件
  4. 工具篇Flair之训练模型教程
  5. 程序员不要通过进国企来幻想自己能逃过中年危机
  6. 面试官:你谈一谈什么是接口测试?怎样做接口测试?这样回答让他竖起大拇指!
  7. 搭建win10家庭服务器,不是翻墙!是私有云!
  8. 2022年尼龙PPA市场前景分析及研究报告
  9. 交换机基本配置——实验
  10. 梦幻江湖java_梦幻江湖BT增值版