51单片机pwm波求助

2019-03-24 17:56发布

#include <reg52.h>

#define uint unsigned int
#define uchar unsigned char

//参数定义
sbit pwm=P1^0;
sbit key_plus=P3^6;
sbit key_reduce=P3^7;
sbit duan=P2^6;
sbit wei=P2^7;

uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint i;
char j,k=50;

//子函数声明
void timer_init();
void delayms(uint x);
void show(int a);
void adjust_pwm();

//主函数
void main()
{
  timer_init();
  while(1)
  {
    adjust_pwm();
  }
}

//定时器0初始化
void timer_init()
{
  TMOD=0x01;
  TH0=(65536-1000)/256;
  TL0=(65536-1000)%256;
  ET0=1;
  TR0=1;
  EA=1;
}

//定时器0服务函数
void timer0() interrupt 1
{
  TH0=(65536-1000)/256;
  TL0=(65536-1000)%256;
//  if(i==10)         //100HZ
//  {
//   i=0;
//   j++;
//   if(j==100) j=0;
//  }
   j++;           //1000HZ
  if(j==100) j=0;
  if(j<k)
  {
   pwm=1;
  }
  else
  pwm=0;
}

//延时函数 x 毫秒
void delayms(uint x)
{
   uint i,j;
   for(i=x;i>0;i--)
   for(j=110;j>0;j--);
}

//数码管显示
void show(int a)
{
  int shi,ge;
  shi=a/10;
  ge=a%10;

  //显示十位
  duan=1;
  P0=tab[shi];
  duan=0;
  P0=0xff;
  wei=1;
  P0=0xfe;
  wei=0;
  delayms(3);

  //显示个位
  duan=1;
  P0=tab[ge];
  duan=0;
  P0=0xff;
  wei=1;
  P0=0xfd;
  wei=0;
  delayms(3);
}

//按键控制速度
void adjust_pwm()
{
if(key_plus==0)
{
  delayms(5);
  if(key_plus==0)
  {
    k++;
   if(k>99)
   {
           k=0;
   }
   while(!key_plus);
  }
}
if(key_reduce==0)
{
  delayms(5);
  if(key_reduce==0)
  {
   k--;
   if(k<0)
   {
           k=99;
   }
   while(!key_reduce);
  }
}
   show(k);
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
automomaek
2019-03-25 21:20
ketose 发表于 2015-7-11 19:43
STC15系列1T周期,12M晶振
void Timer0Init(void)                //10微秒@12.000MHz
{
        AUXR | ...

我的是89C52,还不是1T,晶振11.0592的,问题是示波器才200多hz

一周热门 更多>