用51單片機實現pwm專題及常見問題 - CSDN

2020-12-21 CSDN技術社區

基於51單片機脈衝寬度調製(即PWM)直流電機轉速快慢以及霍爾測速的項目

一、前言

1、基於51單片機脈衝寬度調製(即PWM)直流電機轉速快慢以及霍爾測速的項目包括用Keil軟體編寫單片機C語言程序和用Proteus軟體仿真單片機外圍電路

2、基於51單片機脈衝寬度調製(即PWM)直流電機轉速快慢以及霍爾測速的項目構思

(1)、實現什麼功能:LCD1602字符型液晶顯示器先顯示時分秒,在點擊移位按鍵後,停止計時,LCD1602字符型液晶顯示器光標閃爍,每次按下移位鍵,LCD1602字符型液晶顯示器光標隨每次按下移位鍵移位到時分秒個位十位處閃爍,當LCD1602字符型液晶顯示器的時分秒個位十位有閃爍後,可修改LCD1602字符型液晶顯示器的時分秒個位十位閃爍位上的數值,再通過移位按鍵或啟停按鍵啟動或停止計時。

(2)、如何實現功能:如何讓LCD1602字符型液晶顯示器先顯示時分秒:採用定時器0工作方式1計時,計時得到的數值賦給LCD1602字符型液晶顯示器顯示時間兩位數分解函數進行分解,分解得到的個位數值與十位數值用變量代替分別由LCD1602字符型液晶顯示器寫指令函數和LCD1602字符型液晶顯示器寫數據函數寫入LCD1602字符型液晶顯示器,通過LCD1602字符型液晶顯示器顯示出來。如何讓LCD1602字符型液晶顯示器的時分秒個位十位閃爍:採用按鍵掃描函數掃描,每次按下移位鍵(此時定時器0停止計時),執行LCD1602字符型液晶顯示器光標閃爍指令和LCD1602字符型液晶顯示器光標隨每次按下移位鍵移位到時分秒個位十位處閃爍的位置指令。如何修改LCD1602字符型液晶顯示器的時分秒個位十位閃爍位數值並在原計時基礎上實現計時:當移位鍵按下後,定時器0停止計時,計時得到的數值採用兩位數分解公式(如:shi=num/10,ge=num%10。)進行分解,分解得到的個位數值與十位數值用變量代替寫入按鍵掃描函數,此時也要採用兩位數合成公式(如:miao=shi+ge=(num/10)*10+num%10)求出原先的計時數值,用變量代替原先的計時數值寫入按鍵掃描函數(原因:時分秒的個位或十位顯示位的數值是在原計時數值上分解得來,當時分秒的個位或十位顯示位的數值發生變化後,原計時數值也要變化,否則啟動定時器0計時後,LCD1602字符型液晶顯示器顯示的是原計時時間,而不是修改時分秒的個位或十位顯示位的數值後的計時,因此要採用兩位數合成公式(miao=shi+ge=(num/10)*10+num%10)求出原先的計時數值,用變量代替原先的計時數值寫入按鍵掃描函數。)。

二、基於51單片機脈衝寬度調製(即PWM)直流電機轉速快慢以及霍爾測速的項目的Keil軟體編寫的單片機C語言程序

