51数码时钟(调时闪烁,闹钟音乐两只老虎,闹钟时间互不影响)
#include <reg52.h>
#include "./delay/delay.h"
#define SEGPORT P0
sbit bit_select = P2^0;
sbit seg_select = P2^1;
sbit key1 = P1^0; //暂停和终止
sbit key2 = P1^1; 复位
sbit key3 = P1^2; 移位
sbit key4 = P1^3; //改时间
sbit key5 = P1^4; //调时间
sbit key6 = P1^5; //开关闹钟
sbit beep = P3^7;
sbit led= P3^6; //闹钟开启LED小灯便亮
unsigned char duanma[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char bitdata[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code freq[][2]={
0xD8,0xF7,//00440HZ 1
0xBD,0xF8,//00494HZ 2
0x87,0xF9,//00554HZ 3
0xE4,0xF9,//00587HZ 4
0x90,0xFA,//00659HZ 5
0x29,0xFB,//00740HZ 6
0xB1,0xFB,//00831HZ 7
0xEF,0xFB,//00880HZ `1
};
code unsigned char my_music[32] ={1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,4,3,1,5,6,5,4,3,1,1,5,1,1,5,1};
unsigned char High;
unsigned char Low;
unsigned char tempdata[8]; //当前时间数组
unsigned char clock_tempdata[8]; //闹钟时间数组
unsigned char tmp_i = 1; //数码管扫描到第几个
unsigned char flag1 = 0; //按键1:按一次取反(0或1)
unsigned char flag2 = 0; //按键5:按一次取反(0或1)调闹钟时间和看闹钟时间
unsigned char flag3 = 0; //按键6:按一次取反(0或1)开关闹钟
unsigned char shi = 0,fen = 0,miao = 0;
unsigned char clock_shi =0,clock_fen = 0,clock_miao = 0;
void display()
{
static unsigned char i = 0;
static unsigned char num = 0;
SEGPORT = 0x0;
seg_select = 1;
seg_select = 0;
SEGPORT = 0xff;
bit_select = 1;
bit_select = 0;
if(flag2 == 0)
{
if(i == tmp_i && flag1 == 1)
{
SEGPORT = bitdata[i]; //位选
bit_select = 1;
bit_select = 0;
if(num < 35)
{
SEGPORT = 0x00;
seg_select = 1;
seg_select = 0;
num++;
}
else if(70 > num)
{
SEGPORT = tempdata[i];
seg_select = 1;
seg_select = 0;
num++;
}
if(70 == num)
{
num = 0;
}
}
else
{
SEGPORT = tempdata[i];
seg_select = 1;
seg_select = 0;
SEGPORT = bitdata[i];
bit_select = 1;
bit_select = 0;
}
i++;
if(8 == i)
{
i = 0;
}
}
else
{
if(i == tmp_i && flag2 == 1)
{
SEGPORT = bitdata[i]; //位选
bit_select = 1;
bit_select = 0;
if(num < 35)
{
SEGPORT = 0x00;
seg_select = 1;
seg_select = 0;
num++;
}
else if(70 > num)
{
SEGPORT = clock_tempdata[i];
seg_select = 1;
seg_select = 0;
num++;
}
if(70 == num)
{
num = 0;
}
}
else
{
SEGPORT = clock_tempdata[i];
seg_select = 1;
seg_select = 0;
SEGPORT = bitdata[i];
bit_select = 1;
bit_select = 0;
}
i++;
if(8 == i)
{
i = 0;
}
}
}
//--------------------------------------------------------------------------------------------------------------------------------------
void change_time()
{
tempdata[0] = duanma[shi / 10];
tempdata[1] = duanma[shi % 10];
tempdata[2] = 0x40;
tempdata[3] = duanma[fen / 10];
tempdata[4] = duanma[fen % 10];
tempdata[5] = 0x40;
tempdata[6] = duanma[miao / 10];
tempdata[7] = duanma[miao % 10];
}
void timer0_init ()
{
EA = 1;
TMOD |= 0x01;
TH0 = (65536 - 2000) / 256;
TL0 = (65536 - 2000) % 256;
ET0 = 1;
TR0 = 1;
}
void timer0_isr() interrupt 1
{
static unsigned char i = 0;
static unsigned char k = 0;
TH0 = (65536 - 2000) / 256;
TL0 = (65536 - 2000) % 256;
k++;
display();
if(k == 10)
{
k = 0;
i++;
}
if( 50 == i)
{
i = 0;
miao++;
if(60 == miao)
{
miao = 0;
fen++;
if(60 == fen)
{
fen = 0;
shi++;
if(24 == shi)
{
shi = 0;
fen = 0;
miao = 0;
}
}
}
}
change_time();
}
void timer1_init(void)
{
EA = 1;
TMOD |= 0x10;
TH1 = 0;
TL1 = 0;
ET1 = 1;
TR1 = 0;
}
void timer1_isr() interrupt 3
{
TH1 = High;
TL1 = Low;
beep = ~beep;
}
void main()
{
unsigned char i = 0;
unsigned char num = 0;
timer0_init();
timer1_init();
while(1)
{
//-----------------------------------------------------------------------------------------------------------------------------------
if(0 == key1) //按键1:时间暂停和开始,以及改时间
{
delay_ms(10);
if(0 == key1)
{
delay_ms(10);
if(0 == key1)
{
while(!key1);
delay_ms(10);
while(!key1);
if(flag1 == 0)
{
flag1 = 1;
}
else
{
flag1 = 0;
}
}
}
}
//-----------------------------------------------------------------------------------------------------------------------------------
if(0 == key2) //按键2:复位
{
delay_ms(10);
if(0 == key2)
{
delay_ms(10);
if(0 == key2)
{
while(!key1);
delay_ms(10);
while(!key1);
miao = 0;
fen = 0;
shi = 0;
change_time();
}
}
}
//-----------------------------------------------------------------------------------------------------------------------------------
if(0 == key3 && (1==flag1 || 1 == flag2)) //按键3:往右移位
{
delay_ms(10);
if(0 == key3)
{
delay_ms(10);
if(0 == key3)
{
while(!key3);
delay_ms(10);
while(!key3);
if(tmp_i == 1 || tmp_i == 4)
{
tmp_i = tmp_i + 2;
}
else
{
tmp_i++;
}
if(tmp_i == 8)
{
tmp_i = 0;
}
}
}
}
//-----------------------------------------------------------------------------------------------------------------------------------
if(0 == key4 && 1==flag1 && 0 == flag2) //按键4改时钟时间
{
delay_ms(10);
if(0 == key4)
{
delay_ms(10);
if(0 == key4)
{
while(!key4);
delay_ms(10);
while(!key4);
switch(tmp_i)
{
case 1:
{
shi = (shi + 1) % 24;
tempdata[0] = duanma[shi / 10];
break;
}
case 3:
{
fen = (fen + 10) % 60;
break;
}
case 4:
{
fen = (fen + 1) % 60;
if(fen % 10 == 0)
{
fen = fen - 10;
}
break;
}
case 6:
{
miao = (miao + 10) % 60;
break;
}
case 7:
{
miao = (miao + 1) % 60;
if(miao % 10 == 0)
{
miao = miao - 10;
}
break;
}
default:break;
}
change_time();
}
}
}
//-----------------------------------------------------------------------------------------------------------------------------------
if(0 == key4 && 0==flag1 && 1 == flag2) //按键4:时间加
{
delay_ms(10);
if(0 == key4)
{
delay_ms(10);
if(0 == key4)
{
while(!key4);
delay_ms(10);
while(!key4);
switch(tmp_i)
{
case 1:
{
clock_shi = (clock_shi + 1) % 24;
clock_tempdata[0] = duanma[clock_shi / 10];
break;
}
case 3:
{
clock_fen = (clock_fen + 10) % 60;
break;
}
case 4:
{
clock_fen = (clock_fen + 1) % 60;
if(clock_fen % 10 == 0)
{
clock_fen = clock_fen - 10;
}
break;
}
case 6:
{
clock_miao = (clock_miao + 10) % 60;
break;
}
case 7:
{
clock_miao = (clock_miao + 1) % 60;
if(clock_miao % 10 == 0)
{
clock_miao = clock_miao - 10;
}
break;
}
default:break;
}
clock_tempdata[0] = duanma[clock_shi / 10];
clock_tempdata[1] = duanma[clock_shi % 10];
clock_tempdata[2] = 0x40;
clock_tempdata[3] = duanma[clock_fen / 10];
clock_tempdata[4] = duanma[clock_fen % 10];
clock_tempdata[5] = 0x40;
clock_tempdata[6] = duanma[clock_miao / 10];
clock_tempdata[7] = duanma[clock_miao % 10];
}
}
}
//-----------------------------------------------------------------------------------------------------------------------------------
if(0 == key5) //按键5调闹钟时间
{
delay_ms(10);
if(0 == key5)
{
delay_ms(10);
if(0 == key5)
{
while(!key5);
delay_ms(10);
while(!key5);
if(flag2 == 0)
{
flag2 = 1;
clock_tempdata[0] = duanma[clock_shi / 10];
clock_tempdata[1] = duanma[clock_shi % 10];
clock_tempdata[2] = 0x40;
clock_tempdata[3] = duanma[clock_fen / 10];
clock_tempdata[4] = duanma[clock_fen % 10];
clock_tempdata[5] = 0x40;
clock_tempdata[6] = duanma[clock_miao / 10];
clock_tempdata[7] = duanma[clock_miao % 10];
}
else
{
flag2 = 0;
}
}
}
}
//-----------------------------------------------------------------------------------------------------------------------------------
if(0 == key6) //按键6:开启闹钟
{
delay_ms(10);
if(0 == key6)
{
delay_ms(10);
if(0 == key6)
{
while(!key6);
delay_ms(10);
while(!key6);
if(flag3 == 0)
{
led = 0;
flag3 = 1;
}
else
{
led = 1;
flag3 = 0;
}
}
}
}
//-----------------------------------------------------------------------------------------------------------------------------------
if(shi == clock_shi && fen == clock_fen && miao == clock_miao && flag3 == 1) //闹钟开启
{
while(flag3 == 1)
{
for(i = 0;i < 32 && flag3 == 1;i++)
{
num = my_music[i];
High = freq[num - 1][1];
Low = freq[num - 1][0];
TR1 = 1;
delay_ms(200);
delay_ms(200);
TR1 = 0;
delay_ms(20);
if(0 == key6) //按键6关闭闹钟
{
delay_ms(10);
if(0 == key6)
{
delay_ms(10);
if(0 == key6)
{
while(!key6);
delay_ms(10);
while(!key6);
if(flag3 == 0)
{
led = 0;
flag3 = 1;
}
else
{
led = 1;
flag3 = 0;
}
}
}
}
}
}
}
}
}
51数码时钟(调时闪烁,闹钟音乐两只老虎,闹钟时间互不影响)相关推荐
- Python“制作”midi音乐“两只老虎”
从网上找了很多谱子,可惜没有音乐细胞看不太懂,根据自己的理解改了好几遍,还是听不出来"两只老虎"的感觉,于是在标题上加了双引号.这样的话就只能了解本文思路了,算是抛砖引玉吧,重点是 ...
- 计算机谭音乐两只老虎,Arduino播放音乐《两只老虎》完整代码-测试有效.docx
Arduino播放音乐<两只老虎>完整代码 [测试有效才发布的] #define C_0 -1 #define C_1 262 #define C_2 294 #define C_3 33 ...
- 计算机打音乐两只老虎,两只老虎(音乐、汇编程序)
/* 程序效果:蜂鸣器发出两只老虎的音律 */ ORG 0000H AJMP START ORG 000BH AJMP TIM0 ORG 0030H START: MOV TMOD,#01H ...
- 单片机数字钟(调时,调时闪烁,万年历,年月日)超详细解析
2019/07/13 单片机数字钟(调时,调时闪烁,万年历,年月日)超详细解析 发表日期:2019/07/13 单片机开发板:巫妖王2.0, 使用同款开发板可直接上板测试 文档说明: 实现功能 : 一 ...
- 51单片机两只老虎c语言程序,51单片机两只老虎仿真加代码
/*************************************************************************** 程序名称:program4-1.c 程序功能: ...
- FPGA实现蜂鸣器播放音乐实验,以儿歌《两只老虎》为例
** FPGA实现蜂鸣器播放音乐 ** 实现功能: 开发板上电后,通过蜂鸣器播放<两只老虎>. 设计思路 原理:想要让蜂鸣器播放音乐,就需要知道每个音符的频率,再通过换算将频率转换为周期, ...
- 51单片机两只老虎 c语言,基于51单片机做音乐盒(两只老虎)
/********************************************************************************* 项目:音频音乐盒 设计时间:201 ...
- 音乐程序——两只老虎
对照音符和发音频率(Hz)的对应关系,将曲谱翻译作程序中需要的数据,演奏出音乐来 低音符 频率 中音符 频率 高音符 频率 1 138 1 262 1 ...
- 定时器的实战--数码时钟
定时器的作用:规定每隔多少时间会做某个事情. 1.开启定时器: setInterval(函数,间隔时间):等一秒中才会执行,间隔型,一旦启动便不会停止. setTimeout(函数,间隔时间):延时型 ...
最新文章
- SAP 序列号与库存关联起来?
- 开发时,尤其是最初的版本,只要保持有80%的功能即可
- 【SPOJ】Count On A Tree II(树上莫队)
- 在Ubuntu上安装openResty #1
- 除了鸿蒙还注册,除了“华为鸿蒙”,你不知道的是,整本山海经都被华为注册了...
- sklearn.naive_bayes
- 指令级并行--计算机体系结构
- 谷歌发布android+8.2,谷歌Pixel 2代三款新机齐曝光:骁龙835+Android 8.0
- 8086简单的指令流水线_在8086微处理器中执行流水线的指令和概念的步骤
- 全球首富贝索斯离婚第二天 出轨对象女主播宣布离婚...
- A - ACM Computer Factory - poj 3436(最大流)
- Winform 初识记录
- 杭电计算机专业第五轮评估,第五轮学科评估要来了!这些双非学科有机会冲击A级,入股不亏!...
- 手机电子书分享:大前研一经典《专业主义》
- 计算机睡眠和休眠哪个更好,电脑睡眠和休眠哪个好 有什么区别
- 技术日记2021/2/12 “牛气飞天”恶作剧
- 前端问题记录(持续更新...)
- android spannablestring设置字体颜色,Android SpannableString设置超链接、颜色、字体等属性...
- 私有协议的解密游戏:从秘文到明文
- 从顶级黑客到上市公司老板
热门文章
- 图像地点场景类型识别(PlaceCNN)实践
- ​​​​​​​深度学习在场景文字识别技术中的应用综述
- Citus 11 for Postgres 完全开源,可从任何节点查询(Citus 官方博客)
- 【Ubuntu】Ubuntu 20.04安装
- 天蓝网页游戏多开脚本制作系列教程
- 无线移动通信中的多普勒效应及其消除方法
- 把上面的苹果咬掉一口,再打印
- 美国爱达荷州劳工部系统遭黑 超17万人求职数据被盗
- linux手机刷机包制作工具_LINUX操作系统手机刷机包制作、修改方法
- Lab3因而起——对正则表达式的学习(二)