#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数码时钟(调时闪烁,闹钟音乐两只老虎,闹钟时间互不影响)相关推荐

  1. Python“制作”midi音乐“两只老虎”

    从网上找了很多谱子,可惜没有音乐细胞看不太懂,根据自己的理解改了好几遍,还是听不出来"两只老虎"的感觉,于是在标题上加了双引号.这样的话就只能了解本文思路了,算是抛砖引玉吧,重点是 ...

  2. 计算机谭音乐两只老虎,Arduino播放音乐《两只老虎》完整代码-测试有效.docx

    Arduino播放音乐<两只老虎>完整代码 [测试有效才发布的] #define C_0 -1 #define C_1 262 #define C_2 294 #define C_3 33 ...

  3. 计算机打音乐两只老虎,两只老虎(音乐、汇编程序)

    /* 程序效果:蜂鸣器发出两只老虎的音律 */ ORG 0000H AJMP START ORG 000BH AJMP TIM0 ORG 0030H START:     MOV TMOD,#01H ...

  4. 单片机数字钟(调时,调时闪烁,万年历,年月日)超详细解析

    2019/07/13 单片机数字钟(调时,调时闪烁,万年历,年月日)超详细解析 发表日期:2019/07/13 单片机开发板:巫妖王2.0, 使用同款开发板可直接上板测试 文档说明: 实现功能 : 一 ...

  5. 51单片机两只老虎c语言程序,51单片机两只老虎仿真加代码

    /*************************************************************************** 程序名称:program4-1.c 程序功能: ...

  6. FPGA实现蜂鸣器播放音乐实验,以儿歌《两只老虎》为例

    ** FPGA实现蜂鸣器播放音乐 ** 实现功能: 开发板上电后,通过蜂鸣器播放<两只老虎>. 设计思路 原理:想要让蜂鸣器播放音乐,就需要知道每个音符的频率,再通过换算将频率转换为周期, ...

  7. 51单片机两只老虎 c语言,基于51单片机做音乐盒(两只老虎)

    /********************************************************************************* 项目:音频音乐盒 设计时间:201 ...

  8. 音乐程序——两只老虎

    对照音符和发音频率(Hz)的对应关系,将曲谱翻译作程序中需要的数据,演奏出音乐来 低音符  频率 中音符  频率 高音符  频率 1         138 1           262 1    ...

  9. 定时器的实战--数码时钟

    定时器的作用:规定每隔多少时间会做某个事情. 1.开启定时器: setInterval(函数,间隔时间):等一秒中才会执行,间隔型,一旦启动便不会停止. setTimeout(函数,间隔时间):延时型 ...

最新文章

  1. SAP 序列号与库存关联起来?
  2. 开发时,尤其是最初的版本,只要保持有80%的功能即可
  3. 【SPOJ】Count On A Tree II(树上莫队)
  4. 在Ubuntu上安装openResty #1
  5. 除了鸿蒙还注册,除了“华为鸿蒙”,你不知道的是,整本山海经都被华为注册了...
  6. sklearn.naive_bayes
  7. 指令级并行--计算机体系结构
  8. 谷歌发布android+8.2,谷歌Pixel 2代三款新机齐曝光:骁龙835+Android 8.0
  9. 8086简单的指令流水线_在8086微处理器中执行流水线的指令和概念的步骤
  10. 全球首富贝索斯离婚第二天 出轨对象女主播宣布离婚...
  11. A - ACM Computer Factory - poj 3436(最大流)
  12. Winform 初识记录
  13. 杭电计算机专业第五轮评估,第五轮学科评估要来了!这些双非学科有机会冲击A级,入股不亏!...
  14. 手机电子书分享:大前研一经典《专业主义》
  15. 计算机睡眠和休眠哪个更好,电脑睡眠和休眠哪个好 有什么区别
  16. 技术日记2021/2/12 “牛气飞天”恶作剧
  17. 前端问题记录(持续更新...)
  18. android spannablestring设置字体颜色,Android SpannableString设置超链接、颜色、字体等属性...
  19. 私有协议的解密游戏:从秘文到明文
  20. 从顶级黑客到上市公司老板

热门文章

  1. 图像地点场景类型识别(PlaceCNN)实践
  2. ​​​​​​​深度学习在场景文字识别技术中的应用综述
  3. Citus 11 for Postgres 完全开源,可从任何节点查询(Citus 官方博客)
  4. 【Ubuntu】Ubuntu 20.04安装
  5. 天蓝网页游戏多开脚本制作系列教程
  6. 无线移动通信中的多普勒效应及其消除方法
  7. 把上面的苹果咬掉一口,再打印
  8. 美国爱达荷州劳工部系统遭黑 超17万人求职数据被盗
  9. linux手机刷机包制作工具_LINUX操作系统手机刷机包制作、修改方法
  10. Lab3因而起——对正则表达式的学习(二)