|
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 ...
|