整个名容易 整个名容易
关注数: 24 粉丝数: 455 发帖数: 4,329 关注贴吧数: 18
计算两年之间的闰年个数 最近偶然翻出几年前的一段代码,当时是为了做一个电子钟写的代码,代码的主要作用是计算两年之间的闰年个数 当时的代码是这样写的: #define RunNian(a)((a%4==0)&&(a%100))||(a%400==0)>0? 1:0 unsigned int NumberEfLeapYear1(unsigned int year1,unsigned int year2) { unsigned int i; unsigned int con=0; if((year1==0)&&(year2==0)) return 0; if(year2<year1) return 0; for(i=year1;i<year2;i++) { if( RunNian(i) ) { con++; } } if (year1 == 0) con--; return con ; } 解决的问题的方法简单粗暴,就是通过循环累加两年之间闰年,程序当时运行也没有什么问题,就一直这样用,今天在看到这段代码的时候,就一个感觉, 效率低下。 于是就想通过算法的方式解决问题,通过网络搜索,结果很不满意,于是通过苦苦思索,终于找到了计算方法 #define RunNian(a)((a%4==0)&&(a%100))||(a%400==0)>0? 1:0 unsigned int NumberEfLeapYear1(unsigned int year1,unsigned int year2) { unsigned int a,b; if((year1==0)&&(year2==0)) return 0; year2 --;//不算最后一年 if(year2<year1) return 0; a = year1/4-year1/100+year1/400; b = year2/4-year2/100+year2/400; if(year1!=0) { if (RunNian(year1)) return b-a+1; } return b-a; } 思路是这样的,计算0年至每一年的之间的闰年个数,然后相减,差就是两年之间的闰年个数, 那么代码结果正确吗? 我写了一段代码验证一下 int main (void) { int a,b,c,d; int i,n; a = 0; b = 2200; for (n=a ; n<=b ; n++) { for (i=n ; i<=b ; i++) { c = NumberEfLeapYear(n,i); d = NumberEfLeapYear1(n,i); if (c != d) { printf ("n=%d,i=%d\n",n,i); printf ("end!\n"); printf ("c=%d ",c); printf ("d=%d\n",d); break; } } if(c!=d) break; } if((n==b+1) && (i==b+1)) printf ("ok!\n"); return 0; }结果完全正确 比较一下效率 int main (void) { int a,b,c,d; int i,n; a = 0; b = 9999; for (n=a ; n<=b ; n++) { for (i=n ; i<=b ; i++) { c = NumberEfLeapYear1(n,i); } } return 0; } 累加函数时间跑完0~9999年耗时5.612S 改成计算函数仅耗时0.7384S 相差很悬殊 看来算法真的很重要
MIUI 第206周更新公告 小米平板暂停发布 2014-0 小米平板因临时修复,发布延迟,具体发布时间请关注更新公告 MIUI 6 小米2/2S 特别版绚丽发布,测试期间如遇任何问题,请前往 MIUI论坛反馈 本周全机型开发版刷机推荐度:69% 请在Wifi环境下观看,土豪请随意 适配机型: MIUI支持 小米手机4 / 小米手机3 / 红米NOTE / 红米手机 / 小米手机2/2S / 小米手机2A / 小米手机1/1S / Galaxy S4 / Galaxy S3 / Galaxy S2/ Galaxy Note II / Galaxy Nexus / HTC One X / HTC One / OPPO Find 5 / 魅族MX2 / 努比亚Z5s/mini / Google Nexus 7 II / Google Nexus 5 / 一加手机 / Galaxy S4 I9500 等229款手机和平板,查看全部机型 升级说明: 1. MIUI V5 / MIUI 6开发版可以直接 OTA 升级(方法:系统更新 - 检查更新 - 选择最新版本升级) 2. 较老版本的 MIUI 可通过刷 MIUI V5 / MIUI 6 最新完整包快速升级(方法:小米手机可通过系统更新 - Menu - 选择安装包进行升级,第三方机型需手动进入 Recovery 选择完整包进行升级) 3. 跨版本进行升级时(如稳定版刷开发版)尽量清除所有数据,以避免因数据冲突出现个例问题;清除数据前务必主动备份数据,以免丢失(方法:设置 - 备份和重置 - 本地备份) 4. 其它品牌手机首次刷 MIUI ROM 请严格按照刷机教程进行刷机 更新日志: 【本周推荐】 新增 浏览器书签云备份以及云同步 新增 浏览器将网址转换为二维码的功能 新增 音乐歌曲列表中,正在播放的歌曲的波形条动画 新增 小米生活新增最方便的电影选座(支持自动选座和连排选座模式) 优化 文件管理器优化了首页样式 优化 主题搜索体验,增加主题搜索热词、搜索建议等 【系统】 新增 小米平板升级MIUI 6 修复 QQ语音通话无法切换到外放的问题 修复 某些手机在升级4.8.27版本后,经常发生掉线的问题 【短信】 修复 短信发送失败的图标显示问题 【主题】 修复 某些情况下点击“主题试用”按钮、错误弹出“购买”浮层的问题 【音乐】 新增 首页底部播放条上下滑动时的切换动画 新增 空白页样式 新增 “正在播放”页的进入、退出动画 新增 歌曲列表中,正在播放的歌曲的波形条动画 新增 睡眠模式(个人设置、播放页) 优化 “发现音乐”点击歌单的进入、退出动画 优化 正在播放页封面切换动画 优化 首页专题的错层动画 【系统更新】 修复 某些情况下,无法升级的问题 【文件管理器】 优化 首页样式 【浏览器】 新增 书签云备份以及云同步 新增 将网址转换为二维码的功能 【时钟/计算器】 优化 闹钟、世界时钟、计时器的弹窗样式 优化 闹钟页面的样式调整 优化 时钟的启动速度 修复 某些情况下,时钟表盘动画卡顿的问题 【视频】 修复 部分视频不能正常播放的问题 【小米生活】 新增 最方便的电影选座(支持自动选座和连排选座模式) 【小米云服务】 修复 某些情况下导致崩溃的问题 点击左下角【阅读原文】进入论坛参与互动 ↓↓↓↓↓ 阅读原文阅读 65233 举报
发一个音乐代码通用程序,可以不用软件转码,就能播放音乐 好多人都希望用单片机做音乐卡,今天心血来潮,写了段代码,实现播放音乐,当然,程序是可以通用的,程序可以很便的更换不同的音乐。下面给出代码与仿真原理图。#include <REGX52.H> unsigned char T_H0,T_L0;//用于存储重记时,用于改变频率 //频率发生函数 bit Out;//当Out为1时输出为0时不输出 //定义音阶表 #define L +0 #define N +7 #define H +14 #define I +21 unsigned int code yinjiebiao[] = { 0xF117,//L1,131 0xF2B6,//L2,147 0xF429,//L3,165 0xF4D6,//L4,175 0xF608,//L5,196 0xF71F,//L6,220 0xF817,//L7,247 0xF88B,//N1,262 0xF966,//N2,296 0xFA14,//N3,330 0xFA67,//N4,349 0xFB04,//N5,392 0xFB8F,//N6,440 0xFC0B,//N7,494 0xFC43,//H1,523 0xFCAC,//H2,587 0xFD09,//H3,659 0xFD33,//H4,698 0xFD82,//H5,784 0xFDC7,//H6,880 0xFE05,//H7,988 0xFE22,//I1,1047 0xFE56,//I2,1175 0xFE84,//I3,1319 0xFE9A,//I4,1397 0xFEC1,//I5,1568 0xFEE3,//I6,1760 0xFF02,//I7,1976 }; /********************************************* 创建定时器事件 **/ unsigned char Timer1; unsigned char Timer1_con;//定时器到时间计数 unsigned char Timer1_Interval;//创建一个定时器事件 /*******************************************/ void InitTimer0(void)//初始化定时器0 { TMOD |= 0x11; TH0 = 0xFB; TL0 = 0x90+10;//黑认重复在C,频率440Hz ET0 = 1; TR0 = 1; // PT0 = 1; } void InitTimer1(void)//初始化定时器1 { TMOD |= 0x11; TH1 = 0xFC; TL1 = 0x18; ET1 = 1; TR1 = 1; } /******************************************************************************************************************/ //音乐表 //第一们表示墨认节拍 unsigned char code shengrikuaile[] = {//生日快乐 50,5,5,6,5,1N,7,0,5,5,6,5,2N,1N,0,5,5,5N,3N,1N,7,6,4N,4N,3N,1N,2N,1N,255 }; //unsigned char code congerfei[]= {//虫儿飞 //50,3N,3N,3N,4N,5N,3N,75,2N,75,1N,1N,1N,2N,3N,3N,7L,6L,3N,2N,75,6L,3N,2N,75,6L,3N,2N,1N,255 //}; unsigned char code yinyue1[] = { 50,1,2,3,4,255,5,6,7,1N,2N,3N,4N,5N,6N,7N,1H,2H,3H,4H,5H,6H,7H,255 }; unsigned char T1n; unsigned char *p; bit jiezou; void Timer1_Time(void)//定时器事件,用于产生音乐 { if(!jiezou) { T1n++; switch(*(p+T1n)) { case 0: Out = 0; Timer1_Interval = *p; break; case 255: Out = 0; T1n = 0; Timer1_Interval = 0; break; default: Out = 0; Out = 1; T_H0 = yinjiebiao[*(p+T1n)]>>8; T_L0 = yinjiebiao[*(p+T1n)]&0xFF; if(*(p+T1n+1)>=50 && *(p+T1n+1)!=255) { Timer1_Interval = *(p+T1n+1); T1n++; } Timer1_Interval = *p; break; } jiezou = 1; } else { Out = 0; Timer1_Interval = 1; jiezou = 0; } } void main(void) { EA = 1; InitTimer0();//初始化定时器 InitTimer1();//初始化定时器1 p = &shengrikuaile[0]; Timer1_Interval = 50; while(1) { if(Timer1_con!=0)//产生了定器事件 { Timer1_Time();//调用时间事件 Timer1_con --; } } } void Timer0ini(void)interrupt 1 { TH0 = T_H0; TL0 = T_L0;//重复 if(Out) P1_0 ^= 1; } void Timer1int()interrupt 3//定时器1中断 { TH1 = 0xD8; TL1 = 0xF0;//10ms定时 if(Timer1_Interval != 0)//Timer1_Interval不为0时计时 { if(++Timer1 >= Timer1_Interval) { Timer1 = 0; Timer1_con ++;//到时间后定时器到时间事件加1 } } } 说一下音乐表,音乐表第一个字节数据用来表示节奏快慢,以后的每一个数据若是没有超过28(7+I,I已经在程序开头定义好了)则表示是音符,若是大于28小于255,就表示当前这个音符的长度,若是等于255,则表示音乐已经结束了,单片机立刻停止演奏。 开始播放音乐的方法: p = &shengrikuaile[0]; Timer1_Interval = 50; p是一个指针变量,先把音乐代码的的第一个数据的指针赋给P,然后启动Timer1_Interval,Timer1_Interval只要不为0,单片机就会开始演奏音乐。 由于本人对于音乐是一窍不通,所以,这个程序只做一首生日快乐程序由于时间匆忙,还有很多的不足,见谅了。
开一贴子,发一些代码 希望能得到高手的指点,也希望能帮到初学者 先发一段时钟的记时核心代码,用来做电子表的 /******************************************************* time.c 时间驱动程序 *******************************************************/ unsigned int data Second; struct Time//时间 { unsigned char Hour ; unsigned char Min ; unsigned char Sec ; }; struct Date//日期 { unsigned int Year ; unsigned char Moon ; unsigned char Date ; }; struct Time systime = {12,0,0}; struct Date sysdate = {2012,1,1}; timeCalculation(void)//时间的计算 { if(++systime.Sec >= 60)//秒计算 { systime.Sec = 0; if(++systime.Min >= 60)//分计算 { systime.Min = 0; if(++systime.Hour >= 24)//时计算 { systime.Hour = 0; return 1;//时到24小时 } } } return 0;//时间没到24小时 } /********************************************** 作用:计算当前月的天数 程序入口:n哪一年i哪一月 出口:i对应的天数 ***********************************************/ DatesCalculation(unsigned int year,unsigned char i) { if(i == 1) return 31; if(i == 2) return (year%4==0)&&(year%100)||year%400==0 ? 29:28; if(i<8 && i>2) { if(i%2 == 0) return 30; else return 31; } if(i<=12 && i>=8) { if(i%2 ==0) return 31; else return 30; } return 255;//错误 } **************************************************************/ void TimeD()interrupt inte_time { TL_time += 0x00+1; if(CY)//向上借位 TH_time += 0xF7+1; else TH_time += 0xF7;//定时器间隔1ms,含自动重装补偿 if(++Second >= 400) { Second = 0; if(timeCalculation() == 1) { DateCalculation();//时间走 } } }
1 下一页