⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm三通道输出.c

📁 用2051编的能同时产生三路可调的PWM波
💻 C
字号:
//-----------------------函数声明,变量定义----------------------------------------------
#include <reg51.h>
#include <intrins.h>
//#include<ABSACC.h>  
//-----------------------定义管脚--------------------------------------------------------
sbit 1PWM=P1^0;
sbit 2PWM=P1^1;
sbit 3PWM=P1^2;             //PWM波形输出 

sbit tr=P1^7 ;	            //485通讯控制脚
//------------------------------------------------------------------------------------------------
#define uint unsigned int
#define uchar unsigned char
//------------------------------------------------------------------------------------------------
#define ADDRESS0 0x01
#define ADDRESS1 0x02
#define ADDRESS2 0x03
#define  timer_data  (256-100) //定时器预置值,12M时钟是,定时0.05ms
#define  PWM_T 100     //定义LPWM的周期T为5ms 100	  周期越大速度越慢

unsigned char PWM_t1,PWM_t2,PWM_t3;       //PWM_t为脉冲宽度(0~100)时间为0~5ms
unsigned char time_count;  //定时计数
uint l,m,n; //定义全局变量




//--------------------------------------------------------------------------------------------------
// 函数名称:timer_init
// 函数功能:初始化设施定时器
//--------------------------------------------------------------------------------------------------
void timer_init(void)
     {
      TMOD=0x22; //定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) 
      PCON=0x00;
      SCON=0xd8; //串行口模式3,TB8=1发送地址呼叫
      EA=1;             //中断允许
      ES=1;ET0=1;ET1=0;
      PS=1;PT0=0;	
      TF0=0;TF1=0;
      //RI=0;TI=0;
      TH0=timer_data;   //保证定时时长为0.1ms
      TL0=TH0;
      TH1=0xfd;         //产生9600波特率
      TL1=0xfd; 
      // ET0=1;
      TR0=1;            //开始计数
      // ET1=1;
      TR1=1;            //开始计数
      tr=0;		//设置为接收
     }

//--------------------------------------------------------------------------------------------------
// 函数名称:setting_PWM
// 函数功能:设置PWM的脉冲宽度
//--------------------------------------------------------------------------------------------------
void setting_PWM(uint x,uint y,uint z)
 {
   PWM_t1=x;
   PWM_t2=y;
   PWM_t3=z;
 }

//--------------------------------------------------------------------------------------------------
// 函数名称:IntTimer0
// 函数功能:定时器中断处理程序
//--------------------------------------------------------------------------------------------------
void IntTimer0() interrupt 1	using 1
  {
     time_count++;	  
     if(time_count>=PWM_T)
      {
        time_count=0;
        setting_PWM(l,m,n);  //每输出一个PWM波调用一次
      } 
     if(time_count<PWM_t1)1PWM=0;
     else 1PWM=1;
     if(time_count<PWM_t2)2PWM=0;
     else 2PWM=1;
     if(time_count<PWM_t3)3PWM=0;
     else 3PWM=1;   
  }



   
//主函数//------------------------------------------------------------------------------------------------
 
//中断接收程序

void sevice_serial(void)interrupt 4 using 1

{
  uchar rs;uchar i=0;ES=0;
  if(RI==1)
  {
    RI=0;
    tr=0;
    while(RI==0);RI=0;
    rs=SBUF;
    if(rs==0xff) //是复位命令
    {
      ES=1;
    }
    else if(rs==ADDRESS0)
    {
      tr=1;
      SBUF=ADDRESS0; //用本机地址作为应答
      while(TI==0);
      TI=0;
      tr=0;
      while(RI==0);RI=0;   //下面开始接收
      l=SBUF;
      tr=1;
      SBUF=1;
      while(TI==0);TI=0;
    }
    else if(rs==ADDRESS1)
    {
      tr=1;
      SBUF=ADDRESS1; //用本机地址作为应答
      while(TI==0);
      TI=0;
      tr=0;
      while(RI==0);RI=0;   //下面开始接收
      m=SBUF;
      tr=1;
      SBUF=1;
      while(TI==0);TI=0;
    } 
    else if(rs==ADDRESS2)
    {
      tr=1;
      SBUF=ADDRESS2; //用本机地址作为应答
      while(TI==0);
      TI=0;
      tr=0;
      while(RI==0);RI=0;   //下面开始接收
      n=SBUF;
      tr=1;
      SBUF=1;
      while(TI==0);TI=0;
    }
    else ES=1; //不是呼叫本机
  }
  ES=1;
}

void main(void)
{ 
  //IE=0;
  timer_init();
  l=50;m=50;n=50;
  while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -