n x 资源 + 时间 = 快乐

本文探讨了现代人在物质极大丰富背景下所面临的困惑与迷茫,分析了资源过剩与时间不足之间的矛盾,指出盲目追求物质并不能带来真正的快乐。

五月三日在家里干了一天活儿。

除了院子里半人高的杂草,把阳台上三个巨大的戴尔箱子变魔术一样的腾空,又把所有的玻璃擦干净。觉得特快乐。以前买的东西也就这样神奇得跑了出来。

现代人的困惑

现代人遇到的一个问题就是,当金钱可以买到的东西远远超过可以支配的时间的时候,就会有无穷无尽的忙乱和迷茫。

例子一:旅游越来越不能带来兴趣。因为有钱可以去一趟云南,却忙得无法在起程前两个星期给与足够的时间来憧憬和筹划,最终,这此旅行仅仅是去过这个地方罢了。
例子二:疯狂的买新的镜头,却发现并不见得用他拍了照片。
例子三:每天往自己的RSS阅读器里面加新的种子,却发现认真读过的越来越少。
例子四:下载堆满硬盘的软件,用的却不到一半。。。

种种这般,都是当自己可以获得的资源超过自己可以给于的时间后,出现的状况。更不幸的是,大家以为解决的办法,是获取更多的资源。。。如此恶性循环,把人拖入了物质极大丰富后却精神匮乏的境地。

选择过多,却没有时间来享受

现代的商业雪上加霜,不断的贬低不能用来买卖的东西,比如说慢跑,朋友,自由,而宣扬可以买卖的解决方案。比如用昂贵的健身俱乐部,来隐讳的满足人们对于锻炼的需求。用洋酒的广告,来燃起人们隐藏的对朋友的渴望。而自由,在物质社会里面,就简单的固化为汽车和别墅。

当我们没有时间来锻炼,却又渴望锻炼的时候,我们不会想到,一双球鞋加上1个小时专属于跑步的时间就可以解决问题。很多人会选择几千块钱的俱乐部会员卡。在会员卡过期的时候,才发现自己去的次数还不过5回。更不幸的是,大家会接着用买更贵的健身卡来试图解决问题。

同理可得,大家希望有朋友,却诉诸于昂贵的洋酒或者奢侈品;希望能够有自己的空间,可以到达自己想到的地方,于是开始购买别墅和汽车。

当没有时间匹配的消费进入我们的生活的时候,它们不像资产,倒更像灰尘,蒙蔽了我们的心灵。我们以为用钱可以买来快乐,但如果不匹配等比例的时间,买到的只是更多的困惑。

诉诸于获得自己现在没有的东西来解决眼前的问题,是一种习惯。这种习惯不改变,健身卡并不能带给我们健康,洋酒并不能带来朋友,而汽车也远不能带来自由。

就像这个化学式:

2H + O = H2O

一样,有再多的H,如果没有O,就没有水。

那么我们能不能得出一个类似的等式:

n x 资源 + 时间 = 快乐

这里,n可以等于零。

快乐或许真的来之不易,但障碍决不是金钱。

