單片機(jī)源程序如下: #include #include "16x2LCDDriver.h" unsigned char LCDBuffer_0[]={"STOP 00% DIR +"}; unsigned char LCDBuffer_1[]={"Get Spd 0000 RPM"}; struct TMR1COUNTER_STRUCT { unsigned char HighCounter; unsigned int LowCounter; unsigned char ChangeFlag; }; struct TMR1COUNTER_STRUCT MyTMR1,MyTMR3,GetTMR1,GetTMR3; void OSCillator_Initize(void) { OSCCON=0x70;//選擇內(nèi)部8MHz的主振蕩器 OSCTUNE=0x40;//使能4xPLL--->Fosc=32MHz } void PIC_PortDir_Initize(void) { ADCON1=0x0F;//RA和RE端口全為數(shù)字IO口 TRISD=0x00;//RD端口置輸出方向 TRISE=0x00;//RE端口置輸出方向 TRISCbits.TRISC1=0; TRISCbits.TRISC2=0; TRISCbits.TRISC3=0; } void PIC_TMR0_Initize(void) { T0CONbits.TMR0ON=0;//TMR0停止工作 T0CONbits.T08BIT=0;//選擇16位的定時(shí)/計(jì)數(shù)器 T0CONbits.T0CS=0;//選擇內(nèi)部CLKO時(shí)鐘源作為定時(shí) T0CONbits.PSA=0;//選擇預(yù)分頻器 T0CONbits.T0PS2=1;//預(yù)分頻比為1:256 T0CONbits.T0PS1=1; T0CONbits.T0PS0=1; TMR0H=(65536-31250)/256;//先寫高字節(jié) TMR0L=(65536-31250)%256;//再寫低字節(jié) T0CONbits.TMR0ON=1;//開始定時(shí)工作 } void PIC_TMR1_Initize(void) { //此處TMR1的預(yù)分頻比為1:1 T1CONbits.RD16=1;//允許一次性讀寫16位 T1CONbits.TMR1CS=1;//選擇外部時(shí)鐘源,TMR1用作外部計(jì)數(shù) TMR1H=0;//TMR1數(shù)據(jù)寄存器清0 TMR1L=0; T1CONbits.TMR1ON=1;//允許TMR1開始工作 } void PIC_TMR3_Initize(void) { //此處TMR1的預(yù)分頻比為1:8 T3CONbits.T3CKPS1=1; T3CONbits.T3CKPS0=1; T3CONbits.RD16=1;//允許一次性讀寫16位 T3CONbits.TMR3CS=0;//選擇內(nèi)部時(shí)鐘源,TMR3用作內(nèi)部計(jì)數(shù) TMR3H=0;//TMR3數(shù)據(jù)寄存器清0 TMR3L=0; T3CONbits.TMR3ON=1;//允許TMR3開始工作 } void PIC_Interrupt_Initize(void) { INTCONbits.TMR0IF=0;//TMR0溢出標(biāo)志位清0 INTCONbits.TMR0IE=1;//TMR0溢出中斷允許 PIR1bits.TMR1IF=0;//TMR1溢出標(biāo)志位清0 PIE1bits.TMR1IE=1;//TMR1溢出中斷允許 IPR1bits.TMR1IP=0;//低優(yōu)先級(jí) PIR2bits.TMR3IF=0;//TMR1溢出標(biāo)志位清0 PIE2bits.TMR3IE=1;//TMR1溢出中斷允許 IPR2bits.TMR3IP=0;//低優(yōu)先級(jí) INTCONbits.INT0IF=0;//清INT0中斷標(biāo)志位 //INTCONbits.INT0IE=1;//INT0中斷允許 INTCON2bits.RBPU=0;//允許內(nèi)部弱上拉 INTCON2bits.INTEDG0=1;//上邊沿觸發(fā)中斷 RCONbits.IPEN=1;//允許中斷優(yōu)先級(jí)位 INTCONbits.GIE=1;//CPU全局中斷使能允許 INTCONbits.PEIE=1;//CPU第二梯隊(duì)中斷使能允許 } void PIC_CCPForPWM_Initize(void) { TRISCbits.TRISC1=0;//RC1置輸出方向 TRISCbits.TRISC2=0;//RC2置輸出方向 LATCbits.LATC1=0;//RC1引腳輸出為0 LATCbits.LATC2=0;//RC2引腳輸出為0 CCP1CON=0x0F;//CCP1設(shè)置為PWM模式 CCP2CON=0x0F;//CCP2設(shè)置為PWM模式 T2CON=0x03;//TMR2的預(yù)分頻為1:16 T2CONbits.TMR2ON=1;//TMR2開始工作 PR2=249;//PWM周期為2000Hz,FOSC=32MHz CCPR1L=0;//PWM1的占空比為0 CCPR2L=0;//PWM2的占空比為0 } unsigned char CycleFlag; unsigned char FreqFlag; #define RUNSTOPKEY PORTBbits.RB3 #define PWMKEY PORTBbits.RB4 #define DIRKEY PORTBbits.RB5 unsigned char MotorRunStatus; unsigned char MotorDirection; unsigned char MotorPWMData; unsigned char RunStopKeyFlag; unsigned int RunStopKeyCounter; unsigned char DirKeyFlag; unsigned int DirKeyCounter; unsigned char PWMKeyFlag; unsigned int PWMKeyCounter; void SystemVariant_Initize(void) { MotorPWMData=0; } void Motor_Control(unsigned char Direction, unsigned char Speed) { switch(Direction) { case 0: CCPR1L=0; CCPR2L=0; CCPR1L=Speed; break; case 1: CCPR2L=0; CCPR1L=0; CCPR2L=Speed; break; } } //------------------------------------------------------------------- void PIC18F_High_isr(void);//高優(yōu)先級(jí)中斷函數(shù)聲明 #pragma code high_vector_section=0x8 void high_vector (void) { _asm goto PIC18F_High_isr _endasm } void SystemInterruptISR(void);//低優(yōu)先級(jí)中斷函數(shù)聲明 #pragma code low_vector=0x18//低中斷優(yōu)先級(jí) void low_interrupt(void) { _asm goto SystemInterruptISR _endasm } #pragma code //------------------------------------------------------------------- void main(void) { unsigned long temp; unsigned char i; OSCillator_Initize();//CPU系統(tǒng)時(shí)鐘初始化內(nèi)部時(shí)鐘源8MHz,經(jīng)過(guò)4xPLL PIC_PortDir_Initize();//PIC單片機(jī)的使用到的I/O口方向初始化 PIC_TMR0_Initize();//PIC單片機(jī)的TMR0定時(shí)器初始化為內(nèi)部定時(shí)方式 PIC_TMR1_Initize();//PIC單片機(jī)的TMR1定時(shí)器初始化為外部計(jì)數(shù)方式 PIC_TMR3_Initize(); PIC_CCPForPWM_Initize(); PIC_Interrupt_Initize(); initize_lcd(); while(1) { if(0==RUNSTOPKEY)//判斷啟動(dòng)按鍵是否按下 { if(0==RunStopKeyFlag)//檢測(cè)啟動(dòng)按鍵是否成功按下標(biāo)志 { RunStopKeyCounter++;//軟件計(jì)數(shù)器,用于按鍵去抖動(dòng) if(4000==RunStopKeyCounter)//按鍵去抖動(dòng)延時(shí)到 { RunStopKeyCounter=0;//清軟計(jì)數(shù)器為0 if(0==RUNSTOPKEY)//再判斷啟動(dòng)按鍵是否真得按下 { RunStopKeyFlag=1;//置啟動(dòng)按鍵成功按下標(biāo)志為1 if(0==MotorRunStatus)//如果電機(jī)是處理停止?fàn)顟B(tài) {//則啟動(dòng)電機(jī)運(yùn)轉(zhuǎn) MotorRunStatus=1;//同時(shí)置電機(jī)狀態(tài)為1 LCDBuffer_0[0]='R';//LCD顯示屏上顯示"RUN" LCDBuffer_0[1]='U'; LCDBuffer_0[2]='N'; LCDBuffer_0[3]=' '; LCDBuffer_0[4]=' '; temp=MotorPWMData;//讀取設(shè)置電機(jī)速度的變量 temp<<=1;//轉(zhuǎn)換成占空比送到LCD上顯示 temp/=5; LCDBuffer_0[5]=(temp/10)+0x30; LCDBuffer_0[6]=(temp%10)+0x30; LCDBuffer_0[7]='%'; LCDBuffer_0 關(guān)鍵字:PIC單片機(jī) PWM電機(jī) 速度控制 編輯:什么魚 引用地址:http://news./mcu/ic478293.html 本網(wǎng)站轉(zhuǎn)載的所有的文章、圖片,、音頻視頻文件等資料的版權(quán)歸版權(quán)所有人所有,,本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如果本網(wǎng)所選內(nèi)容的文章作者及編輯認(rèn)為其作品不宜公開自由傳播,,或不應(yīng)無(wú)償使用,,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以迅速采取適當(dāng)措施,,避免給雙方造成不必要的經(jīng)濟(jì)損失,。上一篇:pic單片機(jī)控制cc1101實(shí)現(xiàn)loral無(wú)線傳輸?shù)脑闯绦?/a>
0 推薦閱讀 PIC單片機(jī)之定時(shí)器(TMR0) 什么是定時(shí)器?定時(shí)器顧名思義就是用來(lái)定時(shí)的,。在單片機(jī)應(yīng)用中常常用于各種各樣的定時(shí),。比如讓LED燈每隔 1S 亮一次。 這個(gè)1S 就是由定時(shí)器做到的,。指令周期 指令周期就是單片機(jī)執(zhí)行一個(gè)指令所花費(fèi)的時(shí)間,。這也是定時(shí)器定時(shí)的最小時(shí)間單位。時(shí)鐘頻率/4=指令頻率,。1/指令頻率=指令周期,。假設(shè)現(xiàn)在的時(shí)鐘是4MHZ ,4MHz的時(shí)鐘經(jīng)過(guò)4分頻后變成了 1MHz 其周期為0.0000001s也就是1us,這個(gè)1us就是指令周期,,這1us也就是定時(shí)器定時(shí)的最小單位,。定時(shí)器與預(yù)分頻器假設(shè)在沒(méi)有預(yù)分頻器情況下。開啟定時(shí)器 每隔一個(gè)指令周期定時(shí)器就加一,。假設(shè)時(shí)鐘是4MHz 也就是每隔 1us 定時(shí)器加一,。如果有
發(fā)表于 2020-01-30 關(guān)于PIC單片機(jī)SLEEP指令 之前一直沒(méi)有真正理解sleep指令,最近在做智能水表的產(chǎn)品的時(shí)候,,用了一款8位的單片機(jī)PIC16F690,,當(dāng)看到程序中的sleep指令時(shí)以為執(zhí)行后cpu還會(huì)工作,導(dǎo)致一些認(rèn)識(shí)上的錯(cuò)誤,在網(wǎng)上搜索了一下,,找到了一篇關(guān)于sleep的詳細(xì)說(shuō)明文章,,現(xiàn)收集下來(lái)以便以后查詢!在執(zhí)行SLEEP指令后進(jìn)入睡眠省電模式,。進(jìn)入SLEEP模式后,,主振蕩停止,如果看門狗在燒寫時(shí)打開了,,看門狗定時(shí)器將被清并保持運(yùn)行,。I/O 口,周邊模塊和內(nèi)部RAM將保持原來(lái)狀態(tài),,所以如果要求睡眠后有很低功耗,,應(yīng)該在進(jìn)入SLEEP前把IO口置為高阻抗的輸入狀態(tài),不用的模塊也要關(guān)閉,。另有些周邊模塊與主時(shí)鐘有關(guān),,如在異步模式下的USART,將不工作,。喚醒SLEEP的條件
發(fā)表于 2020-01-30 如何在ATE中集成對(duì)PIC單片機(jī)的編程燒寫功能 做ATE,,要對(duì)DUT內(nèi)部的PIC單片機(jī)進(jìn)行在線燒寫,在網(wǎng)上看到別人的一個(gè)說(shuō)法(作者 Claud Zhang),,內(nèi)容如下:---------------------------------------------------------一種簡(jiǎn)單高效低成本的Microchip MCU編程方法 Claud Zhang對(duì)于一些研發(fā)工程師來(lái)說(shuō),,工廠的的MCU編程有時(shí)候是個(gè)比較頭疼的問(wèn)題.在研發(fā)
發(fā)表于 2020-01-30 PIC單片機(jī)型號(hào)命名規(guī)則 PICXXXXXXXX(X)-XXX/XX12345678 1.前綴: PIC MICROCHIP 公司產(chǎn)品代號(hào),特別地:dsPIC為集成DSP功能的新型PIC單片機(jī) 2.系列號(hào):10,、12,、16、18,、24,、30、33,、32,,其中 PIC10、PIC12,、PIC16,、PIC18為8位單片機(jī) PIC24、dsPIC30,、dsPIC33為16位單片機(jī) PIC32為32位單片機(jī) 3.器件型號(hào)(類型): C CMOS 電路 CR CMOS ROM LC 小功率CMOS 電路 LCS 小功率保護(hù) AA 1.8V LCR 小功率CMOS ROM LV 低電壓 F 快閃可編程存儲(chǔ)器 HC 高速CMOS
發(fā)表于 2020-01-30 PIC單片機(jī)與AM2302溫濕度傳感器通信優(yōu)化 ,。 如果在系統(tǒng)時(shí)鐘很低的情況,指令周期就成為需要考慮的關(guān)鍵因素。這里拿PIC單片機(jī)舉例,,如果系統(tǒng)時(shí)鐘為1M Hz,,則它的指令周期為4微妙, (指令周期為系統(tǒng)時(shí)鐘的4倍)。 這個(gè)時(shí)候如果使用上面提到的函數(shù)調(diào)用的方法,將無(wú)法得到正確的數(shù)據(jù),。 因?yàn)榧由虾瘮?shù)調(diào)用的開銷,,當(dāng)am2302_read_byte()進(jìn)行電平判斷的時(shí)候, 很可能已經(jīng)錯(cuò)過(guò)了起始電平,,導(dǎo)致解析不正確,。另外當(dāng)判斷是數(shù)據(jù)位1的時(shí)候, data += (0x80U >> i); while (1 == data_port) {
發(fā)表于 2020-01-29 使用PIC單片機(jī)連接旋轉(zhuǎn)編碼器的方法 旋轉(zhuǎn)編碼器(Rotary Encoder)是一種幫助用戶與系統(tǒng)交互的輸入設(shè)備,。它看起來(lái)更像是一個(gè)無(wú)線電電位器,,但它輸出一系列脈沖,使其應(yīng)用獨(dú)特,。當(dāng)旋轉(zhuǎn)編碼器的旋鈕時(shí),,它以小步進(jìn)的形式旋轉(zhuǎn),這有助于它用于步進(jìn)/伺服電機(jī)控制,、導(dǎo)航菜單序列和增加/減少數(shù)字的值等等。在本篇文章中,,我們將了解不同類型的旋轉(zhuǎn)編碼器及其工作原理,。我們還將它連接到PIC單片機(jī)PIC16F877A,并通過(guò)旋轉(zhuǎn)編碼器控制整數(shù)值,,然后在LCD液晶屏1602顯示其值,。在本文結(jié)束時(shí),您將熟悉為項(xiàng)目使用旋轉(zhuǎn)編碼器,。讓我們開始吧…旋轉(zhuǎn)編碼器及其類型旋轉(zhuǎn)編碼器通常稱為軸編碼器,。它是一種機(jī)電換能器,意味著它將機(jī)械運(yùn)動(dòng)轉(zhuǎn)換為電子脈沖,,或者換句話說(shuō),,它將角位置或運(yùn)動(dòng)或軸位置轉(zhuǎn)換為
發(fā)表于 2020-01-29
|
|
來(lái)自: 共同成長(zhǎng)888 > 《PIC單片機(jī)》