找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2789|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)PWM呼吸燈程序問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:880867 發(fā)表于 2021-2-18 16:21 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
heighHR0 = (u8)(heigh >> 8);//高電平裝入初值的高字節(jié)
heighLR0 = (u8)heigh; //高電平裝入初值的低字節(jié)
想問這個(gè)是怎么裝入的過程?heigh是16位的嗎?高電平裝入初值的低字節(jié)這個(gè)過程沒看懂?求大佬舉例詳解
單片機(jī)源程序如下:

  1. /*
  2. 實(shí)驗(yàn)接線:
  3.         AD/DAC模塊-->單片機(jī)管腳
  4.         J50-->P21
  5. 實(shí)驗(yàn)現(xiàn)象:
  6.         AD/DAC模塊上的DA1指示燈呈呼吸燈效果
  7. */


  8. #include "reg52.h"                         //此文件中定義了單片機(jī)的一些特殊功能寄存器


  9. //對數(shù)據(jù)類型進(jìn)行聲明定義
  10. typedef unsigned char u8;
  11. typedef unsigned int u16;
  12. typedef unsigned long u32;

  13. //--定義使用的IO口--//
  14. sbit PWMOUTLED=P2^1;

  15. //#define SYSCLOCK        11059200                //晶振頻率是11.0592MHZ
  16. #define SYSCLOCK        12000000                //晶振頻率是12MHZ

  17. u8 heighHR0, heighLR0;//PWM一個(gè)周期中高電平高字節(jié)和低字節(jié)重載值
  18. u8 lowHR0, lowLR0;//PWM一個(gè)機(jī)器周期中低電平時(shí)高字節(jié)和低字節(jié)重載值



  19. /*使用T0配置PWM高低電平的頻率*/
  20. void PWM_Config(u16 fr, u8 dc)  //fr為PWM的頻率,100HZ無閃爍,dc是PWM的占空比(高電平占的百分比)
  21. {
  22.         u32 tmp;
  23.         u16 heigh, low;
  24.         
  25.         tmp = SYSCLOCK/12;//一個(gè)機(jī)器周期頻率
  26.         tmp = tmp / fr;  //一個(gè)機(jī)器周期中fr的頻率所需計(jì)數(shù)值(包括高電平和低電平)
  27.         heigh = (tmp * dc) / 100;//高電平占dc%,所需計(jì)數(shù)值
  28.         low   = tmp - heigh;//低電平所需計(jì)數(shù)值
  29.         heigh = 65536-heigh;//高電平計(jì)數(shù)初值
  30.         low   = 65536-low;//低電平計(jì)數(shù)初值
  31.         
  32.         heighHR0 = (u8)(heigh >> 8);//高電平裝入初值的高字節(jié)
  33.         heighLR0 = (u8)heigh;    //高電平裝入初值的低字節(jié)
  34.         lowHR0   = (u8)(low >> 8);  //低電平裝入初值的高字節(jié)
  35.         lowLR0   = (u8)low;    //低電平裝入初值的低字節(jié)
  36.         
  37.         TMOD &= 0xF0;//清零T0控制位
  38.         TMOD |= 0x01;//設(shè)定T0工作方式1,16位可設(shè)定時(shí)器
  39.         TH0 = heighHR0;
  40.         TL0 = heighLR0;//裝入高電平計(jì)數(shù)初值
  41.         PWMOUTLED = 1;//開始時(shí)PWM輸出高電平
  42.         TR0 = 1;
  43.         ET0 = 1;
  44.         EA  = 1;
  45. }

  46. /*關(guān)閉PWM*/
  47. void PWM_Close()
  48. {
  49.         TR0 = 0;//關(guān)閉Timer0
  50.         ET0 = 0;//關(guān)閉T0中斷
  51.         PWMOUTLED = 1;//PWM輸出高電平
  52. }

  53. void main()
  54. {
  55.         u16 i=0;
  56.         int cont=0;
  57.         u8 fx=0;

  58.         while (1)     //呼吸燈效果
  59.         {
  60.                 if(fx==0)
  61.                 {
  62.                         cont+=10;
  63.                         if(cont>=90)
  64.                                 fx=1;        
  65.                 }
  66.                 else
  67.                 {
  68.                         cont-=10;
  69.                         if(cont<=0)
  70.                                 fx=0;        
  71.                 }
  72.                
  73.                
  74.                 //LED亮->暗
  75.                 PWM_Config(100, cont);//配置PWM頻率為100HZ,占空比為10%
  76.                 for (i = 0; i < 30000; i++); //軟件測試延時(shí)大約76ms

  77.                 PWM_Close();
  78.         }
  79. }


  80. /*定時(shí)器T0中斷服務(wù)*/
  81. void Timer0_ISP() interrupt 1
  82. {
  83.         //判斷PWM現(xiàn)在輸出的是高電平還是低電平
  84.         if (PWMOUTLED)
  85.         {
  86.                 TH0 = lowHR0;
  87.                 TL0 = lowLR0;//裝載低電平計(jì)數(shù)初值
  88.                 PWMOUTLED = 0;//PWM輸出低電平
  89.         }
  90.         else
  91.         {
  92.                 TH0 = heighHR0;
  93.                 TL0 = heighLR0;//重裝裝載高電平計(jì)數(shù)初值
  94.                 PWMOUTLED = 1;//PWM輸出高電平
  95.         }
  96. }


