找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

一個(gè)單片機(jī)PWM程序出問(wèn)題

[復(fù)制鏈接]
ID:472242 發(fā)表于 2021-8-5 08:30 | 顯示全部樓層 |閱讀模式
一個(gè)輸出的PWM, 80是開(kāi)起占空比,0是關(guān)閉占空比。這個(gè)器件外接一個(gè)振動(dòng)開(kāi)關(guān),當(dāng)有振動(dòng)開(kāi)關(guān)信號(hào)時(shí)(開(kāi)關(guān)碰到地),有PWM輸出,此時(shí)占空比 = 80,并且持續(xù)3秒鐘,無(wú)PWM輸出,此時(shí)占空比 = 0;1分鐘內(nèi)振動(dòng)開(kāi)關(guān)只有第一次有效 。后面循環(huán)下去。
我的寫(xiě)法如下:
                if(ZDK == 0)//振動(dòng)開(kāi)關(guān)碰到地
                        {
                                ZZ++; //碰到地計(jì)時(shí)間
                                if(ZDK == 1)CONT++;//碰到地后抬起的次數(shù)
                        }
                                if((ZZ < 1500)&&(CONT <= 1))//如果在3秒內(nèi)并且只有第一次進(jìn)入
                                {
                                 PWM= 80;//輸出PWM
                                }
                         if((ZZ>4)&&(ZZ<54))//PWM無(wú)輸出
                                {
                                        PWM = 0;        
                                }
                        if(ZZ > 54)//60
                                {
現(xiàn)在情況是開(kāi)關(guān)在一分鐘內(nèi)多次有效,望友友們有好的方法

回復(fù)

使用道具 舉報(bào)

ID:473159 發(fā)表于 2021-8-5 11:08 | 顯示全部樓層
看看,有一點(diǎn)難度咯
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2021-8-5 13:57 | 顯示全部樓層
本帖最后由 lkc8210 于 2021-8-5 22:41 編輯
  1. uint delayms_3s = 0;
  2. uint delayms_60s = 0;
  3. void TimerX() interrupt x //定時(shí)器X中斷,1ms
  4. {
  5.       if(delayms_3s)delayms_3s--;
  6.       if(delayms_60s)delayms_60s--;
  7. }
  8. void main()
  9. {
  10. if(!delayms_60s)
  11. {
  12.      if(!delayms_3s)
  13.      {
  14.          if(PWM==80)
  15.          {
  16.              delayms_60s=60000;
  17.              PWM=0;
  18.          }
  19.          if(ZDK==0 && delayms_60s!=60000)
  20.          {
  21.              delayms_3s=3000;
  22.              PWM=80;
  23.          }
  24.      }
  25. }
  26. }
復(fù)制代碼


評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
shuisheng60 + 15 贊一個(gè)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2021-8-5 18:51 | 顯示全部樓層
此代碼只是表示控制PWM的邏輯關(guān)系
  1. #include <reg51.h>

  2. sbit ZDK=P3^0;

  3. bit sign=0;

  4. void InitTimer0(void)
  5. {
  6.     TMOD = 0x01;
  7.     TH0 = 0x3C;
  8.     TL0 = 0xB0;
  9.     EA = 1;
  10.     ET0 = 1;
  11.     TR0 = 0;
  12. }

  13. void main(void)
  14. {
  15.         InitTimer0();
  16.         P1=0x00;
  17.         while(1)
  18.         {
  19.             if(!ZDK && TR0==0)
  20.                 {
  21.                         TR0=1;
  22.                         P1=0x80;
  23.                 }
  24.         }
  25. }

  26. void Timer0Interrupt(void) interrupt 1
  27. {  
  28.         static unsigned int i;       
  29.         TH0 = 0x3C;
  30.         TL0 = 0xB0;
  31.         i++;
  32.         if(i<=60)//3秒
  33.                 P1=0x80;
  34.         if(i>60&&i<=1200)
  35.                 P1=0x00;
  36.         if(i>=1200)//60秒
  37.         {
  38.                 i=0;
  39.                 sign=0;
  40.                 TR0=0;
  41.         }
  42. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:472242 發(fā)表于 2021-8-5 18:52 | 顯示全部樓層

if(PWM==80)不能在這里作判斷,報(bào)錯(cuò)咯,希望再接再厲!
回復(fù)

使用道具 舉報(bào)

ID:472242 發(fā)表于 2021-8-5 19:12 | 顯示全部樓層
wulin 發(fā)表于 2021-8-5 18:51
此代碼只是表示控制PWM的邏輯關(guān)系

謝謝所提意見(jiàn),可能是我說(shuō)的不夠清楚,我再將此功能說(shuō)一下,PWM是一個(gè)恒定超聲波(80單位占空比),是受外界控制器(振動(dòng)開(kāi)關(guān))控制,當(dāng)外界有較大振動(dòng)時(shí),振動(dòng)開(kāi)關(guān)動(dòng)作(開(kāi)關(guān)碰到地),會(huì)產(chǎn)生3秒恒定超聲波,過(guò)后停止(0單位占空比),再待有振動(dòng)再噴。而卻1分鐘內(nèi)振動(dòng)開(kāi)關(guān)只有第一次有效 。
回復(fù)

使用道具 舉報(bào)

ID:472242 發(fā)表于 2021-8-5 19:29 | 顯示全部樓層

為什么要設(shè)一個(gè)分鐘以內(nèi)振動(dòng)次數(shù)只有一次有效?是因?yàn)檎駝?dòng)開(kāi)關(guān)動(dòng)作大時(shí),會(huì)多次碰到地,導(dǎo)致PWM長(zhǎng)時(shí)間輸出,造成影響
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2021-8-5 22:41 | 顯示全部樓層
shuisheng60 發(fā)表于 2021-8-5 18:52
if(PWM==80)不能在這里作判斷,報(bào)錯(cuò)咯,希望再接再厲!

