- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- /* 端口定義*/
- sbit in1=P1^0;
- sbit in2=P1^1;
- sbit jian=P2^0;
- sbit jia=P2^1;
- sbit dir=P2^2;
- sbit run=P2^3;
- sbit inter_0=P3^2;
- sbit inter_1=P3^3;
- #define LCD_data P0 //數據口
- sbit LCD_RS = P2^7; //寄存器選擇輸入
- sbit LCD_RW = P2^6; //液晶讀/寫控制
- sbit LCD_EN = P2^5; //液晶使能控制
- sbit LCD_PSB = P2^4; //串/并方式控制
- uchar t10,t1,ce,cj,s1=0,pl=10;
- uchar zi[]={"電機轉速:"};
- uchar num[3];
- uint nums=0,speed,k=1200;
- void delay_1ms(uchar x)
- {
- uchar i,j;
- for(j=0;j<x;j++)
- for(i=0;i<110;i++);
- }
- /*******************************************************************/
- /* */
- /*寫指令數據到LCD */
- /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */
- /* */
- /*******************************************************************/
- void write_cmd(uchar cmd)
- {
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = cmd;
- delay_1ms(5);
- LCD_EN = 1;
- delay_1ms(5);
- LCD_EN = 0;
- }
- /*******************************************************************/
- /* */
- /*寫顯示數據到LCD */
- /*RS=H,RW=L,E=高脈沖,D0-D7=數據。 */
- /* */
- /*******************************************************************/
- void write_dat(uchar dat)
- {
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = dat;
- delay_1ms(5);
- LCD_EN = 1;
- delay_1ms(5);
- LCD_EN = 0;
- }
- /*********************************************************/
- /* */
- /* 設定顯示位置 */
- /* */
- /*********************************************************/
- void lcd_pos(uchar X,uchar Y)
- {
- uchar pos;
- if (X==0)
- {X=0x80;}
- else if (X==1)
- {X=0x90;}
- else if (X==2)
- {X=0x88;}
- else if (X==3)
- {X=0x98;}
- pos = X+Y ;
- write_cmd(pos); //顯示地址
- }
- /*******************************************************************/
- /* */
- /* LCD初始化設定 */
- /* */
- /*******************************************************************/
- void lcd_init()
- {
- LCD_PSB = 1; //并口方式
- write_cmd(0x30); //基本指令操作
- delay_1ms(5);
- write_cmd(0x0C); //顯示開,關光標
- delay_1ms(5);
- write_cmd(0x01); //清除LCD的顯示內容
- delay_1ms(5);
- }
- void main()
- {TMOD=0x02;
- TH0=0X6;
- TL0=0X6;
- EA=1;
- ET0=1;
- TR0=1;
- IT0=1;
- EX0=1;
- IT1=1;
- EX1=1;
- PX1=1;
- PT0=1;
- t10=1;
- t1=10;
- delay_1ms(10); //延時
- lcd_init();
- lcd_pos(0,2);
- write_dat(zi[0]);
- write_dat(zi[1]);
-
- write_dat(zi[2]);
- write_dat(zi[3]);
-
- write_dat(zi[4]);
- write_dat(zi[5]);
-
- write_dat(zi[6]);
- write_dat(zi[7]);
-
- write_dat(zi[8]);
- while(1);
- }
- count0(void) interrupt 1
- {pl--;
- if(pl==0)
- {k--;
- if(k==0)
- {k=1200;
- speed=nums/3;
- num[0]=speed%10+48;
- num[1]=speed/10%10+48;
- num[2]=speed/100+48;
- lcd_pos(1,3);
- write_dat(num[2]);
- write_dat(num[1]);
- write_dat(num[0]);
- nums=0;
- }
- pl=10;
- s1++;
- if(run==1)
- {if(dir==1)
- {if(s1<=t10)
- {in1=1;
- in2=0;}
- if((s1>t10)&&(s1<=t1))
- {in1=0;in2=0;}
- }
- else
- {if(s1<=t10)
- {in2=1;
- in1=0;}
- if((s1>t10)&&(s1<=t1))
- {in2=0;in1=0;}
- }
- }
- else
- {in1=0;in2=0;}
- if(s1>=t1)
- s1=0;
- }
- }
- int_0(void) interrupt 0
- {delay_1ms(15);
- if(inter_0==0)
- {if(jian==0)
- {if(t10>=1)
- t10--;
- }
- if(jia==0)
- {if(t10<10)
- t10++;}
- }
- }
- int_1(void) interrupt 2
- {nums++;}
復制代碼
|