復(fù)制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:332444 發(fā)表于 2021-2-25 16:45 | 只看該作者
回復(fù)

使用道具 舉報(bào)

板凳
ID:419909 發(fā)表于 2021-3-1 11:43 | 只看該作者
呼吸燈就是調(diào)PWM,參考我之前分享的一個(gè)代碼
/*********************************************************************/
可以調(diào)任意頻率周期與占空比,工作原理就是一個(gè)周期的方波,將其分割成若干份,再根據(jù)高,低電平所占的份數(shù)來決定輸出占空比。份數(shù)越多。占空比越精確。以下代碼就是將一個(gè)周期內(nèi)的方波分割成100份,用count累加,即count累加100次為一個(gè)周期,在這個(gè)周期內(nèi)計(jì)數(shù)時(shí),persent用于設(shè)置占空比。count數(shù)值小于persent時(shí)就輸出高電平,不是就輸出低電平,這個(gè)函數(shù)可以放在任意位置,要更精準(zhǔn),也可以放在定時(shí)器內(nèi)執(zhí)行。
主要代碼:/***********************
count:用于計(jì)數(shù)。
persent: 設(shè)置占空比,值為1-100,這個(gè)可根據(jù)所設(shè)置的份數(shù)適當(dāng)改變
PWM_OUT:用于輸出PWM濾形的引腳。
***********************/
void Adj_PWM(unsigned int p)
{
static unsigned int count, persent;
persent=p;
if(count<100) count++;else count=0;  // 100以內(nèi)累加。
if(count<=persent) PWM_OUT=1; else PWM_OUT=0; 設(shè)置占空比。即100份之中,高低電平所占的份數(shù)多少就是占空比數(shù)。
}
回復(fù)

使用道具 舉報(bào)

地板
ID:235055 發(fā)表于 2021-3-1 12:16 | 只看該作者
heighHR0 = (u8)(heigh >> 8);//高電平裝入初值的高字節(jié)
heighLR0 = (u8)heigh; //高電平裝入初值的低字節(jié)
其中,(u8)代表強(qiáng)制類型轉(zhuǎn)換,把16位的heigh左移8位后也就是他原本的高八位取出,因?yàn)閡8強(qiáng)制轉(zhuǎn)換成8位數(shù)據(jù),只取低八位,所以必須左移之和才能取出高八位,低八位只要直接強(qiáng)制類型轉(zhuǎn)換就好了
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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