我給的代碼是不完整的當(dāng)然報(bào)錯(cuò)只是給你一個(gè)思路和代碼寫(xiě)法
完整代碼的效果:(亮3秒后10秒無(wú)動(dòng)作)

ezgif.com-gif-maker (1).gif

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
shuisheng60 + 15 贊一個(gè)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:472242 發(fā)表于 2021-8-6 08:03 | 顯示全部樓層
lkc8210 發(fā)表于 2021-8-5 22:41
我給的代碼是不完整的當(dāng)然報(bào)錯(cuò)只是給你一個(gè)思路和代碼寫(xiě)法
完整代碼的效果:(亮3秒后10秒無(wú)動(dòng)作)

非常感謝你的回復(fù),你現(xiàn)在做出來(lái)的效果也是正確的!昨天試了好幾次也沒(méi)做出來(lái),希望友友不吝分享一下代碼!在此謝過(guò)!
回復(fù)

使用道具 舉報(bào)

ID:744327 發(fā)表于 2021-8-6 08:26 | 顯示全部樓層
樓主代碼寫(xiě)的很好,點(diǎn)贊一下
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2021-8-6 10:39 | 顯示全部樓層
shuisheng60 發(fā)表于 2021-8-6 08:03
非常感謝你的回復(fù),你現(xiàn)在做出來(lái)的效果也是正確的!昨天試了好幾次也沒(méi)做出來(lái),希望友友不吝分享一下代碼 ...

發(fā)一下你的代碼看看改成怎樣
回復(fù)

使用道具 舉報(bào)

ID:130230 發(fā)表于 2021-8-6 11:45 | 顯示全部樓層
你的count沒(méi)清0吧,時(shí)間長(zhǎng)了是因?yàn)閏ount溢出了自動(dòng)為0了。
回復(fù)

使用道具 舉報(bào)

ID:472242 發(fā)表于 2021-8-6 12:07 | 顯示全部樓層
lkc8210 發(fā)表于 2021-8-6 10:39
發(fā)一下你的代碼看看改成怎樣

用了一個(gè)標(biāo)志位,是一進(jìn)到開(kāi)關(guān)內(nèi)就清0,結(jié)果還是一樣,總是控制不了在一分鐘內(nèi)的噪音,還是希望友友的代碼能分享一下,讓我們見(jiàn)識(shí)見(jiàn)識(shí)
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2021-8-6 13:52 | 顯示全部樓層
shuisheng60 發(fā)表于 2021-8-6 12:07
用了一個(gè)標(biāo)志位,是一進(jìn)到開(kāi)關(guān)內(nèi)就清0,結(jié)果還是一樣,總是控制不了在一分鐘內(nèi)的噪音,還是希望友友的代 ...


真PWM輸出就不寫(xiě)了,用一支腳的高低電平代替
  1. #include "reg51.h"
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit PWM_EN = P2^0;
  5. sbit ZDK = P2^1;

  6. uint delayms_3s = 0;
  7. uint delayms_60s = 0;
  8. uchar PWM = 0;
  9. void Timer1Init()
  10. {
  11.     //AUXR |= 0x40;                //定時(shí)器時(shí)鐘1T模式
  12.     TMOD &= 0x0F;                //設(shè)置定時(shí)器模式
  13.     TMOD |= 0x10;                //設(shè)置定時(shí)器模式
  14.                 TL1 = 0x18;                //設(shè)置定時(shí)初始值1ms@12.000MHz 12T
  15.                 TH1 = 0xFC;                //設(shè)置定時(shí)初始值1ms@12.000MHz 12T
  16.     //TL1 = 0x20;                //設(shè)置定時(shí)初始值1ms@12.000MHz 1T
  17.     //TH1 = 0xD1;                //設(shè)置定時(shí)初始值1ms@12.000MHz 1T
  18.     TF1 = 0;                //清除TF0標(biāo)志
  19.     TR1 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  20. }
  21. void timer1_int () interrupt 3
  22. {
  23.                 TL1 = 0x18;                //設(shè)置定時(shí)初始值1ms@12.000MHz 12T
  24.                 TH1 = 0xFC;                //設(shè)置定時(shí)初始值1ms@12.000MHz 12T
  25.     //TL1 = 0x20;                //設(shè)置定時(shí)初始值1ms@12.000MHz 1T
  26.     //TH1 = 0xD1;                //設(shè)置定時(shí)初始值1ms@12.000MHz 1T
  27.                 if(delayms_3s)delayms_3s--;
  28.                 if(delayms_60s)delayms_60s--;
  29. }
  30. void Sys_Init()
  31. {
  32.     ET1 = 1;                        //Timer1 interrupt Enable
  33.     EA = 1;                                //All interrupt Enable
  34. }
  35. void main()
  36. {
  37.         Timer1Init();
  38.                 Sys_Init();
  39.         while (1)
  40.         {
  41.                 if(!delayms_60s)
  42.                 {
  43.                                  if(!delayms_3s)
  44.                                  {
  45.                                                  if(PWM==80)
  46.                                                  {
  47.                                                                  delayms_60s=10000;
  48.                                                                  PWM=0;
  49.                                                  }
  50.                                                  if(ZDK==0 && delayms_60s!=10000)
  51.                                                  {
  52.                                                                  delayms_3s=3000;
  53.                                                                  PWM=80;
  54.                                                  }
  55.                                  }
  56.                 }
  57.                 PWM_EN = (PWM == 80);
  58.         }
  59. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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