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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1378|回復(fù): 1
收起左側(cè)

實(shí)現(xiàn)了按鍵調(diào)速,但不知道怎么用電位器調(diào)節(jié)電機(jī)速度,求大佬 附單片機(jī)程序

[復(fù)制鏈接]
ID:1115627 發(fā)表于 2024-4-30 09:56 | 顯示全部樓層 |閱讀模式
51hei圖片20240422131040.png
正反轉(zhuǎn)功能哪些可以不要

單片機(jī)源程序如下:
#include"reg52.h"//單片機(jī)頭文件
#define uchar unsigned char//宏定義,用uchar表示unsigned char,叫無(wú)符號(hào)字符型數(shù)據(jù)類型,取值范圍為:0到255。
#define uint unsigned int//宏定義,用uint表示unsigned int,叫無(wú)符號(hào)整數(shù)型數(shù)據(jù)類型,取值范圍為:0到65535。
sbit qitingjian=P1^0;//位定義啟停鍵
sbit zhengzhuan=P1^1;//位定義正轉(zhuǎn)鍵
sbit fanzhuan=P1^2;//位定義反轉(zhuǎn)鍵
sbit jiasujian=P1^3;//位定義加速鍵
sbit jiansujian=P1^4;//位定義減速鍵
sbit IN1=P1^5;//位定義數(shù)碼管段碼端口
sbit IN2=P1^6;//位定義數(shù)碼管位碼端口
sbit ENA=P1^7;//位定義L298M芯片使能端ENA
sbit duan=P3^0;//位定義L298M芯片控制端IN1
sbit wei=P3^1;//位定義L298M芯片控制端IN2
sbit qitingled=P3^4;//位定義啟停指示燈
sbit zhengzhuanled=P3^5;//位定義正轉(zhuǎn)指示燈
sbit fanzhuanled=P3^6;//位定義反轉(zhuǎn)指示燈
sbit zhuansuled=P3^7;//位定義轉(zhuǎn)速指示燈
sbit waibuzhongduanling=P3^2; //外部中斷0端口
uint qian,bai,shi,ge,zhuansu;//數(shù)碼管千位變量、百位變量、十位變量、個(gè)位變量以及轉(zhuǎn)速變量
uint maichongcount,Time0num,Time1num,pwm,qitingnum,zhengzhuanflag,fanzhuanflag;//脈沖計(jì)數(shù)變量、定時(shí)器0定時(shí)計(jì)數(shù)變量、定時(shí)器1定時(shí)計(jì)數(shù)變量、脈沖寬度調(diào)制變量、啟停鍵按下數(shù)次變量、正轉(zhuǎn)標(biāo)志位變量、反轉(zhuǎn)標(biāo)志位變量
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x40,0x7c,0x39,0x5e,0x79,0x71,0x00};//共陰數(shù)碼管段碼,高電平點(diǎn)亮段碼,低電平熄滅段碼。
uchar code weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};//共陰數(shù)碼管位碼,低電平點(diǎn)亮位碼,高電平熄滅位碼。
void delay(uint jishi);//毫秒延時(shí)函數(shù)
void TimerInit();//定時(shí)器初始化函數(shù)
void Time0();//定時(shí)器0定時(shí)函數(shù)
void Time1();//定時(shí)器1定時(shí)函數(shù)
void KeyScan();//按鍵掃描函數(shù)
void waibuzhongduanlingjishu();//外部中斷0計(jì)數(shù)函數(shù)
void shumaguandisplay(uint qian,uint bai,uint shi,uint ge);//數(shù)碼管顯示函數(shù)
void shumaguannodisplay(uint qian,uint bai,uint shi,uint ge);//數(shù)碼管無(wú)顯示函數(shù)
  void main()//主函數(shù)
{
   TimerInit();//定時(shí)器初始化函數(shù)
   IN1=0;//L298M芯片控制端IN1置低電平,電機(jī)不運(yùn)轉(zhuǎn)。
   IN2=0;//L298M芯片控制端IN2置低電平,電機(jī)不運(yùn)轉(zhuǎn)。
   while(1)//死循環(huán)
{
    KeyScan();//按鍵掃描函數(shù)
    if(qitingnum==1)//判斷啟停鍵是否第一次按下
    shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)
  }
}
  void delay(uint jishi)//延時(shí)函數(shù)
{
   uint i,j;
   for(i=jishi;i>0;i--)
    for(j=110;j>0;j--);
  }
  void TimerInit()//定時(shí)器初始化函數(shù)
{
   TMOD=0x11;//設(shè)定定時(shí)器為定時(shí)器0和定時(shí)器1,工作模式都為1。
   TH0=(65536-1000)/256;//TH0裝初值為65536-100=65436,即定時(shí)100微妙,相當(dāng)于0.1毫秒。
   TL0=(65536-1000)%256;//TL0裝初值為65536-100=65436
   TH1=(65536-50000)/256;//TH1裝初值為65536-50000=15536,即定時(shí)50000微妙,相當(dāng)于50毫秒。
   TL1=(65536-50000)%256;//TL1裝初值為65536-50000=15536
   EA=1;//全局中斷允許
   ET0=1;//打開定時(shí)器0中斷允許
   TR0=1;//開定時(shí)器0      
   EX0=1;//開外部中斷0允許
   IT0=1;//設(shè)置外部中斷0下降觸發(fā)中斷
   ET1=1;//打開定時(shí)器1中斷允許
   TR1=1;//開定時(shí)器1
}
  void Time0() interrupt 1//定時(shí)器0定時(shí)函數(shù),每0.1毫秒產(chǎn)生pwm波一次。
{      
   TH0=(65536-1000)/256;//TH0重裝初值為65536-100=65436,即定時(shí)100微妙,相當(dāng)于0.1毫秒。
   TL0=(65536-1000)%256;//TH0重裝初值為65536-100=65436
   Time0num++;//定時(shí)器0定時(shí)計(jì)數(shù)變量先賦值再自加
   if(Time0num==20)//判斷定時(shí)器0定時(shí)計(jì)數(shù)變量是否大于等于20,PWM波完整周期為20ms,定時(shí)器0定時(shí)計(jì)數(shù)變量Time0num數(shù)值越大,電機(jī)運(yùn)轉(zhuǎn)越快。
  {
    Time0num=0;//定時(shí)器0定時(shí)計(jì)數(shù)變量等于0
   }
   if(Time0num<pwm)//判斷定時(shí)器0定時(shí)計(jì)數(shù)變量還否小于脈沖寬度調(diào)制變量      
  {                              
    ENA=1;//L298M芯片使能端ENA置高電平,電機(jī)運(yùn)轉(zhuǎn)。
    zhuansuled=0;//開轉(zhuǎn)速指示燈
   }
   else
  {
    ENA=0;//L298M芯片使能端ENA置低電平,電機(jī)不運(yùn)轉(zhuǎn)。
    zhuansuled=1;//關(guān)轉(zhuǎn)速指示燈
   }
}
  void Time1() interrupt 3//定時(shí)器1定時(shí)函數(shù),定時(shí)50ms,采集電機(jī)轉(zhuǎn)速。      
{      
   TH1=(65536-50000)/256;//TH1裝初值為65536-50000=15536,即定時(shí)50000微妙,相當(dāng)于50毫秒。
   TL1=(65536-50000)%256;//TH1裝初值為65536-50000=15536
   Time1num++;//定時(shí)器1定時(shí)計(jì)數(shù)變量先賦值再自加
   if(Time1num==20)//判斷定時(shí)器1定時(shí)計(jì)數(shù)變量是否等于20,即每1秒測(cè)速一次。
  {      
    Time1num=0;//定時(shí)器1定時(shí)計(jì)數(shù)變量等于0
    EX0=0;//關(guān)外部中斷0
    zhuansu=55*maichongcount/24;//電機(jī)轉(zhuǎn)速=每分鐘X脈沖計(jì)數(shù)變量/每轉(zhuǎn)一圈需要的脈沖個(gè)數(shù),即55*maichongcount/24,其中的55表示55秒,為什么不是一分鐘60秒?由于Protues仿真電路圖中的MOTOR-ENCODER仿真件存在誤差,為了讓MOTOR-ENCODER仿真件顯示的轉(zhuǎn)速達(dá)到數(shù)碼管顯示轉(zhuǎn)速的效果,進(jìn)行了一定秒數(shù)的修改,不過實(shí)際運(yùn)用要以一分鐘60秒為準(zhǔn),maichongcount為單片機(jī)從外部中斷0端口處獲取MOTOR-ENCODER仿真件旋轉(zhuǎn)生產(chǎn)的脈沖計(jì)數(shù)變量,24為MOTOR-ENCODER仿真件每旋轉(zhuǎn)一圈產(chǎn)生的脈沖個(gè)數(shù)。
    qian=zhuansu/1000;//數(shù)碼管千位顯示
    bai=zhuansu%1000/100;//數(shù)碼管百位顯示
    shi=zhuansu%100/10;//數(shù)碼管十位顯示
    ge=zhuansu%10;//數(shù)碼管個(gè)位顯示
    maichongcount=0;//脈沖計(jì)數(shù)變量歸零
    EX0=1;//開外部中斷0
   }
}
  void waibuzhongduanlingjishu() interrupt 0  using 1//外部中斷0計(jì)數(shù)函數(shù),外部脈沖計(jì)數(shù)。
{
   maichongcount++ ;//脈沖計(jì)數(shù)變量先賦值再自加
  }
  void KeyScan()//按鍵掃描函數(shù)
{
   if(qitingjian==0)//判斷啟停鍵是否按下
  {
    shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)做延時(shí)
    if(qitingjian==0)//再次判斷啟停鍵是否按下
   {
     while(!qitingjian)//啟停鍵釋放
     shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)
     qitingnum++;//啟停鍵按下數(shù)次變量先賦值再加加
     qitingled=0;//開啟停指示燈
     if(qitingnum==2)//判斷啟停鍵按下數(shù)次變量是否為2
    {
      qitingnum=0;//啟停鍵按下數(shù)次變量歸零
      qitingled=1;//關(guān)啟停指示燈
      zhengzhuanled=1;//關(guān)正轉(zhuǎn)指示燈
      fanzhuanled=1;//關(guān)反轉(zhuǎn)指示燈
      zhuansuled=1;//關(guān)轉(zhuǎn)速指示燈
      zhengzhuanflag=0;//正轉(zhuǎn)標(biāo)志位變量為0
      fanzhuanflag=0;//反轉(zhuǎn)標(biāo)志位變量為0
      IN1=0;//L298M芯片控制端IN1置低電平,電機(jī)不運(yùn)轉(zhuǎn)。
      IN2=0;//L298M芯片控制端IN2置低電平,電機(jī)不運(yùn)轉(zhuǎn)。
      shumaguannodisplay(qian,bai,shi,ge);//數(shù)碼管無(wú)顯示函數(shù)
     }
    }
   }
   if(qitingnum==1)//判斷啟停鍵是否第一次按下
  {     
    if(zhengzhuan==0)//判斷是否按下正轉(zhuǎn)鍵
   {
     shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)做延時(shí)
     if(zhengzhuan==0)//再次判斷是否按下正轉(zhuǎn)
    {
      while(!zhengzhuan)//正轉(zhuǎn)鍵釋放
      shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)做延時(shí)
      zhengzhuanled=0;//開正轉(zhuǎn)指示燈
      fanzhuanled=1;//關(guān)反轉(zhuǎn)指示燈
      zhengzhuanflag=1;//正轉(zhuǎn)標(biāo)志位變量為1
      fanzhuanflag=0;//反轉(zhuǎn)標(biāo)志位變量為0
      IN1=1;//L298N芯片控制端IN1置高電平
      IN2=0;//L298N芯片控制端IN2置低電平
     }
    }
    if(fanzhuan==0)//判斷是否按下反轉(zhuǎn)鍵
   {
     shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)做延時(shí)
     if(fanzhuan==0)//再次判斷是否按下反轉(zhuǎn)鍵
    {
      while(!fanzhuan)//反轉(zhuǎn)鍵釋放
      shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)做延時(shí)
      zhengzhuanled=1;//關(guān)正轉(zhuǎn)指示燈
      fanzhuanled=0;//開反轉(zhuǎn)指示燈
      zhengzhuanflag=0;//正轉(zhuǎn)標(biāo)志位變量為0
      fanzhuanflag=1;//反轉(zhuǎn)標(biāo)志位變量為1
      IN1=0;//L298N芯片控制端IN1置低電平
      IN2=1;//L298N芯片控制端IN2置高電平
     }
    }
   }
    if(zhengzhuanflag==1||fanzhuanflag==1)//判斷電機(jī)是否為正轉(zhuǎn)或反轉(zhuǎn)
   {
     if(jiasujian==0)//判斷是否按下加速鍵
    {
      shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)做延時(shí)
      if(jiasujian==0)//再次判斷是否按下加速鍵
     {
       while(!jiasujian)//加速鍵釋放
       shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)做延時(shí)
       if(pwm < 20)//判斷脈沖寬度調(diào)制變量是否小于20
       pwm++;//脈沖寬度調(diào)制變量先賦值再加加
       if(pwm >= 20)//判斷脈沖寬度調(diào)制變量是否大于等于20
       pwm = 19;//脈沖寬度調(diào)制變量等于20                                 
      }
     }
     if(jiansujian==0) //判斷是否按下減速鍵
    {
      shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)做延時(shí)
      if(jiansujian==0)//再次判斷是否按下減鍵
     {
       while(!jiansujian)//減速鍵釋放
       shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)做延時(shí)
       if(pwm > 0)//判斷脈沖寬度調(diào)制變量是否大于0
       pwm--;//脈沖寬度調(diào)制變量先賦值再減減
       if(pwm <= 0)//判斷脈沖寬度調(diào)制變量是否小于等于0
       pwm = 0;//脈沖寬度調(diào)制變量等于0
      }
     }
    }
   }
  void shumaguandisplay(uint qian,uint bai,uint shi,uint ge)//數(shù)碼管顯示函數(shù)
{
   duan=1;//開數(shù)碼管段碼端口                     
   P0=table[qian];//數(shù)碼千位顯示
   duan=0;//關(guān)數(shù)碼管段碼端口
   P0=0x00;//關(guān)數(shù)碼管段碼顯示
   wei=1;//開數(shù)碼管位碼端口
   P2=weima[0];//第1位數(shù)碼管顯示
   wei=0;//關(guān)數(shù)碼管位碼端口
   delay(1);//延時(shí)

   duan=1;//開數(shù)碼管段碼端口                     
   P0=table[bai];//數(shù)碼百位顯示
   duan=0;//關(guān)數(shù)碼管段碼端口
   P0=0x00;//關(guān)數(shù)碼管段碼顯示
   wei=1;//開數(shù)碼管位碼端口
   P2=weima[1];//第2位數(shù)碼管顯示
   wei=0;//關(guān)數(shù)碼管位碼端口
   delay(1);//延時(shí)

   duan=1;//開數(shù)碼管段碼端口                  
   P0=table[shi];//數(shù)碼管十位顯示
   duan=0;//關(guān)數(shù)碼管段碼端口
   P0=0x00;//關(guān)數(shù)碼管段碼顯示
   wei=1;//開數(shù)碼管位碼端口
   P2=weima[2];//第3位數(shù)碼管顯示
   wei=0;//關(guān)數(shù)碼管位碼端口
   delay(1);//延時(shí)

   duan=1;//開數(shù)碼管段碼端口                        
   P0=table[ge];//數(shù)碼管個(gè)位顯示
   duan=0;//關(guān)數(shù)碼管段碼端口
   P0=0x00;//關(guān)數(shù)碼管段碼顯示
   wei=1;//開數(shù)碼管位碼端口
   P2=weima[3];//第4位數(shù)碼管顯示
   wei=0;//關(guān)數(shù)碼管位碼端口
   delay(1);//延時(shí)     
}
  void shumaguannodisplay(uint qian,uint bai,uint shi,uint ge)//數(shù)碼管顯示函數(shù)
{
   duan=1;//開數(shù)碼管段碼端口  
   P0=table[qian];//數(shù)碼千位顯示
   duan=1;//關(guān)數(shù)碼管段碼端口
   P0=0x00;//關(guān)數(shù)碼管段碼顯示
   wei=1;//開數(shù)碼管位碼端口
   P2=weima[0];//第1位數(shù)碼管顯示
   wei=1;//關(guān)數(shù)碼管位碼端口
   delay(1);//延時(shí)

   duan=1;//開數(shù)碼管段碼端口                     
   P0=table[bai];//數(shù)碼百位顯示
   duan=1;//關(guān)數(shù)碼管段碼端口
   P0=0x00;//關(guān)數(shù)碼管段碼顯示
   wei=1;//開數(shù)碼管位碼端口
   P2=weima[1];//第2位數(shù)碼管顯示
   wei=1;//關(guān)數(shù)碼管位碼端口
   delay(1);//延時(shí)

   duan=1;//開數(shù)碼管段碼端口                  
   P0=table[shi];//數(shù)碼管十位顯示
   duan=1;//關(guān)數(shù)碼管段碼端口
   P0=0x00;//關(guān)數(shù)碼管段碼顯示
   wei=1;//開數(shù)碼管位碼端口
   P2=weima[2];//第3位數(shù)碼管顯示
   wei=1;//關(guān)數(shù)碼管位碼端口
   delay(1);//延時(shí)

   duan=1;//開數(shù)碼管段碼端口                        
   P0=table[ge];//數(shù)碼管個(gè)位顯示
   duan=1;//關(guān)數(shù)碼管段碼端口
   P0=0x00;//關(guān)數(shù)碼管段碼顯示
   wei=1;//開數(shù)碼管位碼端口
   P2=weima[3];//第4位數(shù)碼管顯示
   wei=1;//關(guān)數(shù)碼管位碼端口
   delay(1);//延時(shí)     
}