<!doctype html> <html> <head> <meta charset="utf-8"> <title>祝看到这个的新年快乐</title> <style> html,body{ margin:0px; width:100%; height:100%; overflow:hidden; background:#000; } </style> </head> <body> <canvas id="canvas" style="position:absolute;width:100%;height:100%;z-index:8888"></canvas> <canvas style="position:absolute;width:100%;height:100%;z-index:9999" class="canvas" ></canvas> <audio id="myAudio" controls autoplay style="display: none;"> <source src="https://webfs.ali.kugou.com/202212311401/c12fd67b0106b68294c3eb354aec3786/part/0/1516896/KGTX/CLTX001/clip_488850641544fb4c6e14e6b8356d084f.mp3" type="audio/mpeg"> </audio> <div class="overlay"> <div class="tabs"> <div class="tabs-labels"><span class="tabs-label">Commands</span><span class="tabs-label">Info</span><span class="tabs-label">Share</span></div> <div class="tabs-panels"> <ul class="tabs-panel commands"> </ul> </div> </div> </div> <script> function initVars(){ pi=Math.PI; ctx=canvas.getContext("2d"); canvas.width=canvas.clientWidth; canvas.height=canvas.clientHeight; cx=canvas.width/2; cy=canvas.height/2; playerZ=-25; playerX=playerY=playerVX=playerVY=playerVZ=pitch=yaw=pitchV=yawV=0; scale=600; seedTimer=0;seedInterval=5,seedLife=100;gravity=.02; seeds=new Array(); sparkPics=new Array(); s="https://cantelope.org/NYE/"; for(i=1;i<=10;++i){ sparkPic=new Image(); sparkPic.src=s+"spark"+i+".png"; sparkPics.push(sparkPic); } sparks=new Array(); pow1=new Audio(s+"pow1.ogg"); pow2=new Audio(s+"pow2.ogg"); pow3=new Audio(s+"pow3.ogg"); pow4=new Audio(s+"pow4.ogg"); frames = 0; } function rasterizePoint(x,y,z){ var p,d; x-=playerX; y-=playerY; z-=playerZ; p=Math.atan2(x,z); d=Math.sqrt(x*x+z*z); x=Math.sin(p-yaw)*d; z=Math.cos(p-yaw)*d; p=Math.atan2(y,z); d=Math.sqrt(y*y+z*z); y=Math.sin(p-pitch)*d; z=Math.cos(p-pitch)*d; var rx1=-1000,ry1=1,rx2=1000,ry2=1,rx3=0,ry3=0,rx4=x,ry4=z,uc=(ry4-ry3)*(rx2-rx1)-(rx4-rx3)*(ry2-ry1); if(!uc) return {x:0,y:0,d:-1}; var ua=((rx4-rx3)*(ry1-ry3)-(ry4-ry3)*(rx1-rx3))/uc; var ub=((rx2-rx1)*(ry1-ry3)-(ry2-ry1)*(rx1-rx3))/uc; if(!z)z=.000000001; if(ua>0&&ua<1&&ub>0&&ub<1){ return { x:cx+(rx1+ua*(rx2-rx1))*scale, y:cy+y/z*scale, d:Math.sqrt(x*x+y*y+z*z) }; }else{ return { x:cx+(rx1+ua*(rx2-rx1))*scale, y:cy+y/z*scale, d:-1 }; } } function spawnSeed(){ seed=new Object(); seed.x=-50+Math.random()*100; seed.y=25; seed.z=-50+Math.random()*100; seed.vx=.1-Math.random()*.2; seed.vy=-1.5;//*(1+Math.random()/2); seed.vz=.1-Math.random()*.2; seed.born=frames; seeds.push(seed); } function splode(x,y,z){ t=5+parseInt(Math.random()*150); sparkV=1+Math.random()*2.5; type=parseInt(Math.random()*3); switch(type){ case 0: pic1=parseInt(Math.random()*10); break; case 1: pic1=parseInt(Math.random()*10); do{ pic2=parseInt(Math.random()*10); }while(pic2==pic1); break; case 2: pic1=parseInt(Math.random()*10); do{ pic2=parseInt(Math.random()*10); }while(pic2==pic1); do{ pic3=parseInt(Math.random()*10); }while(pic3==pic1 || pic3==pic2); break; } for(m=1;m<t;++m){ spark=new Object(); spark.x=x; spark.y=y; spark.z=z; p1=pi*2*Math.random(); p2=pi*Math.random(); v=sparkV*(1+Math.random()/6) spark.vx=Math.sin(p1)*Math.sin(p2)*v; spark.vz=Math.cos(p1)*Math.sin(p2)*v; spark.vy=Math.cos(p2)*v; switch(type){ case 0: spark.img=sparkPics[pic1]; break; case 1: spark.img=sparkPics[parseInt(Math.random()*2)?pic1:pic2]; break; case 2: switch(parseInt(Math.random()*3)){ case 0: spark.img=sparkPics[pic1]; break; case 1: spark.img=sparkPics[pic2]; break; case 2: spark.img=sparkPics[pic3]; break; } break; } spark.radius=25+Math.random()*50; spark.alpha=1; spark.trail=new Array(); sparks.push(spark); } switch(parseInt(Math.random()*4)){ case 0: pow=new Audio(s+"pow1.ogg"); break; case 1: pow=new Audio(s+"pow2.ogg"); break; case 2: pow=new Audio(s+"pow3.ogg"); break; case 3: pow=new Audio(s+"pow4.ogg"); break; } d=Math.sqrt((x-playerX)*(x-playerX)+(y-playerY)*(y-playerY)+(z-playerZ)*(z-playerZ)); /*pow.volume=1.5/(1+d/10)*/; pow.play(); } function doLogic(){ if(seedTimer<frames){ seedTimer=frames+seedInterval*Math.random()*10; spawnSeed(); } for(i=0;i<seeds.length;++i){ seeds[i].vy+=gravity; seeds[i].x+=seeds[i].vx; seeds[i].y+=seeds[i].vy; seeds[i].z+=seeds[i].vz; if(frames-seeds[i].born>seedLife){ splode(seeds[i].x,seeds[i].y,seeds[i].z); seeds.splice(i,1); } } for(i=0;i<sparks.length;++i){ if(sparks[i].alpha>0 && sparks[i].radius>5){ sparks[i].alpha-=.01; sparks[i].radius/=1.02; sparks[i].vy+=gravity; point=new Object(); point.x=sparks[i].x; point.y=sparks[i].y; point.z=sparks[i].z; if(sparks[i].trail.length){ x=sparks[i].trail[sparks[i].trail.length-1].x; y=sparks[i].trail[sparks[i].trail.length-1].y; z=sparks[i].trail[sparks[i].trail.length-1].z; d=((point.x-x)*(point.x-x)+(point.y-y)*(point.y-y)+(point.z-z)*(point.z-z)); if(d>9){ sparks[i].trail.push(point); } }else{ sparks[i].trail.push(point); } if(sparks[i].trail.length>5)sparks[i].trail.splice(0,1); sparks[i].x+=sparks[i].vx; sparks[i].y+=sparks[i].vy; sparks[i].z+=sparks[i].vz; sparks[i].vx/=1.075; sparks[i].vy/=1.075; sparks[i].vz/=1.075; }else{ sparks.splice(i,1); } } p=Math.atan2(playerX,playerZ); d=Math.sqrt(playerX*playerX+playerZ*playerZ); d+=Math.sin(frames/80)/1.25; t=Math.sin(frames/200)/40; playerX=Math.sin(p+t)*d; playerZ=Math.cos(p+t)*d; yaw=pi+p+t; } function rgb(col){ var r = parseInt((.5+Math.sin(col)*.5)*16); var g = parseInt((.5+Math.cos(col)*.5)*16); var b = parseInt((.5-Math.sin(col)*.5)*16); return "#"+r.toString(16)+g.toString(16)+b.toString(16); } function draw(){ ctx.clearRect(0,0,cx*2,cy*2); ctx.fillStyle="#ff8"; for(i=-100;i<100;i+=3){ for(j=-100;j<100;j+=4){ x=i;z=j;y=25; point=rasterizePoint(x,y,z); if(point.d!=-1){ size=250/(1+point.d); d = Math.sqrt(x * x + z * z); a = 0.75 - Math.pow(d / 100, 6) * 0.75; if(a>0){ ctx.globalAlpha = a; ctx.fillRect(point.x-size/2,point.y-size/2,size,size); } } } } ctx.globalAlpha=1; for(i=0;i<seeds.length;++i){ point=rasterizePoint(seeds[i].x,seeds[i].y,seeds[i].z); if(point.d!=-1){ size=200/(1+point.d); ctx.fillRect(point.x-size/2,point.y-size/2,size,size); } } point1=new Object(); for(i=0;i<sparks.length;++i){ point=rasterizePoint(sparks[i].x,sparks[i].y,sparks[i].z); if(point.d!=-1){ size=sparks[i].radius*200/(1+point.d); if(sparks[i].alpha<0)sparks[i].alpha=0; if(sparks[i].trail.length){ point1.x=point.x; point1.y=point.y; switch(sparks[i].img){ case sparkPics[0]:ctx.strokeStyle="#f84";break; case sparkPics[1]:ctx.strokeStyle="#84f";break; case sparkPics[2]:ctx.strokeStyle="#8ff";break; case sparkPics[3]:ctx.strokeStyle="#fff";break; case sparkPics[4]:ctx.strokeStyle="#4f8";break; case sparkPics[5]:ctx.strokeStyle="#f44";break; case sparkPics[6]:ctx.strokeStyle="#f84";break; case sparkPics[7]:ctx.strokeStyle="#84f";break; case sparkPics[8]:ctx.strokeStyle="#fff";break; case sparkPics[9]:ctx.strokeStyle="#44f";break; } for(j=sparks[i].trail.length-1;j>=0;--j){ point2=rasterizePoint(sparks[i].trail[j].x,sparks[i].trail[j].y,sparks[i].trail[j].z); if(point2.d!=-1){ ctx.globalAlpha=j/sparks[i].trail.length*sparks[i].alpha/2; ctx.beginPath(); ctx.moveTo(point1.x,point1.y); ctx.lineWidth=1+sparks[i].radius*10/(sparks[i].trail.length-j)/(1+point2.d); ctx.lineTo(point2.x,point2.y); ctx.stroke(); point1.x=point2.x; point1.y=point2.y; } } } ctx.globalAlpha=sparks[i].alpha; ctx.drawImage(sparks[i].img,point.x-size/2,point.y-size/2,size,size); } } } function frame(){ if(frames>100000){ seedTimer=0; frames=0; } frames++; draw(); doLogic(); requestAnimationFrame(frame); } window.addEventListener("resize",()=>{ canvas.width=canvas.clientWidth; canvas.height=canvas.clientHeight; cx=canvas.width/2; cy=canvas.height/2; }); initVars(); frame(); window.onload = function(){ setInterval("toggleSound()",100); } function toggleSound() { var music = document.getElementById("myAudio");//获取ID if (music.paused) { //判读是否播放 music.paused=false; music.play(); //没有就播放 } } </script> <script > /* author:sakura */ var S = { init: function () { var action = window.location.href, i = action.indexOf('?a='); S.Drawing.init('.canvas'); document.body.classList.add('body--ready'); if (i !== -1) { S.UI.simulate(decodeURI(action).substring(i + 3)); } else { S.UI.simulate('|#countdown 5||2025|新年快乐|平安喜乐|凡是过往|皆为序章|福起新岁|万事顺遂|下一个365天|也要充满热爱'); } S.Drawing.loop(function () { S.Shape.render(); }); } }; S.Drawing = (function () { var canvas, context, renderFn requestFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60); }; return { init: function (el) { canvas = document.querySelector(el); context = canvas.getContext('2d'); this.adjustCanvas(); window.addEventListener('resize', function (e) { S.Drawing.adjustCanvas(); }); }, loop: function (fn) { renderFn = !renderFn ? fn : renderFn; this.clearFrame(); renderFn(); requestFrame.call(window, this.loop.bind(this)); }, adjustCanvas: function () { canvas.width = window.innerWidth; canvas.height = window.innerHeight; }, clearFrame: function () { context.clearRect(0, 0, canvas.width, canvas.height); }, getArea: function () { return { w: canvas.width, h: canvas.height }; }, drawCircle: function (p, c) { context.fillStyle = c.render(); context.beginPath(); context.arc(p.x, p.y, p.z, 0, 2 * Math.PI, true); context.closePath(); context.fill(); } } }()); S.UI = (function () { var canvas = document.querySelector('.canvas'), interval, isTouch = false, //('ontouchstart' in window || navigator.msMaxTouchPoints), currentAction, resizeTimer, time, maxShapeSize = 30, firstAction = true, sequence = [], cmd = '#'; function formatTime(date) { var h = date.getHours(), m = date.getMinutes(), m = m < 10 ? '0' + m : m; return h + ':' + m; } function getValue(value) { return value && value.split(' ')[1]; } function getAction(value) { value = value && value.split(' ')[0]; return value && value[0] === cmd && value.substring(1); } function timedAction(fn, delay, max, reverse) { clearInterval(interval); currentAction = reverse ? max : 1; fn(currentAction); if (!max || (!reverse && currentAction < max) || (reverse && currentAction > 0)) { interval = setInterval(function () { currentAction = reverse ? currentAction - 1 : currentAction + 1; fn(currentAction); if ((!reverse && max && currentAction === max) || (reverse && currentAction === 0)) { clearInterval(interval); } }, delay); } } function reset(destroy) { clearInterval(interval); sequence = []; time = null; destroy && S.Shape.switchShape(S.ShapeBuilder.letter('')); } function performAction(value) { var action, value, current; // overlay.classList.remove('overlay--visible'); sequence = typeof(value) === 'object' ? value : sequence.concat(value.split('|')); // input.value = ''; // checkInputWidth(); timedAction(function (index) { current = sequence.shift(); action = getAction(current); value = getValue(current); switch (action) { case 'countdown': value = parseInt(value) || 10; value = value > 0 ? value : 10; timedAction(function (index) { if (index === 0) { if (sequence.length === 0) { S.Shape.switchShape(S.ShapeBuilder.letter('')); } else { performAction(sequence); } } else { S.Shape.switchShape(S.ShapeBuilder.letter(index), true); } }, 1000, value, true); break; case 'rectangle': value = value && value.split('x'); value = (value && value.length === 2) ? value : [maxShapeSize, maxShapeSize / 2]; S.Shape.switchShape(S.ShapeBuilder.rectangle(Math.min(maxShapeSize, parseInt(value[0])), Math.min(maxShapeSize, parseInt(value[1])))); break; case 'circle': value = parseInt(value) || maxShapeSize; value = Math.min(value, maxShapeSize); S.Shape.switchShape(S.ShapeBuilder.circle(value)); break; case 'time': var t = formatTime(new Date()); if (sequence.length > 0) { S.Shape.switchShape(S.ShapeBuilder.letter(t)); } else { timedAction(function () { t = formatTime(new Date()); if (t !== time) { time = t; S.Shape.switchShape(S.ShapeBuilder.letter(time)); } }, 1000); } break; default: S.Shape.switchShape(S.ShapeBuilder.letter(current[0] === cmd ? 'What?' : current)); } }, 2000, sequence.length); } function checkInputWidth(e) { if (input.value.length > 18) { ui.classList.add('ui--wide'); } else { ui.classList.remove('ui--wide'); } if (firstAction && input.value.length > 0) { ui.classList.add('ui--enter'); } else { ui.classList.remove('ui--enter'); } } function bindEvents() { document.body.addEventListener('keydown', function (e) { input.focus(); if (e.keyCode === 13) { firstAction = false; reset(); performAction(input.value); } }); // input.addEventListener('input', checkInputWidth); // input.addEventListener('change', checkInputWidth); // input.addEventListener('focus', checkInputWidth); // help.addEventListener('click', function (e) { // overlay.classList.toggle('overlay--visible'); // overlay.classList.contains('overlay--visible') && reset(true); // }); // commands.addEventListener('click', function (e) { // var el, // info, // demo, // tab, // active, // url; // // if (e.target.classList.contains('commands-item')) { // el = e.target; // } else { // el = e.target.parentNode.classList.contains('commands-item') ? e.target.parentNode : e.target.parentNode.parentNode; // } // // info = el && el.querySelector('.commands-item-info'); // demo = el && info.getAttribute('data-demo'); // url = el && info.getAttribute('data-url'); // // if (info) { // overlay.classList.remove('overlay--visible'); // // if (demo) { // input.value = demo; // // if (isTouch) { // reset(); // performAction(input.value); // } else { // input.focus(); // } // } else if (url) { // //window.location = url; // } // } // }); canvas.addEventListener('click', function (e) { overlay.classList.remove('overlay--visible'); }); } function init() { bindEvents(); // input.focus(); isTouch && document.body.classList.add('touch'); } // Init init(); return { simulate: function (action) { performAction(action); } } }()); S.UI.Tabs = (function () { var tabs = document.querySelector('.tabs'), labels = document.querySelector('.tabs-labels'), triggers = document.querySelectorAll('.tabs-label'), panels = document.querySelectorAll('.tabs-panel'); function activate(i) { triggers[i].classList.add('tabs-label--active'); panels[i].classList.add('tabs-panel--active'); } function bindEvents() { labels.addEventListener('click', function (e) { var el = e.target, index; if (el.classList.contains('tabs-label')) { for (var t = 0; t < triggers.length; t++) { triggers[t].classList.remove('tabs-label--active'); panels[t].classList.remove('tabs-panel--active'); if (el === triggers[t]) { index = t; } } activate(index); } }); } function init() { activate(0); bindEvents(); } // Init init(); }()); S.Point = function (args) { this.x = args.x; this.y = args.y; this.z = args.z; this.a = args.a; this.h = args.h; }; S.Color = function (r, g, b, a) { this.r = r; this.g = g; this.b = b; this.a = a; }; S.Color.prototype = { render: function () { return 'rgba(' + this.r + ',' + + this.g + ',' + this.b + ',' + this.a + ')'; } }; S.Dot = function (x, y) { this.p = new S.Point({ x: x, y: y, z: 5, a: 1, h: 0 }); this.e = 0.07; this.s = true; this.c = new S.Color(135, 206, 235, this.p.a); this.t = this.clone(); this.q = []; }; S.Dot.prototype = { clone: function () { return new S.Point({ x: this.x, y: this.y, z: this.z, a: this.a, h: this.h }); }, _draw: function () { this.c.a = this.p.a; S.Drawing.drawCircle(this.p, this.c); }, _moveTowards: function (n) { var details = this.distanceTo(n, true), dx = details[0], dy = details[1], d = details[2], e = this.e * d; if (this.p.h === -1) { this.p.x = n.x; this.p.y = n.y; return true; } if (d > 1) { this.p.x -= ((dx / d) * e); this.p.y -= ((dy / d) * e); } else { if (this.p.h > 0) { this.p.h--; } else { return true; } } return false; }, _update: function () { if (this._moveTowards(this.t)) { var p = this.q.shift(); if (p) { this.t.x = p.x || this.p.x; this.t.y = p.y || this.p.y; this.t.z = p.z || this.p.z; this.t.a = p.a || this.p.a; this.p.h = p.h || 0; } else { if (this.s) { this.p.x -= Math.sin(Math.random() * 3.142); this.p.y -= Math.sin(Math.random() * 3.142); } else { this.move(new S.Point({ x: this.p.x + (Math.random() * 50) - 25, y: this.p.y + (Math.random() * 50) - 25, })); } } } d = this.p.a - this.t.a; this.p.a = Math.max(0.1, this.p.a - (d * 0.05)); d = this.p.z - this.t.z; this.p.z = Math.max(1, this.p.z - (d * 0.05)); }, distanceTo: function (n, details) { var dx = this.p.x - n.x, dy = this.p.y - n.y, d = Math.sqrt(dx * dx + dy * dy); return details ? [dx, dy, d] : d; }, move: function (p, avoidStatic) { if (!avoidStatic || (avoidStatic && this.distanceTo(p) > 1)) { this.q.push(p); } }, render: function () { this._update(); this._draw(); } } S.ShapeBuilder = (function () { var gap = 13, shapeCanvas = document.createElement('canvas'), shapeContext = shapeCanvas.getContext('2d'), fontSize = 500, fontFamily = 'Avenir, Helvetica Neue, Helvetica, Arial, sans-serif'; function fit() { shapeCanvas.width = Math.floor(window.innerWidth / gap) * gap; shapeCanvas.height = Math.floor(window.innerHeight / gap) * gap; shapeContext.fillStyle = 'red'; shapeContext.textBaseline = 'middle'; shapeContext.textAlign = 'center'; } function processCanvas() { var pixels = shapeContext.getImageData(0, 0, shapeCanvas.width, shapeCanvas.height).data; dots = [], pixels, x = 0, y = 0, fx = shapeCanvas.width, fy = shapeCanvas.height, w = 0, h = 0; for (var p = 0; p < pixels.length; p += (4 * gap)) { if (pixels[p + 3] > 0) { dots.push(new S.Point({ x: x, y: y })); w = x > w ? x : w; h = y > h ? y : h; fx = x < fx ? x : fx; fy = y < fy ? y : fy; } x += gap; if (x >= shapeCanvas.width) { x = 0; y += gap; p += gap * 4 * shapeCanvas.width; } } return { dots: dots, w: w + fx, h: h + fy }; } function setFontSize(s) { shapeContext.font = 'bold ' + s + 'px ' + fontFamily; } function isNumber(n) { return !isNaN(parseFloat(n)) && isFinite(n); } function init() { fit(); window.addEventListener('resize', fit); } // Init init(); return { imageFile: function (url, callback) { var image = new Image(), a = S.Drawing.getArea(); image.onload = function () { shapeContext.clearRect(0, 0, shapeCanvas.width, shapeCanvas.height); shapeContext.drawImage(this, 0, 0, a.h * 0.6, a.h * 0.6); callback(processCanvas()); }; image.onerror = function () { callback(S.ShapeBuilder.letter('What?')); } image.src = url; }, circle: function (d) { var r = Math.max(0, d) / 2; shapeContext.clearRect(0, 0, shapeCanvas.width, shapeCanvas.height); shapeContext.beginPath(); shapeContext.arc(r * gap, r * gap, r * gap, 0, 2 * Math.PI, false); shapeContext.fill(); shapeContext.closePath(); return processCanvas(); }, letter: function (l) { var s = 0; setFontSize(fontSize); s = Math.min(fontSize, (shapeCanvas.width / shapeContext.measureText(l).width) * 0.8 * fontSize, (shapeCanvas.height / fontSize) * (isNumber(l) ? 1 : 0.45) * fontSize); setFontSize(s); shapeContext.clearRect(0, 0, shapeCanvas.width, shapeCanvas.height); shapeContext.fillText(l, shapeCanvas.width / 2, shapeCanvas.height / 2); return processCanvas(); }, rectangle: function (w, h) { var dots = [], width = gap * w, height = gap * h; for (var y = 0; y < height; y += gap) { for (var x = 0; x < width; x += gap) { dots.push(new S.Point({ x: x, y: y, })); } } return { dots: dots, w: width, h: height }; } }; }()); S.Shape = (function () { var dots = [], width = 0, height = 0, cx = 0, cy = 0; function compensate() { var a = S.Drawing.getArea(); cx = a.w / 2 - width / 2; cy = a.h / 2 - height / 2; } return { shuffleIdle: function () { var a = S.Drawing.getArea(); for (var d = 0; d < dots.length; d++) { if (!dots[d].s) { dots[d].move({ x: Math.random() * a.w, y: Math.random() * a.h }); } } }, switchShape: function (n, fast) { var size, a = S.Drawing.getArea(); width = n.w; height = n.h; compensate(); if (n.dots.length > dots.length) { size = n.dots.length - dots.length; for (var d = 1; d <= size; d++) { dots.push(new S.Dot(a.w / 2, a.h / 2)); } } var d = 0, i = 0; while (n.dots.length > 0) { i = Math.floor(Math.random() * n.dots.length); dots[d].e = fast ? 0.25 : (dots[d].s ? 0.14 : 0.11); if (dots[d].s) { dots[d].move(new S.Point({ z: Math.random() * 20 + 10, a: Math.random(), h: 18 })); } else { dots[d].move(new S.Point({ z: Math.random() * 5 + 5, h: fast ? 18 : 30 })); } dots[d].s = true; dots[d].move(new S.Point({ x: n.dots[i].x + cx, y: n.dots[i].y + cy, a: 1, z: 5, h: 0 })); n.dots = n.dots.slice(0, i).concat(n.dots.slice(i + 1)); d++; } for (var i = d; i < dots.length; i++) { if (dots[i].s) { dots[i].move(new S.Point({ z: Math.random() * 20 + 10, a: Math.random(), h: 20 })); dots[i].s = false; dots[i].e = 0.04; dots[i].move(new S.Point({ x: Math.random() * a.w, y: Math.random() * a.h, a: 0.3, //.4 z: Math.random() * 4, h: 0 })); } } }, render: function () { for (var d = 0; d < dots.length; d++) { dots[d].render(); } } } }()); S.init(); </script> </body> </html> 用这个代码,加上烟花绽放效果
11-26
/*---------------------------------------------------------------------------- ======================================= JD51 2015开发板配套实验学习例程 ======================================= ************************************程序功能说明****************************** 本程序用来检测JD51开发板程序运行及部分硬件功能是否正常; 实现功能流程: 1)开发板上电,依次进行LED,LCD,数码管自检,而后蜂鸣器响四声,自检完毕; 2)按键2:播放“生日快乐”音乐; 3)按键3:温度传感器测试 温度高于31度时,蜂鸣器报警; 4)按键4:红外控制LED点灯。(注:红外模块对应NEC系列遥控器) *****************************************************************************/ #include "reg52.h" #define uchar unsigned char #define uint unsigned int extern void infrared(void); sbit E=P2^7; //1602使能引脚 sbit RW=P3^6; //1602读写引脚 sbit RS=P2^6; //1602数据/命令选择引脚 sbit DQ =P3^7; //DS18B20接P3^7口 sbit CE573=P2^5; sbit BUZZER=P2^4; sbit KEY1=P3^2; sbit KEY2=P3^3; sbit KEY3=P3^4; sbit KEY4=P3^5; sbit KEY5=P3^7; sbit P2_3=P2^3; code unsigned char digseg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; // 0 1 2 3 4 5 6 7 8 9 A b C d E F code unsigned char segsel[]={0xfe,0xfd,0xfb,0xf7}; //数码管段选 uchar code table[]={0xc0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90}; //四位8段数码管共阳0——9 uchar code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //四位8段数码管带小数点共阳0——9 uchar m; uint x; uchar IRtime; //检测红外高电平持续时间(脉宽) uchar IRcord[4]; //此数组用于储存分离出来的4个字节的数据(用户码2个字节+键值码2个字节) uchar IRdata[33]; //此数组用于储存红外的33位数据(第一位为引导码用户码16+键值码16) bit IRpro_ok,IRok; //第一个用于红外接收4个字节完毕。IRok用为检测脉宽完毕 void _delay(uchar ms) // 延时子程序 { uchar i ; while(ms--) { for(i = 0 ; i<250;i++) ; } } void init() //初始化定时器0 和外部中断0 { TMOD=0x22; //定时器0和定时器1工作方式2,8为自动重装 TH0=0x00; //高8位装入0那么定时器溢出一次的时间是256个机器周期 TL0=0x00; EA=1; //总中断 ET0=1; //定时器0中断 TR0=1; //启动定时器0 IT0=1; //设置外部中断0为跳沿出发方式,来一个下降沿触发一次 EX0=1; //启动外部中断0 // TH1=0xfd; //此溢出率为波特率9600 // TL1=0xfd; TR1=1; //启动定时器1 SM1=1; //设置串口工作方式1,10位异步收发器 // REN=1; //允许串口接受位 // ES=1; //开串口中断 } void time0() interrupt 1 //定义定时器0 { IRtime++; //检测脉宽,1次为278us } void int0() interrupt 0 //定义外部中断0 { static uchar i; // 声明静态变量(在跳出函数后在回来执行的时候不会丢失数值)i用于把33次高电平的持续时间存入IRdata static bit startflag; //开始储存脉宽标志位 if(startflag) //开始接收脉宽检测 { if((IRtime<53)&&(IRtime>=32)) /*判断是否是引导码,底电平9000us+高4500us 这个自己可以算我以11.0592来算了NEC协议的引导码底8000-100000+高4000-5000 如果已经接收了引导码那么i不会被置0就会开始依次存入脉宽*/ i=0; //如果是引导码那么执行i=0把他存到IRdata的第一个位 IRdata[i]=IRtime; //以T0的溢出次数来计算脉宽,把这个时间存到数组里面到后面判断 IRtime=0; //计数清零,下一个下降沿的时候在存入脉宽 i++; //计数脉宽存入的次数 if(i==33) //如果存入33次 { IRok=1; //那么表示脉宽检测完毕 i=0; //把脉宽计数清零准备下次存入 } } else { IRtime=0; //引导码开始进入把脉宽计数清零开始计数 startflag=1; //开始处理标志位置1 } } void display1() { P0=table[m]; P2_3 = 0; _delay(5); P2_3 = 1; } void IRcordpro() //提取它的33次脉宽进行数据解码 { uchar i,j,k,cord,value; /*i用于处理4个字节,j用于处理每一位,k用于代表哪一位脉宽 cord用于取出脉宽的时间判断是否符合1的脉宽时间*/ k=1; //从第一位脉宽开始取,丢弃引导码脉宽 for(i=0;i<4;i++) { for(j=0;j<8;j++) { cord=IRdata[k]; //把脉宽存入cord if(cord>5) //如果脉宽大于我11.0592的t0溢出率为约278us*7=1668那么判断为1 value=value|0x80; /*接收的时候是先接收最低位, 把最低位先放到value的最高位在和0x08按位或一下 这样不会改变valua的其他位的数值只会让他最高位为1*/ if(j<7) { value=value>>1; //value位左移依次接收8位数据。 } k++; //每执行一次脉宽位加1 } IRcord[i]=value; //每处理完一个字节把它放入IRcord数组中。 value=0; //清零value方便下次在存入数据 } IRpro_ok=1; //接收玩4个字节后IRpro ok置1表示红外解码完成 } void infrared() { // uchar i; init(); //执行初始化定时器0和外部中断0 while(1) //大循环 { if(IRok) //判断脉宽是否检测完毕 { IRcordpro();//根据脉宽解码出4个字节的数据 IRok=0; //重新等待脉宽检测 if(IRpro_ok) //判断是否解码完毕 { switch(IRcord[2])//判断第三个数码值 { case 0x16:m=0;break; case 0x0c:m=1;break; case 0x18:m=2;break; case 0x5e:m=3;break; case 0x08:m=4;break; case 0x1c:m=5;break; case 0x5a:m=6;break; case 0x42:m=7;break; case 0x52:m=8;break; case 0x4a:m=9;break; default :break; } IRpro_ok=0; } } //for(i=100;i>0;i--) //{ display1(); // } } } //串口、中断、初始化设置子函数 //11.0592MH晶振下,波特率9600,无奇偶校验 /*void initmpu(void) { //定时器1的工作方式2 TMOD=0x20; //装载计数初值 TL1=0xfd; TH1=0xfd; //采用串口工作方式1,无奇偶校验 SCON=0x50; //串口波特率不加倍 PCON=0x00; //开总中断,开串口中断 TR1=1; IE=0x95; }*/ void Delay(int m) { while(--m); } void test_led(void) //LED测试程序 { int i; P1=0x7F; Delay(20000); for(i=0;i<7;i++) { P1=P1>>1; Delay(20000); } P1=0xFF; Delay(20000); P1=0x00; Delay(20000); P1=0xFF; Delay(20000); P1=0x00; Delay(20000); P1=0xFF; } void test_digseg(void) //数码管测试程序 { char i,j; CE573=1; for(i=0;i<16;) { for(j=0;j<4;j++) { P2=segsel[j]; P0=digseg[i]; i++; Delay(20000); } } P2=0xF0; // 4只数码管同时开启 P0=0xFF; Delay(20000); P0=0x00; Delay(20000); P0=0xFF; // Delay(20000); // P0=0x00; // Delay(20000); // P0=0xFF; } void test_beep(char n) //蜂鸣器响N次 { char i; for(i=0;i<n;i++) { BUZZER=0; Delay(9000); BUZZER=1; Delay(9000); } } /*************** 定义按键 ************/ char check_K1(void) { if(KEY1==0) { Delay(2000); { if(KEY1==0) { return 1; } } } return 0; } char check_K2(void) { if(KEY2==0) { Delay(2000); { if(KEY2==0) { return 1; } } } return 0; } char check_K3(void) { if(KEY3==0) { Delay(2000); // 按键去抖 { if(KEY3==0) { return 1; } } } return 0; } char check_K4(void) { if(KEY4==0) { Delay(2000); { if(KEY4==0) { return 1; } } } return 0; } code uchar dis1[] = {"Hello MCU WORLD "} ; code uchar dis2[] = {"LET'S BEGINNING "} ; code uchar send_txt[]= {"123*\n* 456 *\n* 789 *\n*"}; void test_serial() { int i; EA=0; for(i=0;i<sizeof(send_txt);i++) { SBUF=send_txt[i]; while(TI==0); TI=0; } EA=1; } //char key1_flag=0; //char key2_flag=0; /*void ext_int0() interrupt 0 //外部中断0服务程序 { EA = 0; Delay(4000); key1_flag=1; EA = 1; } void ext_int1() interrupt 2 //外部中断1服务程序 { EA = 0; Delay(4000); key2_flag=1; EA = 1; } */ void getch(void) interrupt 4 //中断源编号为4,即串口中断 { uchar m; EA=0; RI=0; m=SBUF; if(m==0x80) //向开发板串口发送的数据 { test_serial(); } EA=1; } void delay() { int i,j; for(i=0; i<=100; i++) for(j=0; j<=20; j++) ; } /************** LCD *************************** /******************************************************************** * 名称 : enable(uchar del) * 功能 : 1602命令函数 * 输入 : 输入的命令值 * 输出 : 无 ***********************************************************************/ void enable(uchar del) { P0 = del; RS = 0; RW = 0; E = 0; delay(); E = 1; delay(); } /******************************************************************** * 名称 : write(uchar del) * 功能 : 1602写数据函数 * 输入 : 需要写入1602的数据 * 输出 : 无 ***********************************************************************/ void write(uchar del) { P0 = del; RS = 1; RW = 0; E = 0; delay(); E = 1; delay(); } /******************************************************************** * 名称 : L1602_init() * 功能 : 1602初始化,请参考1602的资料 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void L1602_init(void) { enable(0x01); enable(0x38); enable(0x0c); enable(0x06); enable(0xd0); } /******************************************************************** * 名称 : L1602_char(uchar hang,uchar lie,char sign) * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下 L1602_char(1,5,'b') * 输入 : 行,列,需要输入1602的数据 * 输出 : 无 ***********************************************************************/ void L1602_char(uchar hang,uchar lie,char sign) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); write(sign); } /******************************************************************** * 名称 : L1602_string(uchar hang,uchar lie,uchar *p) * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下 L1602_string(1,5,"ab cd ef;") * 输入 : 行,列,需要输入1602的数据 * 输出 : 无 ***********************************************************************/ void L1602_string(uchar hang,uchar lie,uchar *p) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); while(1) { if(*p == '\0') break; write(*p); p++; } } /******************************************************************** * 名称 : test_1602() * 功能 : LCD主函数 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void test_1602() { uchar i = 48; L1602_init(); L1602_char(1,5,'b'); L1602_string(1,1," 0123456789 "); L1602_string(2,1," ABCDEDGHIJ "); } /************* 18B20 ************************ /****************************************************************************/ void ds1820disp( uint tvalue1) ; void display(uchar a1,uchar a2,uchar a3,uchar a4); uint tvalue; uchar disdata[]={0,0,0,0}; /****************************************************************************/ void delaytimer(void) { EA=1; TMOD=0x10; TL1=(65536-500)%256; TH1=(65536-500)/256; TR1=0; ET1=1; } void timer() interrupt 3 { TR1=0; TH1=(65536-500)/256; TL1=(65536-500)%256; BUZZER=~BUZZER; } void delay_18B20( uint i) //延时 { while(--i); } void delay2(uchar n) //延时 { uchar i,j; for(i=n;i>0;i--) for(j=20;j>0;j--); } void ds1820rst() //初始化DS18B20 { unsigned char x=0; DQ = 1; //DQ复位 delay_18B20(4); // DQ = 0; //单片机将DQ拉低 delay_18B20(60); // DQ = 1; //拉高总线 delay_18B20(14);// x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20); } uchar ds1820rd() //从DS18B20读取一字节 { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) //一位一位地读,共8位 { DQ = 0; //给一脉冲信号 dat>>=1; //dat往右移一位 DQ = 1; //给一脉冲信号 if(DQ) dat|=0x80; delay_18B20(4);// } return(dat); } void ds1820wr(uchar wdata) //写入一字节 { unsigned char i=0; for (i=8;i>0;i--) { DQ = 0; DQ = wdata&0x01; delay_18B20(5); DQ = 1; wdata>>=1; } } uint read_temp() //读取温度 { float aaa; uchar a,b; ds1820rst(); ds1820wr(0xcc); //向DS18B20发跳过读ROM命令 ds1820wr(0x44); //启动DS18B20进行温度转换命令,转换结果存入内部RAM delay_18B20(80); //延时 ds1820rst(); ds1820wr(0xcc); //向DS18B20发跳过读ROM命令 ds1820wr(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 delay_18B20(80); //延时 a=ds1820rd(); //读内部RAM 低位 b=ds1820rd(); //读内部RAM 高位 aaa=(b*256+a)*6.25; tvalue=(uint)aaa; return(tvalue); } void ds1820disp( unsigned int tvalue1) //温度处理 { disdata[0]=tvalue1/1000; //十位 disdata[1]=tvalue1%1000/100; //个位 disdata[2]=tvalue1%100/10; //小数点后一位 disdata[3]=tvalue1%10;; //小数点后两位 display(disdata[0],disdata[1],disdata[2],disdata[3]); } void display(uchar a1,uchar a2,uchar a3,uchar a4) //显示温度 { P2=0xfe; P0=table[a1]; delay2(20); P2=0xfd; P0=table1[a2]; delay2(20); P2=0xfb; P0=table[a3]; delay2(20); P2=0xf7; P0=table[a4]; delay2(20); } void led(unsigned int lim) //设置温度临界植 { if(lim/100<30) //低于30度,亮绿灯 P1=0xdf; else if(lim/100<31) //低于31度,高于30度,亮黄灯 P1=0xbf; else { P1=0x7f; //高于31度,亮红灯。蜂鸣器报警 TR1=1;} } void test_18B20() { uint temp; delaytimer(); while(1) { temp=read_temp(); ds1820disp(temp); led(temp); if (check_K4()) //如果检测到有按键,跳出循环 { break; } else if(check_K2()) { break; } else if(check_K1()) { break; } } } /*********************** music ****************************/ //生日快乐歌的音符频率表,不同频率由不同的延时来决定 uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159, 212,212,106,126,159,169,190,119,119,126,159,142,159,0}; //生日快乐歌节拍表,节拍决定每个音符的演奏长短 uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24, 9,3,12,12,12,12,12,9,3,12,12,12,24,0}; //延时 void DelayMS(uint x) { uchar t; while(x--) for(t=0;t<120;t++); } //播放函数 void PlayMusic() { uint i=0,j,k; while(SONG_LONG[i]!=0||SONG_TONE[i]!=0) { //播放各个音符,SONG_LONG 为拍子长度 for(j=0;j<SONG_LONG[i]*20;j++) { BUZZER=~BUZZER; //SONG_TONE 延时表决定了每个音符的频率 for(k=0;k<SONG_TONE[i]/3;k++); } DelayMS(10); i++; if (check_K4()) //如果检测到有按键,跳出循环 { break; } else if(check_K3()) { break; } else if(check_K1()) { break; } } } void music() { BUZZER=0; PlayMusic(); //播放生日快乐 DelayMS(300); //播放完后暂停一段时间 BUZZER=1; } /*********************** main ****************************/ main() { // initmpu(); test_led(); //测试LED test_1602(); //测试LCD test_digseg(); //测试数码管 test_beep(2); //蜂鸣器响4声 test_serial(); //测试串口 P0=0XBF; while(1) // 扫描4个自由按键 { if(check_K1()) //按1键 { P0=digseg[1]; test_beep(1); //驱动蜂鸣器 } else if(check_K2())//按2键 { // key2_flag=0; P0=digseg[2]; test_beep(1); music(); //播放歌曲生日快乐 } else if(check_K3())//按3键 { P0=digseg[3]; test_beep(1); test_18B20(); //测试温度传感器 } else if(check_K4())//按4键 { P1 = 0xfe; P0=digseg[4]; P2 = 0XFF; test_beep(1); infrared(); //测试红外模块 } } }根据示例代码制作一个的智能闹钟
11-09
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值