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

📄 test.c

📁 C52单片机生成PWM信号程序
💻 C
字号:
#include <reg52.h>

/******led 接口描述******/
//P0--->(a-g,dot) 显示
//选择使能控制段
//P2^3--->使能左第一个数码管  P2^2--->左第二个数码管  
//P2^1--->左第三个数码管  P2^0--->左第四个数码管


/* 晶振采用11.0592M,产生的PWM的频率约为91Hz */

sbit P3_0=P3^0;  //过热保护信号接入点

sbit en1=P1^0;  //M1的使能
sbit en2=P1^1; //M2的使能
sbit s1=P1^2;//M1
sbit s2=P1^3;
sbit s3=P1^4;//M2
sbit s4=P1^5;

/*********显示数据表 对应0-9 ,a-f*************/
unsigned char code table[16]={0x3f,6,0x5b,0x4f,
                  0x66,0x6d,0x7d,7,0x7f,0x6f,0x77,
				  0x7c,0x58,0x5e,0x79,0x71};
/**********显示选择表***********************/
unsigned char code digit[4]={0xf8,0xf4,0xf2,0xf1};

/*****定义一个数组变量用于存放将要显示的值*******/

unsigned char d[4]={0,0,0,0}; //随意放入一些初始值  

/*****定义一个全局变量 number******/
unsigned char number;   //number 表示第几个显示 0-3 

unsigned char f;//全局变量 用于判断翻转

unsigned char wind;  //风类计数

unsigned char t;//用于PWM计数

unsigned char m1;//用于计数对应风类

/******按键接口描述********/
//左第一 二 三 四 个按键分别对应于 P2.7 P2.6 P2.5 P2.4 
//左第一个按键键值为1 
//左第二个按键键值为2 
//左第三个按键键值为3 
//左第四个按键键值为4
 
void delay1(const unsigned int DELAY);
/******延时DELAY个ms子程序********/
void delay1(const unsigned int DELAY)
{
unsigned int x,y;
    for(x=0;x<=DELAY;x++)
    {for(y=0;y<120;y++);}
}


/******延时程序********/
void delay (dy)
{
while(--dy);
}

/******读取按键子程序 getkey()*************/
unsigned char getkey (void)
{    unsigned char k,tem,keytem;
     keytem=0;
     tem=P2 & 0xf0;			 //第一次读取按键值
     if(tem!=0xf0)			//判断有无按键按下
     {   
         for(k=0;k<40;k++)
         delay(250);		 //延时一段时间
         tem=P2 & 0xf0;		//再次读取按键值
         if(tem!=0xf0)
         {    if(tem==0x70) keytem=1;	       //表示左第一个按键按下
              else if(tem==0xb0) keytem=2;	   //表示左第二个按键按下
              else if(tem==0xd0) keytem=3;	   //表示左第三个按键按下
              else if(tem==0xe0) keytem=4;	   //表示左第四个按键按下
         }
      }
      
      while(tem!=0xf0) tem=P2 & 0xf0;  //等待按键释放 
      return(keytem);				   //返回按键值
}

/******停止M1 M2  TR2********/   //TR1负责M1  TR2负责M2
void stop()
{
 s1=0;
 s2=0;
 s3=0;
 s4=0;
 TR2=0;
 delay(500);
}


/*****M2正反转********/
void rotate()
{
 stop();
 TR2=1;
 if(f)
 {
  s3=0;
  s4=1;
 }
 else
 {
  s3=1;
  s4=0;
 }
}


/********定时器0中断服务程序***************/
void timer0(void) interrupt 1 
{
 TR0=0;					 //停止定时器0
 TH0=(65536-1000)/256;	 //通过定时器定时延时大约1ms左右
 TL0=(65536-1000)%256;
 number=(number+1)%4;
 P2=digit[number];       //选择第number个数码管显示
 P0=table[d[number]];    //查表显示要显示的值
 TR0=1;				     //启动定时器0
 }

