STC单片机IO方波脉冲输出

来源:互联网 发布:windows phone 知乎 编辑:程序博客网 时间:2024/05/22 17:41


有时候我们工作中要组建的系统结构简单,只用到了简单的stc51系列的单片机,但是考虑到驱动一些1-Wire控制的芯片,需要用到一定形式的方波信号,可以的是我们的stc内部没有PWM调制输出IO,只有用一些其他的办法来模仿。

一般我个人使用下面两个方法,各有自己的方便之处:


方法一:


一般可以使用两个定时器(工作方式2:8位重装模式)来实现,
用T0定时器完成PWM输出,脉宽固定,T1来决定高平的宽带来进行PWM调制


代码如下:

#include < reg51.h >#include < intrins.h >sbit  K1 =P1^4 ;                    //增加键sbit  K2 =P1^5 ;                    //减少键sbit  P00 =P0^1;unsigned char PWM=0xe7;   //赋初值void delayms(unsigned char ms);void delay(unsigned char t);/*********************************************************/void main(){      P1=0xff;    TMOD=0x21 ;    TH0=0xff ;             //50us延时常数    TL0=0xce ;            //频率调节    TH1=PWM ;            //脉宽调节    TL1=0 ;     EA=1;     ET0=1;     ET1=1;        TR0=1 ;   while(1)   {     do{            if(PWM!=0xff)           {PWM++ ;delayms(10);}           else Beep() ;         }     while(K1==0);     do{           if(PWM!=0xce)          {PWM-- ;delayms(10);}           else Beep() ;          }     while(K2==0);   }}void timer0() interrupt 1{     TR1=0 ;    TH0=0xff ;    TL0=0xce ;    TH1=PWM ;    TR1=1 ;    P00=0 ;      //启动输出}void timer1() interrupt 3{    TR1=0 ;    P00=1 ;     //结束输出}/*********************************************************/// 延时子程序/*********************************************************/ void delay(unsigned char t) {    while(t--)   ; }/*********************************************************/// 延时子程序/*********************************************************/void delayms(unsigned char ms){    unsigned char i ;    while(ms--)     {        for(i = 0 ; i < 120 ; i++) ;     }}/*********************************************************/



如果不需要连续的脉冲,就像我这次一样,只需要确定低电平的时间以及几个上升沿,可以直接用IO口来模仿出方波即可。下面贴出代码:


#include <reg51.h>#include <intrins.h>typedef unsigned int uint;typedef unsigned char uchar;sbit bo=P2^2;sbit key2=P3^0;sbit key3=P3^1;sbit key4=P3^2;static int Cout;void delay_ms(uint mt){uint x,y;for(x=mt;x>0;x--){for(y=114;y>0;y--);}}void delay_10us(){_nop_();}void boproduce(Cout){for(;Cout>=1;Cout--){bo=0;delay_10us();bo=1;}}void  main(){while(1){if(~key2){delay_ms(10);if(~key2){boproduce(3);}}if(~key3){delay_ms(10);if(~key3){boproduce(2);}}if(~key4){delay_ms(10);if(~key4){boproduce(1);}}}}




2 0
原创粉丝点击