#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit RS=P2^5;sbit RW=P2^6;sbit EN=P2^7;sbit qitingjian=P1^0;sbit zhengzhuanjian=P1^1;sbit fanzhuanjian=P1^2;sbit jiasujian=P1^3;sbit jiansujian=P1^4;sbit zhengzhuan=P2^0;sbit fanzhuan=P2^1;sbit zhuansuled=P2^2;sbit qitingled=P3^0;sbit zhengzhuangled=P3^1;sbit waibuzhongduanling=P3^2;sbit fanzhuangled=P3^3;uint qian,bai,shi,ge,zhuansu;uint pwmshi,pwmge;uchar pwm,Timer0count,Timer1count,maichongcount,qitingnum,zhengzhuanflag,fanzhuanflag;uchar code table0[]={'z','h','a','n','k','o','n','g','b','i',':'};uchar code table1[]={'z','h','u','a','n','s','u',':'};uchar code table2[]={'r','p','m'}; void Delay(uint z){ uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void WriteCommand(uchar command){ RS=0; RW=0; P0=command; Delay(5); EN=1; Delay(5); EN=0; } void WriteData(uchar information){ RS=1; RW=0; P0=information; Delay(5); EN=1; Delay(5); EN=0; } void LCD1602Init(){ WriteCommand(0x38); WriteCommand(0x08); WriteCommand(0x01); WriteCommand(0x06); WriteCommand(0x0c); } void LCD1602InitDisplay(){ uchar j; WriteCommand(0x80+0x00); for(j=0;j<11;j++) { WriteData(table0[j]); Delay(2); } WriteCommand(0x80+0x40); for(j=0;j<8;j++) { WriteData(table1[j]); Delay(2); } WriteCommand(0x80+0x4c); for(j=0;j<3;j++) { WriteData(table2[j]); Delay(2); } } void LCD1602DisplaySpeed(uint qian,bai,shi,ge){ LCD1602InitDisplay(); WriteCommand(0x80+0x0b); WriteData(pwmshi+0x30); WriteData(pwmge+0x30); WriteCommand(0x80+0x48); WriteData(qian+0x30); WriteData(bai+0x30); WriteData(shi+0x30); WriteData(ge+0x30); } void TimerInit(){ TMOD=0x11; TH0=(65536-10000)/256; TL0=(65536-10000)%256; TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1; EX0=1; IT0=1; ET0=1; TR0=1; ET1=1; TR1=1; } void Timer0() interrupt 1{ TH0=(65536-10000)/256; TL0=(65536-10000)%256; Timer0count++; if(Timer0count==10) { Timer0count=0; } if(qitingnum==1) { if(zhengzhuanflag==1) { if(Timer0count<pwm) { zhengzhuan=0; fanzhuan=1; zhuansuled=0; } else { zhengzhuan=1; fanzhuan=1; zhuansuled=1; } } if(fanzhuanflag==1) { if(Timer0count<pwm) { fanzhuan=0; zhengzhuan=1; zhuansuled=0; } else { fanzhuan=1; zhengzhuan=1; zhuansuled=1; } } } } void Timer1() interrupt 3{ TH1=(65536-50000)/256; TL1=(65536-50000)%256; Timer1count++; if(Timer1count==20) { Timer1count=0; EX0=0; zhuansu=55*maichongcount/24; qian=zhuansu/1000; bai=zhuansu%1000/100; shi=zhuansu%100/10; ge=zhuansu%10; LCD1602DisplaySpeed(qian,bai,shi,ge); maichongcount=0; EX0=1; } } void waibuzhongduanlingjishu() interrupt 0 using 1{ maichongcount++ ; } void KeyScan(){ if(qitingjian==0) { Delay(1); if(qitingjian==0) { Delay(1); while(!qitingjian); qitingnum++; qitingled=0; if(qitingnum==2) { qitingnum=0; qitingled=1; zhengzhuangled=1; fanzhuangled=1; zhuansuled=1; zhengzhuan=1; fanzhuan=1; zhengzhuanflag=0; fanzhuanflag=0; } } } if(qitingnum==1) { if(zhengzhuanjian==0) { Delay(1); if(zhengzhuanjian==0) { Delay(1); while(!zhengzhuanjian) zhengzhuangled=0; fanzhuangled=1; zhengzhuanflag=1; fanzhuanflag=0; } } if(fanzhuanjian==0) { Delay(1); if(fanzhuanjian==0) { Delay(1); while(!fanzhuanjian) zhengzhuangled=1; fanzhuangled=0; zhengzhuanflag=0; fanzhuanflag=1; } } } if(zhengzhuanflag==1||fanzhuanflag==1) { if(jiasujian==0) { Delay(1); if(jiasujian==0) { Delay(1); while(!jiasujian); if(pwm<10) { pwm++; pwmshi=pwm/10; pwmge=pwm%10; } if(pwm>=10) pwm=10; } } if(jiansujian==0) { Delay(1); if(jiansujian==0) { Delay(1); while(!jiansujian); if(pwm>0) { pwm--; pwmshi=pwm/10; pwmge=pwm%10; } if(pwm<=0) pwm=0; } } } } void main(){ TimerInit(); LCD1602Init(); while(1) { KeyScan(); } }

三、基於51單片機脈衝寬度調製(即PWM)直流電機轉速快慢以及霍爾測速的項目Proteus軟體仿真單片機外圍電路

四、基於51單片機脈衝寬度調製(即PWM)直流電機轉速快慢以及霍爾測速的項目的操作功能描述

(1)、不修改時分秒個位十位數值,只是啟動或停止計時的情況:如果第一次按下移位鍵,則停止計時,啟動計時可按下移位鍵7次或按下啟停鍵,再次停止計時可按下移位鍵或按下啟停鍵,再次啟動計時可按下移位鍵7次或按下啟停鍵,周而復始。如果第一次按下啟停鍵,則停止計時,啟動計時可按下移位鍵7次或按下啟停鍵,再次停止計時可按下移位鍵或按下啟停鍵,再次啟動計時可按下移位鍵7次或按下啟停鍵,周而復始。

