久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

可按照腳本分別控制8路PWM函數波形輸出程序+視頻

作者:CNTSW   來源:本站原創   點擊數:  更新時間:2014年06月03日   【字體:

 

 

 

視頻
 
下面是源代碼:
#include <AT89X52.H>
//#include <AT892051.H>
 
#define ONE_CYCLE_STEP 255
 
#ifdef AT89C2051_HEADER_FILE
#define PORT P1 //如果使用STC12C2052的話使用P1口作為輸出口
#else
#define PORT P0 //否則使用P0口輸出
#endif
 
#define LED_CNT 4 //定義輸出口的端口數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] = {
{{0,300,0,0},{255,400,0,0},{0,500,0,0},{100,600,0,0},{0,900,0,0},{0,500,0,0}},
{{255,300,0,0},{0,400,0,0},{0,500,0,0},{255,800,0,0},{0,700,0,0},{0,500,0,0}},
{{0,300,0,0},{0,400,0,0},{255,500,0,0},{50,1200,0,0},{0,300,0,0},{0,500,0,0}},
{{128,500,0,0},{255,300,0,0},{50,200,0,0},{0,1000,0,0},{255,1500,0,0},{50,100,0,0}},
{{0,900,0,0},{255,300,0,0},{50,200,0,0},{0,1000,0,0},{255,1500,0,0},{50,100,0,0}},
{{255,400,0,0},{255,300,0,0},{50,200,0,0},{0,1000,0,0},{255,1500,0,0},{50,100,0,0}},
{{0,200,0,0},{255,300,0,0},{50,200,0,0},{0,1000,0,0},{255,1500,0,0},{50,100,0,0}},
{{0,750,0,0},{255,300,0,0},{50,200,0,0},{0,1000,0,0},{255,1500,0,0},{50,100,0,0}}
};
 
//定義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;
 
//---------------------------------------
//名稱 :定時器0中斷服務程序
// :Timer0
//參數
//返回
//---------------------------------------
void Timer0(void) interrupt 1 
{                          
unsigned long cell; //計算用臨時變量
unsigned char i,p;
TL0=0xE8; //重新給TL0賦初值
TH0=0xFF; //重新給TH0賦初值
 
//一個周期結束,檢查腳本以及下一個周期的占空比
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;
//如果亮度值不為0則點亮
if(fireFlies[i].bn != 0)
{
PORT |= p;
}
else
{
PORT &= ~p;
}
}
}
//每個輸出口占空比達到后輸出低電平關閉LED
for(i = 0; i<LED_CNT; i++)
{
p=1<<i;
if(time0count_0==fireFlies[i].bn)PORT &= ~p;
}
}
 
void main()
{
unsigned i;
 
//關閉所有LED
PORT=0;
 
//初始化所有螢火蟲和執行腳本
for(i = 0; i<LED_CNT; i++)
{
fireFlies[i] = fireFlyScript[i][0];
ffScript[i] = 0;
}
 
//***定時器Timer0初始化***
TMOD&=0xF0;            //將TMOD的低4位定時器0控制部分清零
TMOD|=0x01;            //設置定時器0為方式1
TL0=0xE8;              //設置定時器0初值低8位
TH0=0xFF;              //設置定時器0初值高8位
TR0=1;                 //啟動定時器0
ET0=1;                 //Timer0中斷允許
//***開全局中斷設置****
//定時器Timer0設置了中斷允許,此處要開全局中斷
EA=1;                  //開全局中斷
while(1);               //死循環,單片機初始化后,將一直運行這個死循環
}
 
關閉窗口

相關文章

主站蜘蛛池模板: 一区二区三区四区电影视频在线观看 | 国产综合欧美 | 久久久久久久国产精品影院 | 日韩国产精品一区二区三区 | 久久久国产精品一区 | 男女网站免费观看 | 伊人二区 | 91精品国产综合久久久久 | 99热热99 | 欧美色欧美亚洲另类七区 | 99国产精品久久久 | 波多野结衣av中文字幕 | 国产在线观看不卡一区二区三区 | 亚洲91精品 | 亚洲色图综合 | 蜜桃视频一区二区三区 | 四虎伊人| 嫩草懂你的影院入口 | 国产精品久久久久久久岛一牛影视 | 欧美日韩亚洲一区二区 | av资源在线看 | 日日想夜夜操 | 91就要激情 | 国产一区在线免费观看视频 | 午夜精品一区二区三区在线 | 久久大陆| 午夜男人视频 | 国产精品一区二区三区四区 | 日本三级黄视频 | 99福利视频 | 婷婷99| 国产真实乱全部视频 | 一区二区三区四区五区在线视频 | 日韩中文字幕一区 | 成人在线看片 | 九九久久99 | 成人影院网站ww555久久精品 | 国产成人在线免费 | 日本精品视频一区二区三区四区 | 国产精品国产三级国产aⅴ中文 | 午夜丰满寂寞少妇精品 |