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

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

51單片機PWM-呼吸燈源程序

作者:未知   來源:不詳   點擊數:  更新時間:2014年06月29日   【字體:

 /**

 
****************************************************************
 
* @file : main.c
 
* @xu ran
* @date : 2014年5月23日20:55:19 - 2014年5月23日22:32:12
 
* @version : V2.0
 
* @brief : PWM脈沖寬度調制技術 實現呼吸燈
 
****************************************************************
 
* @attention
 
* 實驗平臺 : 51hei開發板
 
* 單片機 : STC89C52RC MCU 晶振 : 11.0592 MHZ
 
****************************************************************
 
*/
 
 
 
#include //使用STC89C52庫
 
 
 
/* 三八譯碼器74HC138 */
 
sbit ADDR3 = P1^3;
 
sbit ENLED = P1^4;
 
 
 
sbit PWMOUT = P0^0; //LED0
 
 
 
/* PWM占空比 */
 
unsigned char code pwmTable[] = {
 
3, 5, 8, 11, 13, 16, 21, 24, 27, 30, 33, 36, 40, 45, 49,
 
53, 55, 57, 61, 65, 67, 69, 72, 75, 79, 82, 86, 89, 91,
 
93, 96, 99
 
}; // dc%
 
/* PWM的高電平和低電平的定時器的重載值 */
 
unsigned char Highthr0, Hightlr0;
 
unsigned char Lowthr0, Lowtlr0;
 
 
 
/* 定時器T1計數裝載值 */
 
unsigned char thr1, tlr1;
 
 
 
/* PWM 頻率計數值 */
 
unsigned long tmp = 0;
 
 
 
/******************local function defines**************************/
 
void ConfigPWM(unsigned int fr, unsigned char dc);
 
void ConfigTimer1(unsigned int xms);
 
/******************************************************************/
 
 
 
/**
 
* @brief : 主函數
 
* @param : 無
 
* @retval : 無
 
*/
 
void main(void)
 
{
 
P0 = 0xFF; //初始化P0數據口
 
ADDR3 = 1;
 
ENLED = 0; //選擇LED
 
P1 = (P1 & 0xF8) | 0x06; //LEDS6
 
PWMOUT = 1; //初始化為熄滅
 
 
 
ConfigPWM(100, 2); //PWM頻率為100HZ, 占空比為2%
 
ConfigTimer1(50); //50ms調整一次占空比
 
 
 
EA = 1; //開啟總中斷!
 
 
 
while (1); //wait interrupt happen!
 
}
 
 
 
/**
 
* @brief : 配置PWM 調制PWM脈沖寬度
 
* @param : PWM的脈沖寬度 PWM的占空比
 
* @retval : 無
 
*/
 
void ConfigPWM(unsigned int fr, unsigned char dc)
 
{
 
unsigned int high = 0, low = 0;
 
 
 
tmp = (11059200/12/fr); //fr頻率的計數值
 
high = (tmp * dc) / 100; //高電平計數值
 
low = tmp - high; //低電平計數值
 
high = 65536 - high; //高電平的計數定時器裝載初值
 
low = 65536 - low; //低電平的計數定時器裝載初值
 
 
 
Highthr0 = (unsigned char)(high >> 8);
 
Hightlr0 = (unsigned char)high; //高電平
 
Lowthr0 = (unsigned char)(low >> 8);
 
Lowtlr0 = (unsigned char)low; //低電平
 
/* 配置Timer0 方式1 */
 
TMOD &= 0xF0; //清零T0控制位
 
TMOD |= 0x01; //方式1
 
TH0 = Highthr0;
 
TL0 = Hightlr0; //先裝高電平
 
TR0 = 1;
 
ET0 = 1; //開啟定時器T0中斷
 
}
 
 
 
/**
 
* @brief : 配置Timer1,用來調整PWM占空比
 
* @param : 待定時的時間
 
* @retval : 無
 
*/
 
void ConfigTimer1(unsigned int xms)
 
