仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (206 KB, 下載次數: 15)
下載附件
2022-12-8 18:48 上傳
單片機源程序如下:
- #include <reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit open = P2^0; //啟動電機按鍵
- sbit close = P2^1; //關閉電機按鍵
- sbit swap = P2^2; //正反轉按鍵
- sbit sub_speed = P2^3; //減速按鍵
- sbit add_speed = P2^4; //加速按鍵
-
- sbit PWM1 = P3^0;
- sbit PWM2 = P3^1;
- /*液晶顯示*/
- sbit E=P3^7;
- sbit RW = P3^6;
- sbit RS = P3^5;
- sbit test = P3^4;
-
-
- int time = 0;
- int high = 20;
- int period = 30;
- int change = 0;
- int flag = 0;
- int num_medium = 0;
- int num_display = 0;
- int count_speed = 0;
- uchar wword[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
-
- /*延時t毫秒*/
- void delay(uchar t)
- {
- uint i;
- while(t)
- {
- /*對于11.0592MHz時鐘,延時1ms*/
- for(i=0;i<125;i++);
- t--;
- }
- }
- //寫命令函數LCD
- void wc51r(uchar j)
- {
- //fbusy();
- RS=0;
- RW=0;
- P1=j;
- E=1;
- E=0;
- delay(3);
- }
- //寫數據函數LCD
- void wc51ddr(uchar j)
- {
-
- RS=1;
- RW=0;
- P1=j;
- E=1;
- E=0;
- delay(2);
- }
- //初始化函數LCD
- void init()
- {
- wc51r(0x01); //清屏
- wc51r(0x38); //使用8位數據,顯示兩行,使用5*7的字型
- wc51r(0x0c); //顯示器件,光標開,字符不閃爍
- wc51r(0x06); //字符不動,光標自動右移一格
- }
-
- /***********T0中斷服務程序************PWM波的生成**********/
- void time0_int(void) interrupt 1
- {
-
- time++;
- TH0 = 0xec;
- TL0 = 0x78; //60536
-
- if(change == 0) //正轉
- {
- PWM2 = 1;
- if(time == high) //high初始值20
- PWM1=0;
- else if(time == period) // period初始值30
- {
- PWM1 = 1;
- time = 0;
- }
-
- }
-
- else //反轉
- { PWM1 = 1;
- if(time == high)
- PWM2=0;
- else if(time == period)
- {
- PWM2 = 1;
- time = 0;
- }
- }
-
- }
- /*************************************************************/
- /****T1中斷服務程序********單位時間(S)方波的個數*************/
- void time1_int(void) interrupt 3
- {
- count_speed++; //count_speed初始為0
- if(count_speed == 20)
- { count_speed = 0;
- num_display = num_medium;
- num_medium = 0;
- }
-
- }
- /*************************************************************/
- /************************速度顯示的數據處理********************/
- void datamade()
- { uint data MM,NN;
-
- wc51r(0xc2);
- wc51ddr('S');
- wc51ddr('p');
- wc51ddr('e');
- wc51ddr('e');
- wc51ddr('d');
- wc51ddr(0x3a);
- NN = num_display%100;
- MM = num_display/100;
- wc51ddr(wword[MM]);
-
- MM = NN/10;
- NN = NN%10;
- wc51ddr(wword[MM]);
- wc51ddr(wword[NN]);
-
- }
- /*****************************************************************/
- /**********通過按鍵實現對電機開關、調速、轉向的控制***************/
- void motor_control()
- {
- if(open == 1)
- EA = 1;
-
- if(close == 1)
- EA = 0;
-
- if(swap == 1)
- {
- change = ~change;
- while(swap != 0)
- {}
-
- }
-
- if(sub_speed == 1)
- {
- high++;
- if(high == 30)
- EA=0;
- while(sub_speed != 0)
- {}
- }
-
-
- if(add_speed == 1)
- {
- high--;
- if(high == 5)
- high = 5;
- while(add_speed != 0)
- {}
- }
- }
- /******************************************************************/
- /***************************主函數*********************************/
- void main()
- {
- P2 = 0x00;
-
- ET0 = 1;
- ET1 = 1;
- TMOD = 0x11;
- TH0 = 0xec;
- TL0 = 0x78;
- TH1 = 0x3c;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
Keil代碼與Proteus7.5; 8.13仿真下載:
電機.7z
(64.92 KB, 下載次數: 41)
2022-12-8 18:49 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
鏈接:https://pan.baidu.com/s/14yY1_ufB1pHW8JMpSRfSjQ?pwd=mejg
提取碼:mejg
|