找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6634|回復(fù): 12
收起左側(cè)

STC89單片機(jī) 定時器做PWM程序

  [復(fù)制鏈接]
ID:390416 發(fā)表于 2020-12-31 11:20 | 顯示全部樓層 |閱讀模式
本帖最后由 人人學(xué)會單片機(jī) 于 2020-12-31 15:10 編輯

很多小白不明白PWM怎么回事。只能說明你們看的教程沒講。我們?nèi)巳藢W(xué)會單片機(jī)教程就講過。其實(shí)很簡單的。特分享CPU定時器模擬PWM輸出給你們
#include "STC89.H"                                        //頭文件包含
#include <intrins.h>                                //頭文件包含
typedef unsigned char u8;                        //重新定義數(shù)據(jù)類型名
typedef unsigned short u16;                        //重新定義數(shù)據(jù)類型名
typedef unsigned long u32;                        //重新定義數(shù)據(jù)類型名
sbit PWM_OUT=P2^1;        
u8 idata PWM_Write_Byte[3]=0;

//****************************祁緒電子 2020年5月***
// 定時器0初始化  晶振11059200,12T,輸出50Hz的PWM,占空比0~255
// 定時器初值為:256-(11059200÷12÷50Hz÷256) = 184 = 0xB8
void PWM_Init(void)
{
        TMOD &= 0xF0;                                        //配置定時器工作模式
        TMOD |= 0x02;                                        //配置定時器工作模式 8位自動重裝模式
    TL0 = 0xB8;;                    //定時器初值
    TH0 = 0xB8;                                //定時器重裝初值
    TR0 = 1;                        //啟動定時器0
    ET0=1;                                                         //允許定時器0申請中斷
        EA=1;                                                        //中斷總閘閉合
}
//****************************祁緒電子 2020年5月***
//定時器0的CPU處理函數(shù),位置任意寫都行
void PWM_Display_timer0() interrupt 1
{
        
        static u8 pwm_t=0;                                 //局部變量,不丟失數(shù)據(jù)
        if(pwm_t<PWM_Write_Byte[0])
        {
                PWM_OUT=1;                                 
        }
        else PWM_OUT=0;
        pwm_t++;
}

//***************************祁緒電子 2020年5月***
// PWM 數(shù)模變換數(shù)據(jù)分配
void PWM_Allot()                                          
{
        static u8 kkk=0;        
        static u8 count=0;
        count++;
        if(count>100)
        {
                count=0;
                kkk++;
                PWM_Write_Byte[0]=kkk;        //kkk為占空比自動增加
                PWM_Write_Byte[1]=10;        
                PWM_Write_Byte[2]=10;
        }
}


void main()                                                        //主函數(shù)
{
        PWM_Init();
        while(1)                                                //主函數(shù)大循環(huán)
        {
                PWM_Allot();        
        }
}


回復(fù)

使用道具 舉報(bào)

ID:607312 發(fā)表于 2021-1-5 17:42 | 顯示全部樓層
學(xué)習(xí)了。很好
回復(fù)

使用道具 舉報(bào)

ID:796670 發(fā)表于 2021-1-24 09:52 | 顯示全部樓層
請問PWM_Write_Byte[3]的作用是什么?為什么要進(jìn)行數(shù)模轉(zhuǎn)換呢?
回復(fù)

使用道具 舉報(bào)

ID:390416 發(fā)表于 2021-1-24 10:16 | 顯示全部樓層
明日香 發(fā)表于 2021-1-24 09:52
請問PWM_Write_Byte[3]的作用是什么?為什么要進(jìn)行數(shù)模轉(zhuǎn)換呢?

你居然能問這種問題,你家的燈,你不開它你又看不見,開它吧你又覺得太亮,太浪費(fèi)電。而有時候必須最亮工作。你說怎么辦?
回復(fù)

使用道具 舉報(bào)

ID:582255 發(fā)表于 2021-1-24 14:17 | 顯示全部樓層
這貌似是一個比較復(fù)雜的PWM
回復(fù)

使用道具 舉報(bào)

ID:878420 發(fā)表于 2021-1-25 15:38 來自觸屏版 | 顯示全部樓層
學(xué)習(xí)啦!用到哪里學(xué)習(xí)到哪里,知識慢慢地積累
回復(fù)

使用道具 舉報(bào)

ID:444215 發(fā)表于 2021-1-29 09:51 | 顯示全部樓層
學(xué)習(xí)啦!用到哪里學(xué)習(xí)到哪里,知識慢慢地積累
回復(fù)

使用道具 舉報(bào)

ID:594968 發(fā)表于 2021-1-29 15:37 | 顯示全部樓層
程序看的很清楚,真是用心啊
回復(fù)

使用道具 舉報(bào)

ID:444215 發(fā)表于 2023-9-13 16:03 | 顯示全部樓層
需要這樣才能產(chǎn)生準(zhǔn)確的50HZ的PWM。
void PWM_Init(void)
{
    TMOD &= 0xF0;                   //配置定時器工作模式
    TMOD |= 0x02;                   //配置定時器工作模式 8位自動重裝模式
    TL0 = 0xB8;;                    //定時器初值
    TH0 = 0xB8;                     //定時器重裝初值
    TR0 = 1;                        //啟動定時器0
    ET0=1;                          //允許定時器0申請中斷
    EA=1;                           //中斷總閘閉合
}
void PWM_Display_timer0() interrupt 1
{
        static u8 pwm_t=0;                                 //局部變量,不丟失數(shù)據(jù)
                TR0 = 0;
        if(pwm_t<PWM_Write_Byte[0])
        {
            PWM_OUT=1;                                 
        }
        else PWM_OUT=0;
        pwm_t++;
                TR0 = 1;
}
回復(fù)

使用道具 舉報(bào)

ID:628588 發(fā)表于 2023-10-6 19:50 | 顯示全部樓層
249449417@qq.co 發(fā)表于 2023-9-13 16:03
需要這樣才能產(chǎn)生準(zhǔn)確的50HZ的PWM。
void PWM_Init(void)
{

pwm_t 都沒有清零,
回復(fù)

使用道具 舉報(bào)

ID:675799 發(fā)表于 2023-10-12 10:49 | 顯示全部樓層
oiui1 發(fā)表于 2023-10-6 19:50
pwm_t 都沒有清零,

if(pwm_t >255)
pwm_t =0;
回復(fù)

使用道具 舉報(bào)

ID:675799 發(fā)表于 2023-10-12 10:56 | 顯示全部樓層
oiui1 發(fā)表于 2023-10-6 19:50
pwm_t 都沒有清零,

if(pwm_t >100) pwm_t =0;
回復(fù)

使用道具 舉報(bào)

ID:149799 發(fā)表于 2024-6-22 15:43 | 顯示全部樓層
多謝樓主分享,51黑有你更精彩。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表