久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3876|回復: 10
打印 上一主題 下一主題
收起左側

調試單片機智能輸液系統 ULN2003控制步進電機調速,電機部分有問題 求解答

  [復制鏈接]
回帖獎勵 40 黑幣 回復本帖可獲得 2 黑幣獎勵! 每人限 1 次(中獎概率 80%)
跳轉到指定樓層
樓主
主要程序如下:
其中P3.2用按鍵代替液滴低落   P3.3用按鍵表示液位變化
存在問題:(一般是先用矩陣鍵盤設定上下限,再按P3.2口的按鍵模仿液滴滴落)
             由于仿真液滴滴落由P3.2口的按鍵代替,滴速上下限min,max要用鍵盤設定,
需要人工操作,
二者存在先后順序。            

            在矩陣鍵盤設置完滴速下限min時,已經檢測了speed為0,電機就開始轉,以至于無法設定max,影響后面的操作。請各位幫幫忙。
#define LCD_DB P0   //端口定義
#define KEY P1
sbit LCD_E=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_RS=P2^2;
sbit beep=P2^3;
sbit A1=P2^4;
sbit B1=P2^5;
sbit C1=P2^6;
sbit D1=P2^7;
函數聲明略;
unsigned int  value,max=0,min=0,b,c,d,b1,d1,c1,bai,shi,ge,speed;//變量
unsigned char key;
unsigned int speed_count=0;
unsigned int number0,number1;
unsigned char time_out=0;