(2)、修改時分秒個位十位數值,再啟動或停止計時的情況:要修改時分秒個位十位上的數值,再啟動或停止計時,首先必須按下移位鍵,此時停止計時,通過點擊移位鍵讓LCD1602字符型液晶顯示器光標移到時分秒相應個位十位數值上,利用點擊增加鍵或減少鍵修改數值,修改完畢後,啟動計時可按下移位鍵多次讓LCD1602字符型液晶顯示器光標回到秒鐘個位數值上或按下啟停鍵,停止計時可按下移位鍵或按下啟停鍵,當按下移位鍵時,又可修改時分秒個位十位上的數值,再次啟動計時可按下移位鍵多次讓LCD1602字符型液晶顯示器光標回到秒鐘個位數值上或按下啟停鍵,周而復始。

相關焦點

  • LED燈的51單片機pwm控制實例
    我們知道 51單片機本身是沒有pwm接口的,這個程序是通過軟體模擬pwm.在一定的頻率的方波中,調整高電平和低電平的佔空比,即可實現LED燈亮度控制
  • 基於51單片機設計的簡易智慧機器人
    1.2 總體設計方案和框圖本設計以at89c5l單片機作為檢測和控制核心。採用紅外光電傳感器檢測路面黑線及障礙物,使用金屬傳感器檢測路面下金屬鐵片,應用光電碼盤測距,用光敏電阻檢測、判斷車庫位置,利用pwm(脈寬調製)技術動態控制電動機的轉動方向和轉速。通過軟體編程實現機器人行進、繞障、停止的精確控制以及檢測數據的存儲、顯示。
  • 單片機C語言編程實現對舵機控制
    在智能小車編程過程中,舵機是實現小車避障、循跡的基礎。單片機通過控制舵機實現小車的轉向。本文主要介紹如何使用51單片機實現對舵機進行偏轉角度控制。所使用舵機型號為MG996R,使用晶片為STC89C52。
  • 51單片機PWM的控制
    二、51單片機的Timer作者用的單片機是STC89C52,其內部有3個16位Timer,分別為T/C0,T/C1,T/C2,通過配置相關寄存器即可實現Timer的功能控制當IT1=0時,為低電平觸發,也就是單片機檢測到該引腳電平為低時,會觸發外部中斷1 3 IE1 外部中斷1的中斷請求標誌位。當IE1=1的時候,表示外部中斷1被觸發,正在請求單片機處理中斷事件。當單片機相應中斷,處理中斷事件時,該位由單片機自動清零 4 TR0 啟動定時器/計數器0啟動位,功能和TR1類似 5 TF0 定時器/計數器T0溢出中斷請求標誌位。
  • 51單片機的Timer,運用PWM完成呼吸燈
    51單片機的Timer,運用PWM完成呼吸燈 李倩 發表於 2018-05-02 09:14:53 Pulse Width Modulation脈衝寬度調製,簡稱PWM
  • 對抗學習專題及常見問題 - CSDN
    那麼就是通過反覆加減對抗樣本製作時用的梯度,不斷詢問目標模型這些樣本的分類,從而使得雖然替代模型本身準確率不高,但梯度cost gradient sign matrix與其相關性高,做對抗樣本時輕鬆搞死原模型。而防禦方法對這種黑盒攻擊反而更沒有什麼用,因為原本模型裡的梯度只是被遮蔽mask了而不是消失。
  • PWM(脈寬調製)——LED特效呼吸燈設計
    LED特效呼吸燈原理  採用pwm的方式,在固定的頻率下,採用佔空比的方式來實現LED亮度的變化。佔空比為0,LED燈不亮,佔空比為100%,則LED燈最亮。所以將佔空比從0到100%,再從100%到0不斷變化,就可以實現LED燈實現特效呼吸。  設計思路、框圖    變亮:當cnt2 < cnt3時為高電平,反之為低電平。
  • 51單片機訪問大容量存儲器的實現
    1 引言  MCS-51系列單片機有著優越的性價比,因此應用面寬,使用量也非常大;然而它只有16位地址線,最大能訪問的存儲空間為64K,且擴展接口與存儲器統一編址,擴展接口會佔用大量的地址空間,致使該系列單片機在數據量大的數據採集系統中,存儲空間明顯不足
  • 學32位-51單片機的方法和思路
    對於有一定的單片機基礎,能夠熟練掌握51/avr單片機開發的同學來說,32位單片機,是比較好學的,因為不涉及linux。32位單片機,目前比較常見的是STM32,cortex-M3內核就是32位的普通單片機,常見寄存器開發和固件庫開發,需要使用C語言的結構體和指針。
  • 單片機keil 常見問題
    xx.c"選擇「options for file"xx.c" 選擇「Generate Assembler SRC File」和「Assemble SRC File」打上黑勾有效;2、根據選擇的編譯模式,把相應的庫文件象加"xx.c"一樣加入工程中並放在"xx.c"下面,如smail模式下選"keilc51libc51s.lib"加入工程中,如果要進行浮點運算把"keilc51libc51fpl.lib
  • 51 單片機UART 串口通信 方式1 實現
    1 51串行口結構51單片機的UART串行通信是基於其串行口的可編程硬體結構,只要用正確的程序代碼通過初始化串行口對應寄存器的形式將其串行硬體結構初始化,
  • 基於51單片機的嵌入式SNMP代理器設計與實現
    SNMP一般用於計算機網絡和電信網絡,本文提出了用SNMP進行控制。由於其傳輸媒介是Internet,所以傳輸距離不受限制,這相對於其他工業控制總線有不可比擬的優勢,SNMP最大的優點是協議簡潔,適合嵌入式應用。SNMP體系可擴展性強,只要將新的MIB裝載在管理軟體上就可以實現對新的終端的控制與訪問,本文介紹了一種基於廉價的微控制器的實現嵌入式代理器的方案,以微處理器核心實現相關硬體及軟體。
  • 32位-51單片機學習方法和思路,遊刃有餘
    對於有一定的單片機基礎,能夠熟練掌握51/avr單片機開發的同學來說,32位單片機,是比較好學的,因為不涉及linux。32位單片機,目前比較常見的是STM32,cortex-M3內核就是32位的普通單片機,常見寄存器開發和固件庫開發,需要使用C語言的結構體和指針。
  • 51單片機入門:LED燈實現不同頻率閃爍
    在上一篇文章中,我們用51單片機實現了單個LED燈的閃爍,但閃爍頻率固定的。下面我們實現LED燈不同頻率的閃爍!
  • 利用PWM原理,實現呼吸燈功能
    如下圖,一般的IO口都會標明這個GPIO是否是PWM口; STM32單片機就是標識如下形式:TIMx_CHy這樣的形式,下圖中所示的PWM引腳即佔用TIM1的通道1。具體方法是給I/O加一個定時器,輸出的PWM信號頻率與你的定時器一致,用定時器中斷來計數,但是這種方法一般不採用,除非對於精度、頻率等要求不是很高可以這樣實現。LED使用的引腳:
  • 51單片機、STM32單片機、PIC單片機性能對比
    雖然I/O腳使用簡單,但高電平時無輸出能力,這也是51系列單片機的最大軟肋 3.年開始推向市場的一種16位超低功耗的混合信號處理器,給人們留下的最大的亮點是低功耗而且速度快,彙編語言用起來很靈活,尋址方式很多,指令很少,容易上手。
  • github覆蓋本地專題及常見問題 - CSDN
    最近一直在用github,提交文件之類的操作常常需要用到git。所以在此記錄。這次想用git clone命令下載遠程倉庫代碼,發現太大了。但是呢,我本地的又不完整,所以我先參考的 [7],執行的是:git fetch origin master,有一點用:$ git fetch origin masterremote: Enumerating objects: 64, done.
  • 51單片機AD轉換電路設計實現
    51單片機AD轉換電路設計實現關於AD轉換的原理,大家在《數字電子技術》中已經學過,這裡做過多的介紹,本文介紹一款經典的8位AD轉換晶片ADC0804,基於51單片機設計AD轉換電路,並完成測量值的轉換。
  • 安卓手機與51單片機間藍牙通信的實現
    藍牙耳機今天分享下如利用藍牙4.0模塊建立安卓手機和51單片機間的藍牙通信。(1)安卓智慧型手機一部,只用是近幾年的智慧型手機都內嵌藍牙模塊,藍牙4.0及以上(2)任意51單片機最小系統都可使用,如下文連結。
  • 能否使用普通IO口模擬PWM波?該怎麼做?
    普通埠如何模擬PWM有些單片機內部擁有帶PWM輸出功能的定時器,只需要簡單的配置參數和使能,就能夠在特定的復用IO引腳,輸出想要的PWM波形。但當設計電路當中,單片機引腳沒有PWM功能時,如果想要實現模擬PWM信號的功能,則可以與內部普通定時器去實現。