/******定时器0初始化函数**********/
void Init_Timer0 (void)
{
  TMOD=0x01;   			 //
  TH0=(65536-1000)/256;	 //通过定时器定时延时大约1ms左右
  TL0=(65536-1000)%256;
  EA=1;
  ET0=1;
  TR0=1;
}

/******定时器1初始化函数**********/
void Init_Timer1 (void)
{
  t=0;
  if(wind==1) m1=4;
  else if(wind==2) m1=8;
  else m1=2;
  en1=0;
  TMOD=0x11;               //
  TH1=(65536-1000)/256;    //通过定时器定时延时大约1ms左右
  TL1=(65536-1000)%256;
  EA=1;
  ET1=1;
  TR1=1;
  
  s1=1;
  s2=0;//设置M1初值
}


/********定时器1中断服务程序***************/ //用于PWM
void timer1(void) interrupt 3
{
 TR1=0;                  //停止定时器1
 TH1=(65536-1000)/256;   //通过定时器定时延时大约1ms左右
 TL1=(65536-1000)%256;
 if(t<m1) en1=1;  /* 产生电机1的PWM信号 */   
 else en1=0;
 t++;
 if(t>=10) t=0; /* 1个PWM信号由10次中断产生 */
 TR1=1;                  //启动定时器1
}

/******定时器2初始化函数**********/

void Init_Timer2 (void)
{
 T2CON = 0x04; //设置寄存器,使定时器2工作在可编程时钟输出状态
 T2MOD = 0x02;	

 RCAP2H=(65536-3000)/256;//自动重载高8位, 
 RCAP2L=(65536-3000)%256;//低8位; 
 EA=1;
 ET2=1;
 TR2=1;//开定时器2
}



/********定时器2中断服务程序***************/ //用于正反转
//定时器工作于16位自动重装模式
void timer2(void) interrupt 5       //硬件的规定
{TR2=0;
 TF2=0;                  //人为清零(必须)
 rotate();     //M2正反转
 f=~f;         //取反
 TR2=1;                  //启动定时器2
 }




/********主函数************/
//效果就是用定时器服务程序的实现数码管动态..
//..显示且按键后对应的数码管数据加1
/*************************/
void main (void)
{
unsigned char keyboard;  //存放按键值

unsigned char time;  //定时计数
unsigned char timesum;//定时总数
unsigned char sway;  //摇头指示

unsigned char count;//倒计数
wind=0;
time=0;
sway=0;


while(1)
	{
	 keyboard=getkey();
        if (keyboard==1)       //按键设定风速
        {
         wind++;
         if(wind>3)      //默认按键3次以上设为3
         wind=3;
        }
        else if(keyboard==2)   //按键2设定定时时间
        { time++;
         if(time>6)       //默认定时6次以上设为6
         time=6;
        }
        
        else if(keyboard==3)    //按键3控制摇头
        {
         sway=1;//摇头指示成立
        }
        else if(keyboard==4) //确认键
        {
            d[0]=wind;
            if(time==0)    //对于定时的初始处理
            {
                d[1]=0;
                d[2]=0;
                d[3]=8;
            }
            else
            {
               d[1]=time;                //显示定时次数
               d[2]=time;               //显示定时的总时间
               timesum=10*time;
            }
			Init_Timer0();           //定时器初始化
            Init_Timer1();           //定时器1初始化 开始PWM

            if(sway==1)
            {
              Init_Timer2();//定时器2初始化 控制正反转
            }

            for(count=timesum;count>=0;count--)
            {
              d[2]=count/10;     //倒计时十位
              d[3]=count%10;     //倒计时个位
              delay1(1000);       //每延时1s更改倒计时数
            }

            if((time!=0)&&(count==0))//有定时功能 且定时结束时
            {
                stop();//电机M1 M2停转  TR2=0  定时器2也停止?       
			}

	    }

	}
		  
}

⌨️ 快捷键说明

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