回復(fù)

使用道具 舉報(bào)

ID:1109793 發(fā)表于 2024-4-30 11:35 | 顯示全部樓層
你這調(diào)速帶PID不
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产a区 | 91香蕉视频在线观看 | 国产精品久久久久久久久久久久久久 | 精品视频一区二区三区在线观看 | 奇米四色影视 | www.99热.com| 亚洲一区国产精品 | 久久久久国产 | 日日噜噜噜夜夜爽爽狠狠视频, | 日本电影免费完整观看 | 亚洲经典一区 | 欧美一区二区三区久久精品 | 一级黄a视频 | 国产91在线视频 | 日本三级在线网站 | 国产在线视频一区二区董小宛性色 | 中文字幕亚洲区一区二 | 日韩一区二区三区在线播放 | 国产成人jvid在线播放 | 日本精品一区二区三区视频 | 天天影视综合 | 成人a在线观看 | www.青青草 | 中文字幕一区二区三区四区 | 久久亚 | 999国产视频 | 91资源在线 | 亚洲成人精选 | 97伦理电影网 | 久久亚洲国产精品 | 久久com | 亚洲一区二区久久 | 一区二区国产精品 | 欧美日韩亚洲成人 | 欧美在线小视频 | 国产专区视频 | 国产精品99久久久久久人 | 一区二区视频免费观看 | 日韩在线观看网站 | 国产精品久久久久久久久 | 日韩精品在线网站 |