|
//20kHz PWM 可調,步進2%。帶顯示,樓主小菜菜上課溜號了頻率不會寫,下面代碼應該是1khz的,該怎么改呢???還請諸位不吝賜教,先行謝過了- /* Main.c file generated by New Project wizard
- *
- * Created: 周六 5月 30 2020
- * Processor: AT89C51
- * Compiler: Keil for 8051
- */
- #include<reg51.h>
-
-
- #define uint unsigned int
-
- #define uchar unsigned char
- unsigned char num1;
-
- unsigned char dis;
- unsigned char code nondis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9
- uchar time;
-
- double count=70; //定義占空比,并初始占空比為70%
-
- sbit PWM=P0^0; //P0^0口輸出PWM
-
- sbit key_add=P3^4; //加的按鍵
-
- sbit key_dec=P3^5; //減的按鍵
-
-
-
-
- void delayxms(uint z); //延時
-
- void Motor_add(); //增加占空比
-
- void Motor_dec(); //減少占空比
-
- void timer0_init(); //定時器0初始化
- //顯示函數
- void display()
- {
-
-
- unsigned char gewei,shiwei,baiwei;
- baiwei=num1/100;
- gewei=num1%10;
- shiwei=(num1/10)%10;
- P2=nondis[gewei];//個位
- P0=0x80;
- delayxms(1);
- P2=0xff;
- P2=nondis[shiwei];//十位
- P0=0x40;
- delayxms(1);
- P2=0xff;
- P2=nondis[baiwei];//百位
- P0=0x20;
- delayxms(1);
- P2=0xff;
-
- }
-
-
-
- void main()
-
- {
-
- timer0_init();
-
- delayxms(5);
-
- while(1)
-
- {
- Motor_add();
-
- Motor_dec();
- num1 = count;
- display();//顯示函數
-
- }
-
- }
-
-
- //延時xms程序
- void delayxms(uint z) //延時xms程序
-
- {
-
- uint x,y;
-
- for(y=z;x>0;x--)
-
- for(y=110;y>0;y--);
-
- }
-
-
- //加
- void Motor_add()
-
- {
-
- if(key_add==0)
-
- {
-
- delayxms(2); //此處時間不能太長,否者會的中斷產生沖突
-
- if(key_add==0)
-
- {
-
- count+=2; //每按一次加速按鍵占空比加2
-
- if(count>=98) //限定占空比上限
-
- {
-
- count=98;
-
- }
-
- }
-
- while(!key_add);
-
- }
-
- }
-
- //減
- void Motor_dec()
-
- {
-
- if(key_dec==0)
-
- {
-
- delayxms(2);//此處時間不能太長
-
- if(key_dec==0)
-
- {
-
- count-=2; //每按一次減速按鍵占空比減2
-
- if(count<=25) //限定占空比下限
-
- {
-
- count=25;
-
- }
-
- }
-
- while(!key_dec);
-
- }
-
- }
-
-
- /***********定時器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_int() 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)//20khz
-
- {
-
- time=0;
-
- }
-
- }
復制代碼
|
-
888.png
(180.25 KB, 下載次數: 89)
下載附件
2020-5-31 21:16 上傳
仿真圖哥哥們
|