这个是1年半前做的了,今天才想起来没发过,发上来。在 坛友的代码上适当改动,把6LED的增加到16LED,用贴片stc15w408as控制。
sop-20封装的单片机焊在转接板上
0603的LED两头焊漆包线
焊16个,并点亮,确定每个都能亮
准备microUSB
木塞上给microUSB开口
装入瓶中的效果
点亮
效果视频:
16led萤火虫_stc15w408as控制.mp4
(2.44 MB, 下载次数: 1)
下面是代码
- #include <STC15.H>
- #define ONE_CYCLE_STEP 33 //led多了,该值要调小,不然频闪 100 35MHZ 33 11.0592MHZ
- #define PORT1 P3
- #define PORT2 P1
- #define LED_CNT 16 //定义输出口的端口数1-8 4代表使用0-3口输出
- #define SCRIPT_CNT 6 //定义脚本数
- //萤火虫结构
- struct Firefly{
- unsigned int brightness; //最大亮度值0-255
- unsigned int timeCell; //时间间隔0-65535
- unsigned int count; //运行控制变量:当前计数
- unsigned char bn; //运行控制变量:当前亮度
- };
- //定义每个输出端口的执行脚本
- //每个端口将执行SCRIPT_CNT次,然后不断循环执行
- struct Firefly code fireFlyScript[][SCRIPT_CNT] = {
- {{150,500,0,0},{0,600,0,0},{100,700,0,0},{0,600,0,0},{50,400,0,0},{150,800,0,0}}, //1
- {{0,300,0,0},{100,400,0,0},{0,700,0,0},{200,300,0,0},{0,700,0,0},{150,700,0,0}}, //2
- {{90,300,0,0},{0,400,0,0},{110,600,0,0},{0,1200,0,0},{100,400,0,0},{0,500,0,0}}, //3
- {{0,500,0,0},{0,300,0,0},{200,600,0,0},{0,1000,0,0},{100,1000,0,0},{0,300,0,0}}, //4
- {{0,900,0,0},{130,600,0,0},{100,200,0,0},{0,1200,0,0},{80,500,0,0},{0,1000,0,0}}, //5
- {{60,700,0,0},{150,600,0,0},{0,800,0,0},{0,1000,0,0},{100,200,0,0},{0,100,0,0}}, //6
- {{0,600,0,0},{180,500,0,0},{110,200,0,0},{50,100,0,0},{0,600,0,0},{160,100,0,0}}, //7
- {{0,750,0,0},{255,300,0,0},{150,200,0,0},{0,1000,0,0},{255,1500,0,0},{150,100,0,0}}, //8
- {{0,600,0,0},{120,700,0,0},{115,800,0,0},{0,900,0,0},{90,300,0,0},{0,100,0,0}}, //9
- {{137,200,0,0},{0,500,0,0},{0,600,0,0},{130,600,0,0},{40,350,0,0},{0,1200,0,0}}, //10
- {{113,600,0,0},{0,760,0,0},{90,534,0,0},{0,500,0,0},{128,500,0,0},{0,500,0,0}}, //11
- {{0,700,0,0},{0,500,0,0},{139,900,0},{0,500,0,0}, {60,700,0,0},{0,400,0,0}}, //12
- {{0,700,0,0},{50,700,0,0},{60,400,0,0},{0,500,0,0},{40,800,0,0},{150,540,0,0}}, //13
- {{0,500,0,0},{65,700,0,0},{0,900,0,0},{30,800,0,0},{98,300,0,0},{130,600,0,0}}, //14
- {{0,250,0,0},{148,600,0,0},{70,600,0,0},{0,900,0,0},{85,500,0,0},{0,1200,0,0}}, //15
- {{80,100,0,0},{60,600,0,0},{0,800,0,0},{0,400,0,0},{116,1000,0,0},{135,900,0,0}} //16
-
- };
- //定义LED_CNT只萤火虫
- struct Firefly fireFlies[LED_CNT];
- //每只萤火虫的脚本计数器
- unsigned char ffScript[LED_CNT];
- //预先计算好的余弦函数表,PWM输出模拟函数曲线效果更好
- unsigned char code cosValue[]={
- 0,0,0,0,0,0,0,0,1,1,1,2,2,3,3,4,4,5,6,6,7,8,
- 9,10,11,11,12,13,14,16,17,18,19,20,21,23,24,
- 25,27,28,29,31,32,34,35,37,39,40,42,44,45,47,
- 49,50,52,54,56,58,60,62,63,65,67,69,71,73,75,
- 77,80,82,84,86,88,90,92,94,97,99,101,103,105,
- 107,110,112,114,116,119,121,123,125,127,130,
- 132,134,136,139,141,143,145,148,150,152,154,
- 156,158,161,163,165,167,169,171,173,175,178,
- 180,182,184,186,188,190,191,193,195,197,199,
- 201,203,205,206,208,210,211,213,215,216,218,
- 220,221,223,224,226,227,228,230,231,232,234,
- 235,236,237,238,239,241,242,243,244,244,245,
- 246,247,248,249,249,250,251,251,252,252,253,
- 253,254,254,254,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,254,254,254,
- 253,253,252,252,251,251,250,249,249,248,247,
- 246,245,244,244,243,242,241,239,238,237,236,
- 235,234,232,231,230,228,227,226,224,223,221,
- 220,218,216,215,213,211,210,208,206,205,203,
- 201,199,197,195,193,192,190,188,186,184,182,
- 180,178,175,173,171,169,167,165,163,161,158,
- 156,154,152,150,148,145,143,141,139,136,134,
- 132,130,128,125,123,121,119,116,114,112,110,
- 107,105,103,101,99,97,94,92,90,88,86,84,82,
- 80,77,75,73,71,69,67,65,64,62,60,58,56,54,52,
- 50,49,47,45,44,42,40,39,37,35,34,32,31,29,28,
- 27,25,24,23,21,20,19,18,17,16,14,13,12,11,11,
- 10,9,8,7,6,6,5,4,4,3,3,2,2,1,1,1,0,0,0,0,0,0,0,
- 0
- };
- //计时器中断计数变量
- unsigned int time0count_0;
- /*
- //---------------------------------------
- //名称 :两组io口合成一组十六位io口
- //参数 :
- //返回 :
- //---------------------------------------
- void segment_out(unsigned int dat){
- P3=dat&0x00ff;
- P1=dat&0xff00;
- }
- */
- //---------------------------------------
- //名称 :定时器0中断服务程序
- // :Timer0
- //参数 :
- //返回 :
- //---------------------------------------
- void Timer0(void) interrupt 1
- {
- unsigned long cell; //计算用临时变量
- unsigned int i,p,h;
- //一个周期结束,检查脚本以及下一个周期的占空比
- if(++time0count_0>ONE_CYCLE_STEP)
- {
- time0count_0 = 0;
- //N路信号分别处理
- for(i = 0;i<LED_CNT;i++)
- {
- //一个脚本执行完毕,装入下一个脚本
- if(++fireFlies[i].count>fireFlies[i].timeCell)
- {
- ffScript[i]++;
- ffScript[i] = ffScript[i] % SCRIPT_CNT;
- fireFlies[i] = fireFlyScript[i][ffScript[i]];
- }
- //计算下一个周期的占空比和亮度
- cell = fireFlies[i].count;
- cell *=360;
- cell /= fireFlies[i].timeCell;
- fireFlies[i].bn = (cosValue[cell]*fireFlies[i].brightness)/255;
- //准备点亮某个LED
- p=1<<i;
- h=p;
- h=h>>8;
- //如果亮度值不为0则点亮
- if(fireFlies[i].bn != 0)
- {
- PORT1 |= p;
- PORT2 |= h;
- }
- else
- {
- PORT1 &= ~p;
- PORT2 &= ~h;
- }
- }
- }
- //每个输出口占空比达到后输出低电平关闭LED
- for(i = 0; i<LED_CNT; i++)
- {
- p=1<<i;
- h=p;
- h=h>>8;
- if(time0count_0==fireFlies[i].bn){
- PORT1 &= ~p;
- PORT2 &= ~h;
- }
- }
- }
- void main()
- {
- unsigned i;
- //关闭所有LED
- PORT1=0;
- PORT2=0;
- //初始化所有萤火虫和执行脚本
- for(i = 0; i<LED_CNT; i++)
- {
- fireFlies[i] = fireFlyScript[i][0];
- ffScript[i] = 0;
- }
- //***定时器Timer0初始化*** 十六位自动重装
- TMOD&=0xF0; //将TMOD的低4位定时器0控制部分清零
- TL0=0xE8; //设置定时器0初值低8位
- TH0=0xFF; //设置定时器0初值高8位
- TR0=1; //启动定时器0
- ET0=1; //Timer0中断允许
-
- //***开全局中断设置****
- //定时器Timer0设置了中断允许,此处要开全局中断
- EA=1; //开全局中断
-
- while(1); //死循环,单片机初始化后,将一直运行这个死循环
- }
复制代码
附件里是完整工程下载:
|