void main()
{
LCD_init();
init();
LCD1602_ShowStr(1, 5, "speed:", 6);
LCD1602_ShowStr(0, 0, "min:000", 7);
    LCD1602_ShowStr(0, 8, "max:000", 7);
while(1)
{
  key_place();
  if(time_out== 1 )
  {
   time_out=0;
   speed=speed_count*12;
   speed_count=0;
   ge=speed%10;   

   shi=speed/10%10;
   bai=speed/100%10;
   LCD_ShowNum(1, 11,bai);
   LCD_ShowNum(1, 12,shi);
   LCD_ShowNum(1, 13,ge);
      if(speed>max)       //滴速大于設定值上限
   {
     A1=0;B1=1;C1=1;D1=1;delay(20000);
        A1=0;B1=0;C1=1;D1=1;delay(20000);
     A1=1;B1=0;C1=1;D1=1;delay(20000);
        A1=1;B1=0;C1=0;D1=1;delay(20000);
     A1=1;B1=1;C1=0;D1=1;delay(20000);
        A1=1;B1=1;C1=0;D1=0;delay(20000);
     A1=1;B1=1;C1=1;D1=0;delay(20000);
     A1=0;B1=1;C1=1;D1=0;delay(20000);
     delay(10000);
   }
   if(speed<min)         
//滴速小于設定值下限

   {
    A1=1;B1=1;C1=1;D1=0;delay(20000);
  A1=1;B1=1;C1=0;D1=0;delay(20000);
  A1=1;B1=1;C1=0;D1=1;delay(20000);
  A1=1;B1=0;C1=0;D1=1;delay(20000);
     A1=1;B1=0;C1=1;D1=1;delay(20000);
     A1=0;B1=0;C1=1;D1=1;delay(20000);
  A1=0;B1=1;C1=1;D1=1;delay(20000);
  A1=0;B1=1;C1=1;D1=0;delay(20000);
  delay(10000);
   }
}


unsigned char scan_key(void)  //按鍵掃描
{
u8 temp,H=0,L=0;
KEY=0x0f;
delay(1000);
temp=KEY;
if(temp!=0x0f)
{
  switch(temp)
  {
   case 0x0e:H=1;break;
   case 0x0d:H=2;break;
   case 0x0b:H=3;break;
   case 0x07:H=4;break
   default:break;
  }
   KEY=0xf0;
  temp=KEY;
  if (temp!=0xf0)
  {
   switch(temp)
   {
    case 0xe0:L=1;break;
    case 0xd0:L=2;break;  
    case 0xb0:L=3;break;
    case 0x70:L=4;break;
    default:break;
   }
   while(KEY !=0xF0);
  }
}
if(H!=0&&L!=0)  
  return( (H-1)*4+L );
else
  return(0);
}
unsigned char read_key(void)  //按鍵返回數字或字母
{
unsigned char temp,keynumber;
temp=scan_key();
if(temp!=0
{
  switch(temp)
  {
   case 1:  keynumber='A';break;
   case 2:     keynumber='3';break;
   case 3:     keynumber='2';break;
   case 4:     keynumber='1';break;
   case 5:    keynumber='B';break;
   case 6:    keynumber='6';break;
   case 7:  keynumber='5';break;
   case 8:   keynumber='4';break;
   case 9:     keynumber='C';break;
   case 10: keynumber='9';break;
   case 11: keynumber='8';break;
   case 12: keynumber='7';break;
   case 13: keynumber='D';break;
   case 14: keynumber='E';break;
   case 15: keynumber='0';break;
   case 16: keynumber='F';break;
  }
}
else
{
  keynumber=0;
}
  return(keynumber);
}
void key_place(void)   //按鍵設定滴速范圍上下限
{  
   unsigned int j;
  unsigned char key;
   key=read_key();
    if(key!=0)
   {
    if(key=='1' ||key=='2' ||key=='3' ||key=='4' ||key=='5' ||key=='6' ||key=='7' ||key=='8' ||key=='9'||key=='0'  )
   {
    LCD_ShowNum(1,j,key-'0');
    j++;
    value=value*10+key-'0';  
   }
   if(key=='A')    //A也就是min,下限
   {
    LCD1602_ShowStr(1,  0, "   ", 3);
    min=value ;
    j=0;
    value=0;

   }
   if(key=='B')   //B也就是max,上限
   {
       LCD1602_ShowStr(1, 0, "   ", 3);
    max=value;
    j=0;
    value=0;
   }
    d=min%10;   
    c=min/10%10;
    b=min/100%10;
    LCD_ShowNum(0, 4,b);
    LCD_ShowNum(0, 5,c);
    LCD_ShowNum(0, 6,d);      
    d1=max%10;  
    c1=max/10%10;
    b1=max/100%10;
    LCD_ShowNum(0, 12,b1);
    LCD_ShowNum(0, 13,c1);
    LCD_ShowNum(0, 14,d1);
}

void LCD_init(void)
{
LCD_write_command(0x38);  
LCD_write_command(0x0c);
LCD_write_command(0x06);
LCD_write_command(0x01);
}
void LCD_write_command(unsigned char com)
{
LCD_E=0;   
LCD_RS=0;
LCD_RW=0;
LCD_DB=com;
delay(1000);
LCD_E=1;
delay(5000);
LCD_E=0;
}
void LCD_write_data(unsigned char dat)
{
LCD_E=0;
LCD_RS=1;
LCD_RW=0;
LCD_DB=dat
delay(1000);
LCD_E=1;
delay(5000);
LCD_E=0;
}
void LCD1602_ShowStr(unsigned char x, unsigned char y, unsigned char *str, unsigned char len)
{
    LCD1602_SetCursor(x, y);
    while (len--)            
    {
        LCD_write_data(*str++);
    }
}
void LCD_ShowNum(unsigned char x, unsigned char y,unsigned char num)
{     
     LCD1602_SetCursor(x, y)
        LCD_ShowChar(x,y,num+'0');

}
void LCD_ShowChar(unsigned char x, unsigned char y,unsigned char dat)
{
     LCD1602_SetCursor(x, y);
        LCD_write_data(dat);
}
void LCD1602_SetCursor(unsigned char x, unsigned char y)
{
    unsigned char addr;
    if (x == 0)
     addr = 0x00 + y;
    else
     addr = 0x40 + y;
    LCD_write_command(addr|0x80);
}
void init()//中斷初始化
{
TMOD=0x11; //?????0??1?????????1??  0001 0001
TH0=(65536-50000)/256;//?????0??1??????
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;   //?????ж?
ET0=1; //???????0?ж?
ET1=1; //???????1?ж?
EX0=1; //?????ж?0
EX1=1; //?????ж?1
TR0=1; //????????0
TR1=1; //????????1
IT0=1; //???ж?0??????????
IT1=1;  //???ж?1??????????
}
void int0() interrupt 0  //外部中斷0檢測 液體低落
{
EX0=0;
number1=0;   
speed_count++;
EX0=1;  
delayms(1);
}
void int1() interrupt 2//中斷1檢測液位變化
{
EX1=0;
while(1)
{
  beep=0;
  delay(1000);
  beep=1;
  delay(1000);
  if(read_key()=='D') break;
}
EX1=1;
}
void T0_time() interrupt 1       //定時器0每5秒number0置零,time_out=1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
number0++;
if(number0==100)  
{
  number0=0;   
  time_out=1;
}
}
void T1_time() interrupt 3  
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
number1++;   
if(number1==1200)  
{
  while(1)
  {
   beep=0;
   delay(1000);
   beep=1;
   delay(1000);
   if(read_key()=='D')break;
  }
}
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:648281 發表于 2020-7-1 17:24 | 只看該作者
你好!
那你就改成,在設置的時候,屏蔽掉其他操作,等待設置完成
回復

使用道具 舉報

板凳
ID:697573 發表于 2020-7-1 17:31 | 只看該作者
51hei**1140 發表于 2020-7-1 17:24
你好!
那你就改成,在設置的時候,屏蔽掉其他操作,等待設置完成

我是個新手小白,能不能具體說一下
回復

使用道具 舉報

地板
ID:267932 發表于 2020-7-1 19:10 | 只看該作者
你可以設置個全局變量,只有所以設置完成,將變量置1, 然后你電機不是在定時器跑得嘛,在這里面判斷你這個變量為1時,才跑電機程序。
回復

使用道具 舉報

5#
ID:633896 發表于 2020-7-7 11:35 | 只看該作者
圖沒有問題 多半是程序的問題。
回復

使用道具 舉報

6#
ID:608600 發表于 2020-7-7 11:37 | 只看該作者
程序的問題
回復

使用道具 舉報

7#
ID:801878 發表于 2020-7-28 10:13 | 只看該作者
delay時間看下,會影響的
回復

使用道具 舉報

8#
ID:912130 發表于 2021-5-6 18:26 | 只看該作者
我想問一下電機控制的是輸液器的滾輪還是控制的輸液瓶的高度來控制滴速
回復

使用道具 舉報

9#
ID:844772 發表于 2021-5-6 21:29 | 只看該作者
本帖最后由 glinfei 于 2021-5-6 21:47 編輯

給你兩個取巧的辦法把:1.先設max,再設min,反正speed初值為0,就不會馬上轉。2.是加個初始標志變量,比如uchar firstrun=0; if((speed<min)&&firstrun),設完max和min后,加一句{ firstrun=1;}     
回復

使用道具 舉報

10#
ID:1009154 發表于 2022-3-9 11:07 | 只看該作者
解決了嗎,樓主可以向你問點問題嗎
回復

使用道具 舉報

11#
ID:1012634 發表于 2022-3-24 07:35 | 只看該作者
厲害了  求樓主試試同時控制8個步進電機的電路圖
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: www.99热.com | 黄免费看| 午夜激情一区 | 日韩免费 | 欧美精品一区二区三区在线四季 | caoporn国产精品免费公开 | 国产人久久人人人人爽 | 人人爽日日躁夜夜躁尤物 | 一级全黄视频 | 成人一区二区三区在线 | 天天天操操操 | 国产精品美女久久久 | 99久久中文字幕三级久久日本 | 精品自拍视频在线观看 | 亚州影院 | 精品国产视频 | www.中文字幕 | 亚洲综合婷婷 | 亚洲h视频 | 久久机热 | 中文在线一区二区 | 一区二区精品 | 中文字幕一区二区三区日韩精品 | 免费视频一区二区三区在线观看 | 日本三级电影免费 | 久亚州在线播放 | 欧美激情五月 | 国产欧美精品一区二区 | 精品久久久久久久久久久久久久 | 日本三级黄视频 | 欧美在线视频一区 | 国产精品成av人在线视午夜片 | 亚洲精品视频在线 | 一级做a爰片久久毛片免费看 | 国产a区| 日韩免费 | 中文字幕亚洲精品在线观看 | 国产综合精品 | 中文字幕免费观看 | 久草新在线 | 福利视频网站 |