欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機PWM精確輸出按鍵可調輸出周期占空比1602顯示程序
[打印本頁]
作者:
MR_CHEN12
時間:
2018-12-26 23:59
標題:
51單片機PWM精確輸出按鍵可調輸出周期占空比1602顯示程序
51PWM精確輸出按鍵可調輸出周期占空比,誤差可以達到零點幾以內。1602顯示當前輸出PWM周期占空比。
單片機源程序如下:
#include <reg51.h>
#include <intrins.h>
#include "lcd.h"
unsigned char code ASCII[10] = {'0','1','2','3','4','5','6','7','8','9'};
unsigned char period[]="Period:";
unsigned char high[]="Duty:";
unsigned char disbuff[10];
unsigned int peri =1000;
unsigned int value=600; //初始占空比為60% 周期為1ms
sbit PWM=P2^1; //PWM輸出口
sbit K1=P1^0; //占空比增加鍵
sbit K2=P1^1; //占空比減小鍵
sbit K3=P1^2; //周期增加鍵
sbit K4=P1^3; //周期減小鍵
void TimerInit()
{
TMOD=0X11;
TH0 = (unsigned int)(65536-peri)/256;
TL0 = (unsigned int)(65536-peri)%256; //1ms周期
TH1 = (unsigned int)(65536-value)/256;
TL1 = (unsigned int)(65536-value)%256; //600us高電平時間
ET0=1;//打開定時器0中斷允許
ET1=1;
TR0=1;//打開定時器
TR1=0;//打開定時器
EA=1;//打開總中斷
}
void delay(unsigned int i)
{
while(i--);
}
void Key_Scan()
{
if(K1==0)
{
delay(1000);
if(K1==0)
{
value+=20; //占空比增加
if(value>=peri)
{
value=peri;
}
}
while(!K1);
}
if(K2==0)
{
delay(1000);
if(K2==0)
{
value-=20; //占空比減小
if(value<=0)
{
value=0;
}
}
while(!K2);
}
if(K3==0)
{
delay(1000);
if(K3==0)
{
peri+=100;//周期增加100us
}
while(!K3);
}
if(K4==0)
{
delay(1000);
if(K4==0)
{
peri-=100; //周期減小100us
}
while(!K4);
}
}
void main(void)
{
InitLcd1602();
TimerInit();
while(1)
{
int zhanbi;
Key_Scan();
LcdShowStr(0,0,period); //顯示周期
LcdShowStr(0,1,high); //顯示占空比
disbuff[0]=peri/10000;
disbuff[1]=peri%10000/1000;
disbuff[2]=peri%1000/100;
disbuff[3]=peri%100/10;
disbuff[4]=peri%10;
DisplayOneChar(7,0,ASCII[disbuff[0]]);
DisplayOneChar(8,0,ASCII[disbuff[1]]);
DisplayOneChar(9,0,ASCII[disbuff[2]]);
DisplayOneChar(10,0,ASCII[disbuff[3]]);
DisplayOneChar(11,0,ASCII[disbuff[4]]);
DisplayOneChar(12,0,'u');
DisplayOneChar(13,0,'s');
zhanbi=(value/10*100)/(peri/10);
disbuff[0]=zhanbi/10;
disbuff[1]=zhanbi%10;
DisplayOneChar(7,1,ASCII[disbuff[0]]);
DisplayOneChar(8,1,ASCII[disbuff[1]]);
DisplayOneChar(9,1,'%');
}
}
void Time0(void) interrupt 1
{
TH0 = (unsigned int)(65536-peri+30)/256; //加30彌補中斷事件,具體可通過調節數值達到彌補效果
TL0 = (unsigned int)(65536-peri+30)%256; //通過改變peri改變周期大小
PWM=1;
TR1=1;
}
void Time1(void) interrupt 3
{
TH1 = (unsigned int)(65536-value+20)/256; //加20彌補中斷事件,具體可通過調節數值達到彌補效果
TL1 = (unsigned int)(65536-value+20)%256; //通過改變value改變占空比
PWM=0;
TR1=0;
}
//經示波器測定占空比誤差百分之一左右通過自己調節彌補值大小可以達到誤差百分之零點五以下
復制代碼
所有資料51hei提供下載:
PWM輸出修改版.zip
(55.03 KB, 下載次數: 195)
2018-12-26 23:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
紫色的云
時間:
2018-12-27 09:06
謝謝樓主的分享,學習學習
作者:
Melbourne
時間:
2018-12-27 10:17
可以外部產生方波 單片機解析并控制電機正反轉嗎
作者:
Melbourne
時間:
2018-12-27 10:18
可以用NE555電路產生方波給單片機控制電機轉動嗎?
作者:
鄉下人
時間:
2018-12-30 11:24
Melbourne 發表于 2018-12-27 10:18
可以用NE555電路產生方波給單片機控制電機轉動嗎?
這樣得不償失,為什么不直接用單片機來控制?
作者:
綠豌豆
時間:
2019-8-28 22:10
哪位能下載的,可以發給我一份嗎,謝謝。黑幣不夠了,我的郵箱
3211131912@qq.com
作者:
綠豌豆
時間:
2019-8-31 20:55
求一下電路圖,順便問一下,按照程序里的引腳定義接線后,下載程序后,為什么沒有輸出
作者:
樹先生37
時間:
2020-5-23 15:59
學習一下
作者:
zwdong
時間:
2022-7-26 00:02
很好。 這個代碼可以用ADC采集過來的變量控制空占比。 實現自動調速。感謝
作者:
玖123
時間:
2022-7-27 13:41
main函數下初始化里少了這個代碼導致1602不顯示
P1 &= 0xf0; //屏蔽低四位
加上數碼管就顯示了
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1