查看: 2215|回复: 1
打印 上一主题 下一主题

用单片机制作的占空比均匀间隔可调PWM发生器。

[复制链接]
跳转到指定楼层
沙发
发表于 2014-8-5 08:54:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#include<reg52.h>
#define uint unsigned int
uint pp;
char num=2,dis;
sbit pwm=P1^0;
sbit s2=P3^4;
sbit s3=P3^5;
sbit dula=P2^0;  //段选信号的锁存器控制
sbit wela=P2^1;  //位选信号的锁存器控制
sbit cs88=P2^2;         //点阵管的锁存器控制        cs88=0;//关点阵管
sbit LCD1602=P2^5; //定义LCD1602使能端,用于HJ-C52实验板复位,与本实验无关
sbit DS1302=P2^7;  //定义DS1302时钟使能端,用于HJ-C52实验板复位,与本实验无关
sbit SD=P2^6;      //定义SD卡使能端,用于HJ-C52实验板复位,与本实验无关
void cmg88()//关数码管,点阵函数            cmg88();//关数码管,点阵函数
{
dula=1;  
P0=0x00;
dula=0;
cs88=0x00;
P0=0x00;
cs88=1;
}
unsigned char code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void keyscan()
{
if(s2==0)
{
  while(!s2);
  num++;
  if(num==11)
   num=10;
  dis=num;
}
if(s3==0)
{
  while(!s3);
  num--;
  if(num==-1)
   num=0;
  dis=num;
}
}
void display(a)
{
   dula=0;
   P0=table[a];
   dula=1;
   dula=0;
   
   wela=0;
   P0=0xfe;
   wela=1;
   wela=0;   
}
void main()
{
TMOD=0x01;   //模式设置,00000001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。
TR0=1;    //打开定时器
TH0=0Xff;   //定时器设置,每隔100微秒发起一次中断。
TL0=0Xa4;
ET0=1;    //开定时器0中断
EA=1;    //开总中断

//主板初始化 因51单片机芯片开机时各个IO口输出为高电平,加上以下源代码是为了防止各种外部模块误动作
    DS1302=0; //关DS1302模块,与本实验无关
    SD=0;//关SD卡模块,与本实验无关
    LCD1602=0;//关LCD1602模块,与本实验无关
    cs88=0;//关点阵管
while(1)
{
  keyscan();
  if((num!=0)&&(num!=10)) //对于占空比为0和100%这两种极端情况,最好分离出,单独考虑
  {
   if(pp<=num)
    pwm=1;
   else
    pwm=0;
  }
  else if(num==0) //当占空比为0
   pwm=0;
  else
   pwm=1;
  if(pp==10)  //当占空比为100%
   pp=0;
display(num);//显示num当前值,占空比为num/10。
}
}
void time0() interrupt 1
{ TH0=0Xff;
TL0=0Xa4;
pp++;
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表