|
我們用T0來(lái)發(fā)出不同占空比的脈沖來(lái)控制電機(jī)轉(zhuǎn)速,然后用T1去計(jì)T0發(fā)出脈沖的數(shù)量來(lái)達(dá)到我們所需要的步數(shù),達(dá)到步數(shù)后電機(jī)停止并且蜂鳴器響。我們現(xiàn)在的問(wèn)題是用鍵盤(pán)在液晶屏上控制轉(zhuǎn)速和步數(shù)后,發(fā)送給我們的兩個(gè)定時(shí)器作為初值去運(yùn)轉(zhuǎn)電機(jī),但是設(shè)置的轉(zhuǎn)速一旦大于30(r/min),電機(jī)就會(huì)一直轉(zhuǎn)下去不會(huì)停止,蜂鳴器也不會(huì)叫,而且不論轉(zhuǎn)速怎么提升,電機(jī)的轉(zhuǎn)動(dòng)速度都差不多不會(huì)變,只有在轉(zhuǎn)速設(shè)定小于30的時(shí)候才能正常實(shí)現(xiàn)我們的功能,用設(shè)定轉(zhuǎn)速行走我們所規(guī)定的步數(shù)后電機(jī)停止并且蜂鳴器報(bào)警。求51hei論壇大佬進(jìn)行指點(diǎn)!!!
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
QQ圖片20180605203237.png (49.77 KB, 下載次數(shù): 31)
下載附件
2018-6-5 20:33 上傳
單片機(jī)源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit LCD_RS = P2^0;
- sbit LCD_RW = P2^1;
- sbit LCD_EN = P2^2;
- sbit S1=P2^3; //定義鍵-----進(jìn)入設(shè)置界面
- sbit S2=P2^4; //定義鍵-----調(diào)整光標(biāo)位置
- sbit S3=P2^5; //定義鍵-----調(diào)整光標(biāo)位置數(shù)值
- sbit S4=P2^6; //定義鍵-----保存設(shè)置值
- sbit S5=P2^7; //定義鍵-----發(fā)送鍵
- uchar code table1[]="z:0 v:000 b:000";
- uchar code table0[]=" 000";
- uchar S1num,S2num,S3num;
- uint z,v1,v2,v3,b1,b2,b3,sv;
- uchar i;
- void delay(uint z) //延時(shí)函數(shù)
- {
- int x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
-
- void LCD_write_data(uint dat) //寫(xiě)數(shù)據(jù)
- {
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- P1=dat;
- delay(5);
- LCD_EN = 1;
- delay(5);
- LCD_EN = 0;
- }
-
- void LCD_write_com(uint com) //寫(xiě)指令
- {
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 0;
- P1=com;
- delay(5);
- LCD_EN = 1;
- delay(5);
- LCD_EN = 0;
- }
-
- void init()//1602初始化
- {
- z=0;
- v1=0;
- v2=0;
- v3=0;
- b1=0;
- b2=0;
- b3=0;
- sv=0;
- LCD_write_com(0x38);
- LCD_write_com(0x01);
- LCD_write_com(0x06);
- LCD_write_com(0x0c);
- }
- void write_v1(uchar add,uint dat)//寫(xiě)轉(zhuǎn)速v函數(shù)
-
- {
- uchar bai;
- bai=dat;
- LCD_write_com(0xc0+add);
- LCD_write_data(0x30+bai);
- }
- void write_v2(uchar add,uint dat)//寫(xiě)轉(zhuǎn)速v函數(shù)
-
- {
- uchar shi;
- shi=dat;
- LCD_write_com(0xc0+add);
- LCD_write_data(0x30+shi);
- }
- void write_v3(uchar add,uint dat)//寫(xiě)轉(zhuǎn)速v函數(shù)
-
- {
- uchar ge;
- ge=dat;
- LCD_write_com(0xc0+add);
- LCD_write_data(0x30+ge);
- }
- void write_b1(uchar add,uint dat)//寫(xiě)步數(shù)b函數(shù)
-
- {
- uint bai;
- bai=dat;
- LCD_write_com(0xc0+add);
- LCD_write_data(0x30+bai);
- }
- void write_b2(uchar add,uint dat)//寫(xiě)步數(shù)b函數(shù)
-
- {
- uint shi;
- shi=dat;
- LCD_write_com(0xc0+add);
- LCD_write_data(0x30+shi);
- }
- void write_b3(uchar add,uint dat)//寫(xiě)步數(shù)b函數(shù)
-
- {
- uint ge;
- ge=dat;
- LCD_write_com(0xc0+add);
- LCD_write_data(0x30+ge);
- }
- void write_z(uchar add,uint dat)//寫(xiě)轉(zhuǎn)向z函數(shù)
-
- {
- uint ge;
- ge=dat;
- LCD_write_com(0xc0+add);
- LCD_write_data(0x30+ge);
- }
- void write_sv(uchar add,uint dat)//寫(xiě)實(shí)際轉(zhuǎn)速sv函數(shù)
-
- {
- uint bai,shi,ge;
- bai=dat/100;
- shi=dat%100/10;
- ge=dat%10;
- LCD_write_com(0x80+add);
- LCD_write_data(0x30+bai);
- LCD_write_data(0x30+shi);
- LCD_write_data(0x30+ge);
- }
- void display()//1602初始化顯示函數(shù)
- {
- init();
- LCD_write_com(0x80|0x10);
- for(i=0;i<11;i++)
- {
- LCD_write_data(table0[i]);
- delay(5);
- }
- LCD_write_com(0xc0);
- for(i=0;i<15;i++)
- {
- LCD_write_data(table1[i]);
- delay(5);
- }
- write_z(2,z);
- write_v1(6,v1);
- write_v2(7,v2);
- write_v3(8,v3);
- write_b1(12,b1);
- write_b2(13,b2);
- write_b3(14,b3);
- write_sv(6,sv);
- S1num=0;
- S2num=0;
- S3num=0;
- }
- void keyscan()//鍵盤(pán)掃描函數(shù)
- {
- if(S1==0)//按鍵S1按下時(shí)
- {
- S1num=1;
- delay(20);
- if(S1==0)
- {
- LCD_write_com(0xc0+2);//光標(biāo)到轉(zhuǎn)向位置處
- LCD_write_com(0x0f);//光標(biāo)閃爍
- }
- }
- if(S1num!=0)//只有按鍵S1按下后,S2,S3,S4按鍵操作才有效
- {
- if(S2==0)//按鍵S2按下時(shí)
- {
-
- delay(20);
- if(S2==0)
- {
- S2num++;
- while(!S2);//松手檢測(cè)
- if(S2num==0)
- {
- LCD_write_com(0xc0+2);//光標(biāo)到指定位置
- }
- if(S2num==1)
- {
- LCD_write_com(0xc0+6);//光標(biāo)到指定位置
- }
- if(S2num==2)
- {
- LCD_write_com(0xc0+7);
- }
- if(S2num==3)
- {
- LCD_write_com(0xc0+8);
- }
- if(S2num==4)
- {
- LCD_write_com(0xc0+12);
- }
- if(S2num==5)
- {
- LCD_write_com(0xc0+13);
- }
- if(S2num==6)
- {
- LCD_write_com(0xc0+14);
- }
- if(S2num==7)
- {
- LCD_write_com(0xc0+2);
- S2num=0;
- }
- }
- }
- if(S3==0)//按鍵S3按下時(shí)
- {
- delay(20);
- if(S3==0)
- {
- while(!S3);
- if(S2num==0)
- {
- z++;
- if(z==2)
- {
- z=0;
- }
- write_z(2,z);
- LCD_write_com(0xc0+2);
- }
- if(S2num==1)
- {
- v1++;
- if(v1==10)
- {
- v1=0;
- }
- write_v1(6,v1);
- LCD_write_com(0xc0+6);
- }
- if(S2num==2)
- {
- v2++;
- if(v2==10)
- {
- v2=0;
- }
- write_v2(7,v2);
- LCD_write_com(0xc0+7);
- }
- if(S2num==3)
- {
- v3++;
- if(v3==10)
- {
- v3=0;
- }
- write_v3(8,v3);
- LCD_write_com(0xc0+8);
- }
- if(S2num==4)
- {
- b1++;
- if(b1==10)
- {
- b1=0;
- }
- write_b1(12,b1);
- LCD_write_com(0xc0+12);
- }
- if(S2num==5)
- {
- b2++;
- if(b2==10)
- {
- b2=0;;
- }
- write_b2(13,b2);
- LCD_write_com(0xc0+13);
- }
- if(S2num==6)
- {
- b3++;
- if(b3==10)
- {
- b3=0;
- }
- write_b3(14,b3);
- LCD_write_com(0xc0+14);
- }
- }
- }
- if(S4==0)//按鍵S4按下時(shí)
-
- {
- delay(5);
- if(S4==0)
- {
- S1num=0;
- S2num=0;
- S3num=0;
- LCD_write_com(0x0c);
- }
- }
- }
- }
- void main()
- {
- display();//1602顯示
-
- while(1)
- {
- keyscan();//不斷檢測(cè)鍵是否按下
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
最新.zip
(265.78 KB, 下載次數(shù): 29)
2018-6-5 20:39 上傳
點(diǎn)擊文件名下載附件
proteus仿真圖和keil代碼
|
|