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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2761|回復: 3
打印 上一主題 下一主題
收起左側

單片機PWM呼吸燈程序問題

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

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


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


  9. //對數據類型進行聲明定義
  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一個周期中高電平高字節和低字節重載值
  18. u8 lowHR0, lowLR0;//PWM一個機器周期中低電平時高字節和低字節重載值



  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的頻率所需計數值(包括高電平和低電平)
  27.         heigh = (tmp * dc) / 100;//高電平占dc%,所需計數值
  28.         low   = tmp - heigh;//低電平所需計數值
  29.         heigh = 65536-heigh;//高電平計數初值
  30.         low   = 65536-low;//低電平計數初值
  31.         
  32.         heighHR0 = (u8)(heigh >> 8);//高電平裝入初值的高字節
  33.         heighLR0 = (u8)heigh;    //高電平裝入初值的低字節
  34.         lowHR0   = (u8)(low >> 8);  //低電平裝入初值的高字節
  35.         lowLR0   = (u8)low;    //低電平裝入初值的低字節
  36.         
  37.         TMOD &= 0xF0;//清零T0控制位
  38.         TMOD |= 0x01;//設定T0工作方式1,16位可設定時器
  39.         TH0 = heighHR0;
  40.         TL0 = heighLR0;//裝入高電平計數初值
  41.         PWMOUTLED = 1;//開始時PWM輸出高電平
  42.         TR0 = 1;
  43.         ET0 = 1;
  44.         EA  = 1;
  45. }

  46. /*關閉PWM*/
  47. void PWM_Close()
  48. {
  49.         TR0 = 0;//關閉Timer0
  50.         ET0 = 0;//關閉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中斷服務*/
  81. void Timer0_ISP() interrupt 1
  82. {
  83.         //判斷PWM現在輸出的是高電平還是低電平
  84.         if (PWMOUTLED)
  85.         {
  86.                 TH0 = lowHR0;
  87.                 TL0 = lowLR0;//裝載低電平計數初值
  88.                 PWMOUTLED = 0;//PWM輸出低電平
  89.         }
  90.         else
  91.         {
  92.                 TH0 = heighHR0;
  93.                 TL0 = heighLR0;//重裝裝載高電平計數初值
  94.                 PWMOUTLED = 1;//PWM輸出高電平
  95.         }
  96. }


復制代碼

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 美女黄网 | 国产成人高清视频 | 亚洲精品视频在线观看视频 | 日韩一区在线观看视频 | 日韩欧美在线视频 | 精品国产一区二区三区观看不卡 | 99久久婷婷国产亚洲终合精品 | 久久久久久毛片免费观看 | 亚洲一区免费 | 久久99精品国产99久久6男男 | 欧美一级久久久猛烈a大片 日韩av免费在线观看 | 亚洲欧美视频 | 亚洲一区二区三区在线播放 | 欧美三级电影在线播放 | 一级国产精品一级国产精品片 | 国产日韩欧美一区二区 | 怡红院免费的全部视频 | 91网视频| 午夜一级黄色片 | 天天干天天想 | 亚洲精品在线观看网站 | 欧美激情在线精品一区二区三区 | www视频在线观看 | 免费a网 | 一区二区三区四区在线播放 | 91久久久久久久久久久久久 | 一区视频| 精品中文字幕视频 | 日韩一区二区三区视频 | 中文字幕一区在线观看视频 | 不卡视频一区二区三区 | 在线播放中文 | 黄色一级视频 | 亚洲综合大片69999 | 久久精品视频在线播放 | 日韩免费视频 | 久久国产精品免费一区二区三区 | 午夜久久久 | 亚洲视频在线免费观看 | 国产欧美精品一区二区三区 | 日韩欧美视频 |