STC单片机IO方波脉冲输出


有时候我们工作中要组建的系统结构简单,只用到了简单的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);
			}
		}		
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值