利用独立键盘,数码管完成一个简易的时钟,按键一可以修改时间,按键二可以设置闹钟,按键三进行加一操作,按键四进行减一操作。

主函数:

void main()
{bsp_init();while(1){TimeTim();              //正常时间在走bsp_KeyScan();          //键盘扫描看哪个功能键被按下bsp_KeyProc(keyvalue);  //根据键值进行相应的功能处理 SetValueShow();         //数码管上显示的值ShowSegCC();            //显示在数码管上bsp_CheckAlarm();       //闹钟检查}
}

时钟模块:

unsigned char hour = 2, min = 2, sec = 3;       //设置时间初值
unsigned char ahour = 0, amin = 0, asec = 0;    //设置闹钟初值
unsigned char time = 0;void delay_us(unsigned char t)
{while(--t);
}void delay_ms(unsigned int t)   //t最大为255
{while(t--){delay_us(245);delay_us(245);}
}void TimeTim()
{if(settype == 0 && alarmvalue == 0)     //当不在闹钟状态也不在修改时间状态的时候时间正常走{if(count == 20){count = 0;sec++;if(sec == 60){sec = 0;min++;if(min == 60){min = 0;hour++;if(hour == 24){hour = 0;}}}}}
}//检查时间是否到了闹钟时间
void bsp_CheckAlarm(void)
{if((hour == ahour) && (min == amin) && (sec == asec)){hour = 0;min = 0;sec = 0;}
}

键盘模块:

sbit SETTIME = P0^0;    //修改时间
sbit SETALARM = P0^1;   //设置闹钟
sbit INC = P0^2;        //加1
sbit DEC = P0^3;        //减1unsigned char keyvalue = 0;
unsigned char settype = 0;      //0是初始状态正常显示,1是修改秒,2是修改分,3是修改时
unsigned char alarmvalue = 0;   //0是初始状态,1是修改秒,2是修改分,3是修改时void bsp_KeyScan(void)
{if(SETTIME == 0)//K1按键被按下{keyvalue = 1;while(!SETTIME);//等待按键释放} if(SETALARM == 0){keyvalue = 2;while(!SETALARM);}if(INC == 0){keyvalue = 3;while(!INC);}if(DEC == 0){keyvalue = 4;while(!DEC);}
}void bsp_KeyProc(unsigned char keyv)
{if(keyv == 1){settype++;if(settype == 4){settype = 0;}keyvalue = 0;    //键值要清0!!!}if(keyv == 2){alarmvalue++;if(alarmvalue == 4){alarmvalue = 0;}keyvalue = 0;}if(keyv == 3){timeadd();keyvalue = 0;}if(keyv == 4){timedec();keyvalue = 0;}
}void timeadd()
{//设置时间加1if(settype == 1){if(sec < 59){sec++;}else{sec = 0;}}else if(settype == 2){if(min < 59){min++;}else{min = 0;}}else if(settype == 3){if(hour < 23){hour++;}else{hour = 0;}}//设置闹钟加1 if(alarmvalue == 1){if(asec < 59){asec++;}else{asec = 0;}}else if(alarmvalue == 2){if(amin < 59){amin++;}else{amin = 0;}}else if(alarmvalue == 3){if(ahour < 23){ahour++;}else{ahour = 0;}}
}void timedec()
{//设置时钟减1if(settype == 1){if(sec > 0){sec--;}else{sec = 59;}}else if(settype == 2){if(min > 0){min--;}else{min = 59;}}else if(settype == 3){if(hour > 0){hour--;}else{hour = 23;}}//设置闹钟减1if(alarmvalue == 1){if(asec > 0){asec--;}else{asec = 59;}}else if(alarmvalue == 2){if(amin > 0){amin--;}else{amin = 59;}}else if(alarmvalue == 3){if(ahour > 0){ahour--;}else{ahour = 23;}}
}

数码管模块:

#define SEGPORT P1
sbit WEI = P2^1;
sbit DUAN = P2^0;unsigned char code TableCA[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};  //共阳数码管段选码表,无小数点
unsigned char code TableSel[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//共阴数码管位选码表
unsigned char code TableCC[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴数码管段选码表,无小数点
unsigned char Show[8] = {0};
//unsigned int showvalue = 0;
//unsigned int time = 0;void ShowSegCA(unsigned char t)
{SEGPORT = TableCA[t];
}
//1到255显示
void ShowSegCC(void)
{static unsigned char i = 0;//消隐SEGPORT = 0x00;DUAN = 1;DUAN = 0;//选通位码WEI = 1;SEGPORT = TableSel[i];WEI = 0;//选通位码DUAN = 1;SEGPORT = Show[i];DUAN = 0;i++;if(i == 8){i = 0;}delay_ms(1);
}   void SetValueShow(void)
{if(alarmvalue == 0) //当不在闹钟状态时数码管显示正常的时间{Show[0] = TableCC[hour/10];if(settype == 3)Show[1] = TableCC[hour%10] | 0x80;elseShow[1] = TableCC[hour%10];Show[2] = 0x40;Show[3] = TableCC[min/10];if(settype == 2)Show[4] = TableCC[min%10] | 0x80;elseShow[4] = TableCC[min%10];Show[5] = 0x40;Show[6] = TableCC[sec/10];if(settype == 1)Show[7] = TableCC[sec%10] | 0x80;elseShow[7] = TableCC[sec%10];}//在闹钟状态数码管显示闹钟设置的时间else{Show[0] = TableCC[ahour/10];if(alarmvalue == 3)Show[1] = TableCC[ahour%10] | 0x80;elseShow[1] = TableCC[ahour%10];Show[2] = 0x40;Show[3] = TableCC[amin/10];if(alarmvalue == 2)Show[4] = TableCC[amin%10] | 0x80;elseShow[4] = TableCC[amin%10];Show[5] = 0x40;Show[6] = TableCC[asec/10];if(alarmvalue == 1)Show[7] = TableCC[asec%10] | 0x80;elseShow[7] = TableCC[asec%10];}
}

定时器模块:

unsigned char count = 0;
void Timer0_Init(void)
{TMOD |= 0x01;TH0 = (65536 - 50000)/256;TL0 = (65536 - 50000)%256;EA = 1;ET0 = 1;TR0 = 1;
}void Timer0(void) interrupt 1
{TH0 = (65536 - 50000)/256;TL0 = (65536 - 50000)%256;count++;
}

利用51单片机做一个简易时钟相关推荐

  1. 物联网名词和MQTT解释,阿里云的教程:用51单片机做一个物联网温度计+远程开关

    https://mvp.aliyun.com/zhidao/1915 本章主要介绍物联网平台中相关的产品名词.明白名词说的是啥.两眼不慌慌.看看官方文档吧 concent   报文连接服务器      ...

  2. 利用51单片机制作一个秒表的详细过程

    利用51单片机制作一个秒表的详细过程 前面的话: 和很多朋友一样,在学51单片机的过程中我们肯定会涉及到制作一个秒表,牵涉到把单片机的多个部分组合起来使用,这对于我们初学者来说可能显得有些困难,我同大 ...

  3. 从0-1,用51单片机做一个积分计时器,以乒乓球为例

    前面可能有点啰嗦,可以直接跳到第四部分 一.设计目标 二.规则须知 (一)乒乓球计分规则 (二)乒乓球T2赛制 (三)乒乓球换位与交换场地 三.需求分析 1.计分功能 2.误触功能 3.满分功能 4. ...

  4. 用51单片机做一个物联网温度计+远程开关

    一 故事背景 1,对物联网技术感兴趣的朋友想玩一些物联网应用练练手,这个正好合适. 2,刚毕业的萌新或者还没有毕业的青年男女,想学习物联网知识,这个适合你练手. 3,已经入坑单片机开发很久的工程师,想 ...

  5. 51单片机做一个计时器

    同样我们使用的仍然是STC的8051单片机,这段代码是用来做一个计时器,通过数码管实时显示出来,因为板子上数码管有6个,所以可以设置小时,分钟,秒三个单位,在Proteus上也是可以模拟的,计时结束可 ...

  6. 利用51单片机统计脉冲个数,即时输出显示

    ;利用51单片机设计一个计数显示系统,要求8个数码管显示T1输入脉冲的个数. ;最好用汇编语言,加注释,尽量别太复杂.尽量快些哈! ;悬赏分:30 | 解决时间:2011-7-20 19:15 | ; ...

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

    基于51单片机的数字电子时钟 单片机课程设计要求使用51单片机完成一个电子时钟,要求满足基本功能的同时增添丰富的功能参考了很多大佬的方案代码才勉强完成,工程文件下载点击此链接欢迎交流.如遇下载问题可以 ...

  8. 使用51单片机和DS1302时钟芯片做一个简易的电子时钟

    简易的电子时钟实验 一.前言 二.DS1302模块介绍 三.驱动DS1302的代码 3.1 初始化DS1302时钟芯片 3.2 读取DS1302时钟芯片的时间 3.3 设置DS1302时钟芯片的时间 ...

  9. 51单片机+ds1302+lcd1602简易电子时钟(带闹钟功能)

    51单片机+ds1302+lcd1602简易电子时钟(带闹钟功能) AT89C52.LCD1602.DS1302.speaker. Proteus仿真 实例代码 #include<reg52.H ...

最新文章

  1. SAP PM 初级系列15 - IW33事务代码界面里查看维修工单对应的维修通知单的几个方法
  2. C# SQLite数据库 访问封装类
  3. 使用mybatis向oracle数据库插入数据异常
  4. c java 异常_javac -version 异常
  5. zabbix3.2监控mysql_zabbix3.2监控MYSQL状态
  6. Win10最常用的快捷键,效率Max提高100%(常用的应该是最全的)
  7. Android-入门学习笔记-使用 CursorLoader 加载数据
  8. codevs2171 棋盘覆盖
  9. 操作系统中死锁避免算法 --- 银行家算法
  10. linux平台C++开发基本知识
  11. 负载均衡研究 基础
  12. 助力小程序生态发展 “小程序生态孵化社区”成立
  13. 深度学习需要掌握的 13 个概率分布
  14. linux ftp命令参数全集
  15. 求1+2阶乘+3阶乘+ 省略 +20阶乘的和
  16. Zemax学习笔记(5)- 设计单透镜实例_2,分析
  17. Adobe 软件清理工具AdobeCreativeCloudCleanerTool.exe
  18. 怎么压缩图片大小?这些压缩方法值得收藏
  19. 浅谈面向对象和面向过程
  20. 药王修美乐黄金单品战法

热门文章

  1. 将网页内容保存为本地html方便解析
  2. 2021年高处安装、维护、拆除考试资料及高处安装、维护、拆除模拟考试题
  3. 高职高考数学可以用计算机吗,高职高考数学蒙题技巧!99%考生适用!
  4. 财务数据分析怎么做?财务公司应用方案
  5. 浅析量子技术在军事领域的应用
  6. 基于javaweb的宠物医院管理系统设计和实现(java+springboot+ssm+mysql+jsp)
  7. win7小工具打不开_强大图片素描化工具 FotoSketcher 3.4
  8. 初学者:使用Google Chrome浏览器的StumbleUpon发现新网站
  9. 中软国际实习学习第九天
  10. spock测试_用Spock测试AKKA应用程序