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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

一個單片機PWM程序出問題

[復制鏈接]
跳轉到指定樓層
樓主
一個輸出的PWM, 80是開起占空比,0是關閉占空比。這個器件外接一個振動開關,當有振動開關信號時(開關碰到地),有PWM輸出,此時占空比 = 80,并且持續3秒鐘,無PWM輸出,此時占空比 = 0;1分鐘內振動開關只有第一次有效 。后面循環下去。
我的寫法如下:
                if(ZDK == 0)//振動開關碰到地
                        {
                                ZZ++; //碰到地計時間
                                if(ZDK == 1)CONT++;//碰到地后抬起的次數
                        }
                                if((ZZ < 1500)&&(CONT <= 1))//如果在3秒內并且只有第一次進入
                                {
                                 PWM= 80;//輸出PWM
                                }
                         if((ZZ>4)&&(ZZ<54))//PWM無輸出
                                {
                                        PWM = 0;        
                                }
                        if(ZZ > 54)//60
                                {
現在情況是開關在一分鐘內多次有效,望友友們有好的方法

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

使用道具 舉報

沙發
ID:473159 發表于 2021-8-5 11:08 | 只看該作者
看看,有一點難度咯
回復

使用道具 舉報

板凳
ID:161164 發表于 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 //定時器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. }
復制代碼


評分

參與人數 1黑幣 +15 收起 理由
shuisheng60 + 15 贊一個!

查看全部評分

回復

使用道具 舉報

地板
ID:213173 發表于 2021-8-5 18:51 | 只看該作者
此代碼只是表示控制PWM的邏輯關系
  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. }
復制代碼
回復

使用道具 舉報

5#
ID:472242 發表于 2021-8-5 18:52 | 只看該作者

if(PWM==80)不能在這里作判斷,報錯咯,希望再接再厲!
回復

使用道具 舉報

6#
ID:472242 發表于 2021-8-5 19:12 | 只看該作者
wulin 發表于 2021-8-5 18:51
此代碼只是表示控制PWM的邏輯關系

謝謝所提意見,可能是我說的不夠清楚,我再將此功能說一下,PWM是一個恒定超聲波(80單位占空比),是受外界控制器(振動開關)控制,當外界有較大振動時,振動開關動作(開關碰到地),會產生3秒恒定超聲波,過后停止(0單位占空比),再待有振動再噴。而卻1分鐘內振動開關只有第一次有效 。
回復

使用道具 舉報

7#
ID:472242 發表于 2021-8-5 19:29 | 只看該作者

為什么要設一個分鐘以內振動次數只有一次有效?是因為振動開關動作大時,會多次碰到地,導致PWM長時間輸出,造成影響
回復

使用道具 舉報

8#
ID:161164 發表于 2021-8-5 22:41 | 只看該作者
shuisheng60 發表于 2021-8-5 18:52
if(PWM==80)不能在這里作判斷,報錯咯,希望再接再厲!

我給的代碼是不完整的當然報錯只是給你一個思路和代碼寫法
完整代碼的效果:(亮3秒后10秒無動作)



評分

參與人數 1黑幣 +15 收起 理由
shuisheng60 + 15 贊一個!

查看全部評分

回復

使用道具 舉報

9#
ID:472242 發表于 2021-8-6 08:03 | 只看該作者
lkc8210 發表于 2021-8-5 22:41
我給的代碼是不完整的當然報錯只是給你一個思路和代碼寫法
完整代碼的效果:(亮3秒后10秒無動作)

非常感謝你的回復,你現在做出來的效果也是正確的!昨天試了好幾次也沒做出來,希望友友不吝分享一下代碼!在此謝過!
回復

使用道具 舉報

10#
ID:744327 發表于 2021-8-6 08:26 | 只看該作者
樓主代碼寫的很好,點贊一下
回復

使用道具 舉報

11#
ID:161164 發表于 2021-8-6 10:39 | 只看該作者
shuisheng60 發表于 2021-8-6 08:03
非常感謝你的回復,你現在做出來的效果也是正確的!昨天試了好幾次也沒做出來,希望友友不吝分享一下代碼 ...

發一下你的代碼看看改成怎樣
回復

使用道具 舉報

12#
ID:130230 發表于 2021-8-6 11:45 | 只看該作者
你的count沒清0吧,時間長了是因為count溢出了自動為0了。
回復

使用道具 舉報

13#
ID:472242 發表于 2021-8-6 12:07 | 只看該作者
lkc8210 發表于 2021-8-6 10:39
發一下你的代碼看看改成怎樣

用了一個標志位,是一進到開關內就清0,結果還是一樣,總是控制不了在一分鐘內的噪音,還是希望友友的代碼能分享一下,讓我們見識見識
回復

使用道具 舉報

14#
ID:161164 發表于 2021-8-6 13:52 | 只看該作者
shuisheng60 發表于 2021-8-6 12:07
用了一個標志位,是一進到開關內就清0,結果還是一樣,總是控制不了在一分鐘內的噪音,還是希望友友的代 ...


真PWM輸出就不寫了,用一支腳的高低電平代替
  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;                //定時器時鐘1T模式
  12.     TMOD &= 0x0F;                //設置定時器模式
  13.     TMOD |= 0x10;                //設置定時器模式
  14.                 TL1 = 0x18;                //設置定時初始值1ms@12.000MHz 12T
  15.                 TH1 = 0xFC;                //設置定時初始值1ms@12.000MHz 12T
  16.     //TL1 = 0x20;                //設置定時初始值1ms@12.000MHz 1T
  17.     //TH1 = 0xD1;                //設置定時初始值1ms@12.000MHz 1T
  18.     TF1 = 0;                //清除TF0標志
  19.     TR1 = 1;                //定時器0開始計時
  20. }
  21. void timer1_int () interrupt 3
  22. {
  23.                 TL1 = 0x18;                //設置定時初始值1ms@12.000MHz 12T
  24.                 TH1 = 0xFC;                //設置定時初始值1ms@12.000MHz 12T
  25.     //TL1 = 0x20;                //設置定時初始值1ms@12.000MHz 1T
  26.     //TH1 = 0xD1;                //設置定時初始值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. }
復制代碼



回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91视视频在线观看入口直接观看 | 国产精品国产三级国产aⅴ原创 | 免费久久精品视频 | 国产在线不卡 | 国产黄色在线观看 | 日本一区二区在线视频 | 国产精华一区 | 免费日韩网站 | 精品国产不卡一区二区三区 | 欧美日韩成人在线 | 欧美视频免费 | 美女在线观看av | 就操在线| 玖玖免费 | 精品久久久久久中文字幕 | 欧美激情五月 | 一级黄色播放 | 美女一级黄 | 自拍视频精品 | 黄色一级免费观看 | 精品在线观看一区 | 久久亚洲欧美日韩精品专区 | 婷婷精品| 日韩欧美在线视频一区 | 天天躁天天操 | 在线色网站 | 激情一区二区三区 | 国产亚洲精品精品国产亚洲综合 | av永久免费| 成人福利电影 | 99精品欧美一区二区三区 | 久久精品久久久久久 | 国产91丝袜在线播放 | av一区二区三区四区 | 亚洲欧美国产精品一区二区 | 久久久久国产一区二区三区四区 | 国产精品毛片无码 | 日韩在线视频一区 | 美女日批免费视频 | 亚洲午夜精品一区二区三区他趣 | 欧美综合一区 |