为了不封号发帖,一个简单的利用定时器中断产生pwm

2020-01-21 21:37发布

由于本人单片机只是业余爱好,一直没发帖,最近不发贴就封号,不得已发个贴,望大家海涵
单片机是stc15f104,按键功能就是3段调光
*****************************************************
*******************************************************/
#include<STC15F104E.h>
#include <intrins.h>
#define uchar unsigned char
sbit k1 = P3^4;
sbit pwm1=P3^2;
uchar keycom,tm0cm;
uchar keyda;
uchar pwmda;
void pwmsz (void);
/**************************keydelay******************/
           void keydelay (void)
  {   
      uchar i=200;
      while ( i--);
          }
/**********************keyjc***************************/
             uchar keyjc ( void )
  { uchar i,x;
          if (k1==0){for (i=40;i>0;i--){if (k1==1) {x=0;goto ned;}
          keydelay();} while(!k1); x=1;}else x=0; ned: return (x); }
/************************************keyexe************/
          void keyexe (void)
        { uchar i;
                  i=keyjc();
                if(i==1){ keyda++; pwmsz();if(keyda>3) keyda=0;}
                 
        }
/*****************************pwmsz****************/
                   void pwmsz (void)
        { if(keyda==0) pwmda=10;
          if(keyda==1) pwmda=83;
          if(keyda==2) pwmda=168;
          if(keyda==3) pwmda=250;
         }
/*******************************iosz*****************/
            void iosz (void)
     {  P3M1=0x10; //设置p34为高阻输入
            P3M0=0x04; //设置p32为推挽输出
            }
/***************************tm0sz*******************/
           void tm0sz ( void)
         {          
                 //AUXR=0XC0;
             TCON =0x30; //开TM0中断
             //TMOD =0x03; // 设置tm0,tm1为8位定时器
                IE=0x82;//开全局中断
         }
/*************************************tm0中断********************/
       void tm0pwm () interrupt 1
        {  
             
                 if(tm0cm==0)
                { TL0=pwmda; tm0cm=1;
            if(keyda==0) pwm1=0;
                 else pwm1=1;
                 goto end;
                 }
                 if(tm0cm==1)
                { TL0=255-pwmda; tm0cm=0;
          if(keyda==3) pwm1=1;
                 else pwm1=0;
                  goto end;
                 }
         end: TH0=0xff;
              _nop_();
         }
            
/*************************************/
       void main(void)
  {
   iosz();
   tm0sz();
   while (1)
   { keyexe(); }
  }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
62条回答
kcfoo1
1楼-- · 2020-01-25 02:36
lxa0 发表于 2014-11-22 18:25
楼主这代码是几路输出的pwm?

1路,stc15f104就2个定时器,要用实时性强的中断法pwm最多做两路,如果对pwm没有严格要求,可以用计数查询的方法产生很多路,但是处理别的程序比如按键检测时可能会对pwm有影响
kcfoo1
2楼-- · 2020-01-25 03:33
程序 if(i==1){ keyda++; pwmsz();if(keyda>3) keyda=0;} 处有错误
应该是if(i==1){ keyda++; if(keyda>3) keyda=0;pwmsz();}
SXH201312
3楼-- · 2020-01-25 04:19
kcfoo1 发表于 2014-11-23 21:39
1块几的stc15f104不带pwm。同样的价格,stm8s003就功能强大多了,但是封装不好生产,只是为了用sop8的封 ...

我们现在正在用STM8S003开发产品,不好生产是不是因为它的脚距啊?

你用SOP8是不是用过锡炉的而不是回流焊?
kcfoo1
4楼-- · 2020-01-25 05:24
SXH201312 发表于 2014-11-24 09:09
我们现在正在用STM8S003开发产品,不好生产是不是因为它的脚距啊?

你用SOP8是不是用过锡炉的而不是回流 ...

一般有插件的都是打红胶过波峰焊呀,除非全贴片的,
huojianfei
5楼-- · 2020-01-25 05:36
 精彩回答 2  元偷偷看……
hyghyg1234
6楼-- · 2020-01-25 10:14

小Q截图-20141124102310.png (6.64 KB, 下载次数: 0)

下载附件

2014-11-24 10:23 上传


用这个贴代码会比较整齐,另外建议你注释详细点,这样自己理解更深刻,别人看起来也更明朗。

一周热门 更多>