熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
|
發(fā)布時(shí)間: 2019-10-21 14:59
正文摘要:還有一些功能沒有實(shí)現(xiàn),目前只有加減速和反轉(zhuǎn),仿真是基于Proteus 和 Keil C做的,暫時(shí)不能放出代碼,不過(guò)可以說(shuō)下我的思路。 增大占空比實(shí)現(xiàn)加速 |
| P0=0X0啥意思 |
|
#include"reg51.h" #define uchar unsigned char #define uint unsigned int sbit duan=P2^0; sbit wei=P2^1; sbit mc=P3^2; //外部脈沖 sbit pmw1=P2^2; //EA sbit pmw2=P2^3; //IN1 sbit pmw3=P2^4; //IN2 sbit Speed_high=P1^0; //加速 sbit Speed_low=P1^1; //減速 sbit Fan_turn=P1^2; //反轉(zhuǎn) uint count,num,num1,num3=50; uint bai,shi,ge,zs; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x40,0x7c,0x39,0x5e,0x79,0x71};//段碼 uchar code weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位碼 void Init_time(); void T0_time(); void T1_time(); void INT0_jishu(); void delay(uint jishi);//計(jì)時(shí),以毫秒為單位 void display(uint bai,uint shi,uint ge);//顯示轉(zhuǎn)速 void main() { Init_time(); while(1) { display(bai,shi,ge);//顯示電機(jī)速度 if(Speed_high==0) //檢測(cè)加速按鈕 { delay(5); if(Speed_high==0) { if(num3 >= 100) num3 = 100; else num3=num3+10; while(!Speed_high);//連續(xù)按鍵加速 } } if(Speed_low==0) //檢測(cè)減速按鈕 { delay(5); if(Speed_low==0) { if(num3 < 10) num3 = 0; else num3=num3-10; while(!Speed_low);//連續(xù)按鍵檢測(cè) } } if(Fan_turn==0) //檢測(cè)加速按鈕 { delay(5); if(Fan_turn==0) { pmw2=!pmw2; pmw3=!pmw3; while(!Fan_turn);//連續(xù)按鍵加速 } } } } //初始化設(shè)置 void Init_time() { TMOD=0x11; pmw2=0; pmw3=1; TH1=(65536-50000)/256; TL1=(65536-50000)%256; //每50ms計(jì)數(shù) TH0=(65536-100)/256; TL0=(65536-100)%256; //定時(shí)間隔為0.1ms,PWM ET0=1; TR0=1; //開定時(shí)器0 ET1=1; TR1=1; //開定時(shí)器1 EX0=1; //外部中斷允許 IT0=1; //設(shè)置下降觸發(fā)中斷 EA=1; //全局中斷允許 } //定時(shí)器0設(shè)置產(chǎn)生pwm波 void T0_time()interrupt 1 //計(jì)時(shí)0中斷,每0.1毫秒一次 { TR0=0; TH0=(65536-100)/256; TL0=(65536-100)%256; num1++; if(num1>=100)//PWM波完整周期為10ms { num1=0; } if(num1<=num3)//設(shè)置占空比 { pmw1=1; } else { pmw1=0; } //pmw2=0; TR0=1; } //定時(shí)器計(jì)數(shù)50ms,采集速度 void T1_time()interrupt 3 { TR1=0; TH1=(65536-50000)/256; TL1=(65536-50000)%256; num++; if(num==20) //每1秒測(cè)速一次 { num=0; EX0=0; //關(guān)外部中斷 zs=60*count/24; //求出速度 bai=zs/100; shi=zs%100/10; ge=zs%10; count=0; //脈沖計(jì)數(shù)歸零 EX0=1; } TR1=1; } //外部中斷函數(shù) void INT0_jishu() interrupt 0 using 1 //外部脈沖計(jì)數(shù) { count++ ; } //延時(shí)函數(shù) void delay(uint jishi) { uint i,j; for(i=jishi;i>0;i--) for(j=110;j>0;j--); } //數(shù)碼管顯示函數(shù) void display(uint bai,uint shi,uint ge) { duan=0; wei=0; duan=1; //百位顯示 P0=table[bai]; duan=0; delay(1); P0=0x0; wei=1; P0=weima[5]; wei=0; delay(1); P0=0x0; duan=1; //十位顯示 P0=table[shi]; duan=0; delay(1); P0=0x0; wei=1; P0=weima[6]; wei=0; delay(1); P0=0x0; duan=1; //個(gè)位顯示 P0=table[ge]; duan=0; delay(1); P0=0x0; wei=1; P0=weima[7]; wei=0; delay(1); P0=0x0; } |
Powered by 單片機(jī)教程網(wǎng)