|
40黑币
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar time;
double count=50; //定义占空比,并初始占空比为50%
sbit PWM=P3^0; //P2^0口输出PWM
sbit zkb_add=P3^6; //占空比增加的按键 的I/O口
sbit zkb_dec=P3^7; //占空比减小 的按键 的I/O口
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极数码管0~9编码
/*******数码管显示占空比********************/
void display_pwm()//占空比显示
{
uchar shi,ge;
shi=count/10; //十位
ge=count%10; //个位
dula=0;
P1=table[shi];
delayms(5);
dula=1;
wela=0;
P1=table[ge];
delayms(5);
wela=1;
}
/****************延时处理**********************/
void delayms(uint z) //延时xms程序
{
uint x,y;
for(y=z;x>0;x--)
for(y=110;y>0;y--);
}
void keyscan() //按键扫描
{
display_pwm();
if(zkb_add==0)
{
count=count+10; //每按一次占空比增加按键占空比加10%
if(count>100) //限定占空比上限
{
count=0;
}
}
if(zkb_dec==0)
{
count=count-10; //每按一次占空比减小按键占空比减10%
if(count<0) //限定占空比下限
{
count=100;
}
}
}
/***********定时器0初始化***********/
void timer0_init()
{
TMOD=0x01; //定时器0工作于方式1
TH0=(65536-10)/256;
TL0=(65536-10)%256;
TR0=1;
ET0=1;
EA=1;
}
/**************定时0中断处理******************/
void timer0_init() interrupt 1
{
TR0=0; //设置定时器初值期间,关闭定时器
TH0=(65536-10)/256;
TL0=(65536-10)%256;
TR0=1;
time++;
if(time<count) //count为占空比
{
PWM=1; //输出高电平
}
else
PWM=0;
if(time>=100)
{
time=0;
}
display_pwm();
}
/*********主函数********************/
void main()
{
timer0_init();
delayms(5);
while(1)
{
keyscan();
}
}
//急急急,仿真后数码管和输出pwm的io口没有变化,一直处于高电平 求助一下论坛的朋友老师,还请指正,单片机界的小学生在此谢过。
|
最佳答案
查看完整内容
占空比1~99可调,
#include
typedef unsigned char uchar;
typedef unsigned int uint;
sbit Key1=P3^0;
sbit Key2=P3^1;
sbit PWM=P1^0;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar count,time,i;
void delayms(uint k)
{
uint i,j;
for(i=k;i>0;i--)
for(j=110;j>0;j--);
}
void Timer0Init() //100微秒@12.000 ...
|