51单片机 proteus仿真 直流电机
电路仿真代码#include reg51.h #define uchar unsigned char #define uint unsigned int #define LCD_Data P0 sbit IN1 P3^0; sbit IN2 P3^1; sbit ENA P3^2; sbit back P2^0; sbit forword P2^1; sbit up P2^2; sbit down P2^3; sbit stop P2^4; sbit LCD_RS P1^0; sbit LCD_RW P1^1; sbit LCD_E P1^2; uchar counter 0; char speed 50; uchar i; uchar dir; uchar txt[] Duty cycle:(5:5); uchar txt_2[] Please Press !; void delay(uint t){ uint i,j; for(i0;it;i) for(j0;j120;j); } void LCD_Check_Busy(){ uchar temp; LCD_Data 0xff; LCD_RS 0; LCD_RW 1; do{ LCD_E 1; temp LCD_Data; LCD_E 0; }while(temp 0x80); } void LCD_Write_Cmd(uchar Cmd){ LCD_Check_Busy(); LCD_RS 0; LCD_RW 0; LCD_E 0; LCD_Data Cmd; delay(2); LCD_E 1; delay(5); LCD_E 0; } void LCD_Write_Data(uchar Data){ LCD_Check_Busy(); LCD_RS 1; LCD_RW 0; LCD_E 0; LCD_Data Data; delay(2); LCD_E 1; delay(7); LCD_E 0; } void LCD_Init(){ LCD_Write_Cmd(0x01); LCD_Write_Cmd(0x06); LCD_Write_Cmd(0x0c); LCD_Write_Cmd(0x38); LCD_Write_Cmd(0x80); } void refresh_LCD() { uchar i 0; uchar j 0; LCD_Write_Cmd(0x80); while (txt[i] ! \0) { LCD_Write_Data(txt[i]); i; } LCD_Write_Cmd(0x400x80); while (txt_2[j] ! \0) { LCD_Write_Data(txt_2[j]); j; } } void update_display(speed) { uchar duty; uchar kong; duty speed / 10; kong 10-duty; txt[12] duty 0; txt[14] kong 0; refresh_LCD(); } void Timer0_init()//100us { TMOD 0xF0; TMOD | 0x01; TL0 0x78; TH0 0xEC; ET01; EA1; TR01; } void Timer0() interrupt 1 { TL0 0x78; TH0 0xEC; counter; counter%100; if(dir 1){//Õýת if(counter speed) IN1 1; else IN1 0; IN2 0; } else if(dir 2){//·´×ª if(counter speed) IN2 1; else IN2 0; IN1 0; } else{ IN1 0; IN2 0; } } void main(){ Timer0_init(); LCD_Init(); refresh_LCD(); dir 0; ENA 0; IN1 0; IN2 0; while(1){ if(back 0){ delay(10); while(back 0); dir 2; ENA1; IN1 0; IN2 1; } if(forword 0){ delay(10); while(forword 0); dir 1; ENA1; IN1 1; IN2 0; } if(up 0){ delay(10); while(up 0); speed 10; if(speed 100) speed 100; update_display(speed); } if(down 0){ delay(10); while(down 0); speed - 10; if(speed 0) speed 0; update_display(speed); } if(stop 0){ delay(10); while(stop 0); speed 50; dir 0; ENA0; TR00; IN1 0; IN2 0; update_display(speed); } } }