{
 
unsigned long tmp;
 
 
 
tmp = 11059200/12;
 
tmp = (tmp * xms) / 1000; //定時xms時間需要的計數值
 
tmp = 65536 - tmp; //需要裝載的計數初值
 
thr1 = (unsigned char)(tmp >> 8);
 
tlr1 = (unsigned char)tmp;
 
TMOD &= 0x0F; //清零T1控制位
 
TMOD |= 0x10; //T1方式1
 
TH1 = thr1;
 
TL1 = tlr1; //裝載初值
 
TR1 = 1;
 
ET1 = 1;
 
}
 
 
 
/**
 
* @brief : 調整PWM的占空比 (高電平的脈沖寬度)
 
* @param : 占空比 dc
 
* @retval : 無
 
*/
 
void tiaoZhengPWM(unsigned char dc)
 
{
 
unsigned int high = 0, low = 0;
 
 
 
high = (tmp * dc) / 100; //高電平計數值
 
low = tmp - high; //低電平計數值
 
high = 65536 - high;
 
low = 65536 - low; //計數裝載初值
 
Highthr0 = (unsigned char)(high >> 8);
 
Hightlr0 = (unsigned char)high; //取高電平計數裝載初值
 
Lowthr0 = (unsigned char)(low >> 8);
 
Lowtlr0 = (unsigned char)low; //取低電平計數裝載初值
 
}
 
 
 
/**
 
* @brief : 定時器T0中斷服務 改變PWM的狀態
 
* @param : 無
 
* @retval : 無
 
*/
 
void Timer0_ISP() interrupt 1
 
{
 
if (PWMOUT) //由高電平切換到低電平
 
{
 
TH0 = Lowthr0;
 
TL0 = Lowtlr0; //裝載低電平計數初值
 
PWMOUT = 0; //點亮LED
 
}
 
else
 
{
 
TH0 = Highthr0;
 
TL0 = Hightlr0; //裝載高電平計數值
 
PWMOUT = 1; //熄滅LED
 
}
 
}
 
 
 
/**
 
* @brief : 定時器T1中斷服務 調整PWM的占空比
 
* @param : 無
 
* @retval : 無
 
*/
 
void Timer1_ISP() interrupt 3
 
{
 
static unsigned char index = 0;
 
static bit bir = 0; //方向標志 (0 小->大 1 大->小)
 
 
 
TH1 = thr1;
 
TL1 = tlr1;
 
 
 
tiaoZhengPWM(pwmTable[index]); //調整PWM占空比
 
 
 
if (bir == 0)
 
{
 
index++;//遞增
 
if (index >= 31) //到31立刻改變PWM的控制方向,即占空比由大到小變化(LED 暗->亮)
 
{
 
bir = 1; //改變方向
 
}
 
}
 
else
 
{
 
index--;
 
if (index == 0) //到0時立刻改變PWM的方向,即占空比由小到大變化(LED 亮->暗)
 
{
 
bir = 0; //改變方向
 
}
 
}
 
}
 
 
 
/**********************************END OF FILE*************new line****************/
關閉窗口

相關文章

主站蜘蛛池模板: 青青草一区 | 欧美亚洲视频在线观看 | 亚洲精品68久久久一区 | 最新av在线网址 | 一区二区三区视频在线 | 网黄在线| 尤物视频在线免费观看 | 国产欧美在线一区二区 | 亚洲成人网在线观看 | 国内精品在线视频 | 久久久久久亚洲 | 欧美日韩一区二区在线观看 | 久久久亚洲| 请别相信他免费喜剧电影在线观看 | 97伦理最新伦理 | www.日本国产 | 欧美一区二区三区在线 | 毛片在线视频 | 一级一片在线观看 | 欧美日韩电影一区二区 | av第一页| 亚洲成人www| 久久久成 | 日韩在线精品强乱中文字幕 | 51ⅴ精品国产91久久久久久 | 国产视频黄色 | 亚洲成人精品久久 | 日韩精品无码一区二区三区 | 蜜桃视频在线观看www社区 | 日韩欧美1区2区 | 丁香综合 | 久久久久成人精品免费播放动漫 | 91欧美精品成人综合在线观看 | 久久久久久久99 | 北条麻妃一区二区三区在线观看 | 国产一区二区三区免费观看视频 | 久久国产电影 | 国产精品久久久久久久久久久久冷 | 久久久久久亚洲精品 | 91传媒在线观看 | 欧美在线a|