为了不封号发帖,一个简单的利用定时器中断产生pwm
由于本人单片机只是业余爱好,一直没发帖,最近不发贴就封号,不得已发个贴,望大家海涵单片机是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(); }
} 不发贴也不封号啊。怕怕。。。 你号是盗的么?不是盗的你慌什么? 哈哈,学习学习了。{:titter:} 为了不封号回个帖 支持一下楼主。 支持一下楼主。LZ搞个酷贴就可以无忧了!{:lol:} 哎,我看看不说话多不行了吗,赶紧来顶一下。 好心酸的感觉啊 楼主可以再贴下原理图、实物图,这样方便大家交流学习~ 支持一下 支持一下 支持一下~~~~~~~ 这样不是挺麻烦的,还要定时器没有PWM输出?
为了不封号我也准备发一帖,先支持一下! 大家多贡献一点,增加下活力和气氛吧 我想知道:请教问题也算发帖吗? 支持分享,共同进步! mark,顶一下贴 什么情况/................... 楼主这代码是几路输出的pwm? 赞下{:smile:} 51单片机我基本不用了,改投stm32阵营了 SXH201312 发表于 2014-11-22 14:24
这样不是挺麻烦的,还要定时器没有PWM输出?
1块几的stc15f104不带pwm。同样的价格,stm8s003就功能强大多了,但是封装不好生产,只是为了用sop8的封装才用stc15f104 lxa0 发表于 2014-11-22 18:25
楼主这代码是几路输出的pwm?
1路,stc15f104就2个定时器,要用实时性强的中断法pwm最多做两路,如果对pwm没有严格要求,可以用计数查询的方法产生很多路,但是处理别的程序比如按键检测时可能会对pwm有影响 程序 if(i==1){ keyda++; pwmsz();if(keyda>3) keyda=0;} 处有错误
应该是if(i==1){ keyda++; if(keyda>3) keyda=0;pwmsz();}
kcfoo1 发表于 2014-11-23 21:39
1块几的stc15f104不带pwm。同样的价格,stm8s003就功能强大多了,但是封装不好生产,只是为了用sop8的封 ...
我们现在正在用STM8S003开发产品,不好生产是不是因为它的脚距啊?
你用SOP8是不是用过锡炉的而不是回流焊? SXH201312 发表于 2014-11-24 09:09
我们现在正在用STM8S003开发产品,不好生产是不是因为它的脚距啊?
你用SOP8是不是用过锡炉的而不是回流 ...
一般有插件的都是打红胶过波峰焊呀,除非全贴片的, 好久没用goto了
用这个贴代码会比较整齐,另外建议你注释详细点,这样自己理解更深刻,别人看起来也更明朗。 支持下! 我也没发过贴 我菜鸟一个 哈哈,赞一个~ 回帖应该也算的吧 为了不封号回个帖 这也行啊,那我也来水一贴吧; 不错,赞一个~ 看看已示存在 支持下~ 不错!stc的很少用,支持下楼主{:lol:} 谢谢分享,mark 学习了!还没用过goto语句!goto是不是汇编语句啊,还是keil的语句啊! lz分割线习惯和我一模一样 我也想发帖,无奈水平不够,没什么东西能让人感兴趣,故不要露丑了 支持一下下
页:
[1]