程序自己模仿的 可是仿真出来pwm端口一直处于高电平状态 想问问是什么问题
电路原理图如下:
单片机源程序:
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ALL 65536 //定时器工作方式1时,最大基数长度 65536;
- #define F_osc 12000000 //晶振频率12M;
- sbit s1=P3^2;//上调频率(500-9500hz)
- sbit s2=P3^3;
- sbit s3=P3^4;//上调占空比(0.1-0.9)
- sbit s4=P3^5;
- sbit pwm=P1^0;
- int i=0,q=0.5,f=500;//设置初值占空比0.5 频率0.5khz
- void delay(uchar t); //延时函数,用于按键去抖;
- void init(); //初始化函数,用于定时器的初始化;
- void key_scan(); //按键扫描函数;
- void timer0;
- void delay(uchar t);
- void delay(uchar t)
- {
- uchar a,b;
- while(t--) //每个脉冲为1us
- {
- for(a=0;a<100;a++)
- for(b=0;b<100;b++);
- }
- }
- void key_scan()
- {
- delay(4);
- if(!s1)
- {
- f=f+500;;
- {
- if(f>9500)
- f=500;
- }
- }
- if(!s2)
- {
- f=f-500;
- {
- if(f<500)
- f=9500;
- }
- }
- if(!s3)
- {
- q=q+0.1;
- {
- if(q>0.9)
- q=0.1;
- }
- }
- if(!s4)
- {
- q=q-0.1;
- {
- if(q<0.1)
- q=0.9;
- }
- }
- }
- void timer0() interrupt 1
- { TR0=1;
- TH0=(65536-(10000*(double (1/f)))/256;
- TL0=(65536-(10000*(double (1/f)))%256;
- i++;
- if(i<=100*q)
- pwm=1;
- if(100*q<i<=100)
- pwm=0;
- if(i>100)
- i=0;
- void init()
- {
- TMOD=0x01;
- ET0=1;
- EA=1;
- TR0=1;
- }
- void main()
- {
- init();
- while(1)
- {
- key_scan();
- }
- }
复制代码
|