標(biāo)題:
單片機(jī)+1602人機(jī)交互設(shè)置界面控制直流電機(jī)轉(zhuǎn)速,顯示不正確,請教黑友
[打印本頁]
作者:
萌新急救
時間:
2018-6-3 07:56
標(biāo)題:
單片機(jī)+1602人機(jī)交互設(shè)置界面控制直流電機(jī)轉(zhuǎn)速,顯示不正確,請教黑友
① 通過獨(dú)立式鍵盤和1602液晶顯示器設(shè)計(jì)獨(dú)立的人機(jī)交互設(shè)置界面,可設(shè)定直流電機(jī)的轉(zhuǎn)速,直流電機(jī)按照設(shè)定的轉(zhuǎn)速轉(zhuǎn)動,建議4個按鍵的功能分別為“設(shè)置”用于進(jìn)入設(shè)置界面、“→”用于調(diào)整光標(biāo)位置、“↑”用于調(diào)整光標(biāo)所在位置數(shù)值、“確定”用于保存設(shè)置值并返回主界面;
② 設(shè)定數(shù)據(jù)時,光標(biāo)位置處的數(shù)字應(yīng)閃爍顯示;
③ 可以定義一個“發(fā)送”鍵,按下后,直流電機(jī)按照設(shè)定參數(shù)轉(zhuǎn)動;
④ 直流電機(jī)轉(zhuǎn)動過程中,監(jiān)控端可以獲取直流電機(jī)運(yùn)行狀態(tài),并通過LCD顯示;
⑤ 直流電機(jī)轉(zhuǎn)動過程中,可以修改目標(biāo)轉(zhuǎn)速,修改后根據(jù)新的設(shè)定轉(zhuǎn)速控制電機(jī)轉(zhuǎn)動。
捕獲.PNG
(199.97 KB, 下載次數(shù): 25)
下載附件
2018-6-3 07:55 上傳
單片機(jī)源程序:
#include<reg52.h>
#include <intrins.h>
sbit RS=P0^4;
sbit RW=P0^5;
sbit EN=P0^6;
sbit k1=P2^4;
sbit k2=P2^5;
sbit k3=P2^6;
sbit k4=P2^7;
sbit PWM=P0^0;
unsigned int zhua=150;
unsigned char table[3],table1[3];
unsigned char count;
unsigned int m=50;
unsigned char flag;
unsigned int zhuan,i;
unsigned int j;
void delay1(unsigned int z) //Ñóê±oˉêy
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void writecom(unsigned char com)
{
RS=0;
RW=0;
P1=com;
EN=1;
EN=0;
}
void writedata(unsigned char dat)
{
RS=1;RW=0;
P1=dat;
EN=1;
EN=0;
}
void init()
{ EN=0;
writecom(0x38);
delay1(5);
writecom(0x0c);
delay1(5);
writecom(0x01);
delay1(5);
}
void display_v() //êμ¼ê×aËù
{
table[0]=zhuan/100+0x30;
table[1]=zhuan%100/10+0x30;
table[2]=zhuan%10+0x30;
writecom(0xc0);
writedata(table[0]);
writecom(0xc0+1);
writedata(table[1]);
writecom(0xc0+2);
writedata(table[2]);
}
void dis() //é趨×aËù£¬table1[]Dèé趨3õÖμ
{
table1[0]=zhua/100+0x30;
table1[1]=zhua%100/10+0x30;
table1[2]=zhua%10+0x30;
writecom(0x80);
writedata(table1[0]);
writecom(0x80+1);
writedata(table1[1]);
writecom(0x80+2);
writedata(table1[2]);
}
void adjust_v()
{
zhua=(table1[0]-0x30)*100+(table1[1]-0x30)*10+(table1[2]-0x30);
}
void keyscan(unsigned char k )
{
if(k1==0) //進(jìn)入設(shè)置
{delay1(10);if(k1==0){ k=1;}
if(k==1)
{
if(k2==0) //右移光標(biāo)
{delay1(10);
if(k2==0)
{
i++;
writecom(0x80+i-1);
writecom(0x0f);
if(i>3){i=1;}
if (k3==0) //增加該位數(shù)值
{delay1(10);
if (k3==0)
{
switch(i)
{
case 1:
zhua=zhua+100;
break;
case 2:
zhua=zhua+10;
break;
case 3:
zhua++;
break;
if(zhua>200)zhua=0;
}
if (k4==0)
{k=0;adjust_v();dis();}
}}
}
}}
}}
void init2() //定時器初始化
{
TMOD=0x11;
EA=1;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
ET0=1;
TR0=0;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
ET1=1;
TR1=1;
}
void int1_init()
{
EX1=1;
IT1=1;
}
void time1() interrupt 1 using 1
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
zhuan=count*20;
count=0;
display_v();
}
void service_int1() interrupt 0
{count++;}
void biaozhi()
{
if(zhuan>=zhua)flag=1;
if(zhuan<zhua)flag=0;
}
void pwm1() //m=50
{
TH0=(65536-500)/256;
TL0=(65536-500)%256;
j++;
{if(j<m)PWM=1;
else if(j>=m&&j<256) PWM=0;}
}
void tiaosu()
{
biaozhi();
if(flag==1)m--; //速度大于設(shè)定值
else m++; //速度小于設(shè)定值
}
void main()
{
init();
init2();int1_init();
pwm1();
while(1)
{ dis();
diaplay_v();
tiaosu();
keyscan();
}
}
復(fù)制代碼
作者:
萌新急救
時間:
2018-6-3 08:00
忘記說了,我的液晶顯示只有一個閃爍的0,大佬們可不可以幫我看看,第一次做也不太會
作者:
糖楓
時間:
2018-12-25 11:34
樓主你的問題解決了嗎,我們現(xiàn)在也在做好這個類似的,也遇到了問題
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1