欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機PWM呼吸燈程序問題

[復(fù)制鏈接]
ID:880867 發(fā)表于 2021-2-18 16:21 | 顯示全部樓層 |閱讀模式
heighHR0 = (u8)(heigh >> 8);//高電平裝入初值的高字節(jié)
heighLR0 = (u8)heigh; //高電平裝入初值的低字節(jié)
想問這個是怎么裝入的過程?heigh是16位的嗎?高電平裝入初值的低字節(jié)這個過程沒看懂?求大佬舉例詳解
單片機源程序如下:

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


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


  9. //對數(shù)據(jù)類型進行聲明定義
  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一個周期中高電平高字節(jié)和低字節(jié)重載值
  18. u8 lowHR0, lowLR0;//PWM一個機器周期中低電平時高字節(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;//一個機器周期頻率
  26.         tmp = tmp / fr;  //一個機器周期中fr的頻率所需計數(shù)值(包括高電平和低電平)
  27.         heigh = (tmp * dc) / 100;//高電平占dc%,所需計數(shù)值
  28.         low   = tmp - heigh;//低電平所需計數(shù)值
  29.         heigh = 65536-heigh;//高電平計數(shù)初值
  30.         low   = 65536-low;//低電平計數(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è)定時器
  39.         TH0 = heighHR0;
  40.         TL0 = heighLR0;//裝入高電平計數(shù)初值
  41.         PWMOUTLED = 1;//開始時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++); //軟件測試延時大約76ms

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


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


復(fù)制代碼

回復(fù)

使用道具 舉報

ID:332444 發(fā)表于 2021-2-25 16:45 | 顯示全部樓層
回復(fù)

使用道具 舉報

ID:419909 發(fā)表于 2021-3-1 11:43 | 顯示全部樓層
呼吸燈就是調(diào)PWM,參考我之前分享的一個代碼
/*********************************************************************/
可以調(diào)任意頻率周期與占空比,工作原理就是一個周期的方波,將其分割成若干份,再根據(jù)高,低電平所占的份數(shù)來決定輸出占空比。份數(shù)越多。占空比越精確。以下代碼就是將一個周期內(nèi)的方波分割成100份,用count累加,即count累加100次為一個周期,在這個周期內(nèi)計數(shù)時,persent用于設(shè)置占空比。count數(shù)值小于persent時就輸出高電平,不是就輸出低電平,這個函數(shù)可以放在任意位置,要更精準(zhǔn),也可以放在定時器內(nèi)執(zhí)行。
主要代碼:/***********************
count:用于計數(shù)。
persent: 設(shè)置占空比,值為1-100,這個可根據(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ù)

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

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

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