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

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

QQ登錄

只需一步,快速開始

搜索
查看: 4027|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

基于51單片機(jī)PWM調(diào)速數(shù)碼管顯示測(cè)速L298芯片控制直流電機(jī)正反運(yùn)轉(zhuǎn)的項(xiàng)目工程

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本帖最后由 51黑電子會(huì)員 于 2020-4-25 16:25 編輯
  1. #include"reg52.h"//單片機(jī)頭文件
  2. #define uchar unsigned char//宏定義,用uchar表示unsigned char,叫無符號(hào)字符型數(shù)據(jù)類型,取值范圍為:0到255。
  3. #define uint unsigned int//宏定義,用uint表示unsigned int,叫無符號(hào)整數(shù)型數(shù)據(jù)類型,取值范圍為:0到65535。
  4. sbit qitingjian=P1^0;//位定義啟停鍵
  5. sbit zhengzhuan=P1^1;//位定義正轉(zhuǎn)鍵
  6. sbit fanzhuan=P1^2;//位定義反轉(zhuǎn)鍵
  7. sbit jiasujian=P1^3;//位定義加速鍵
  8. sbit jiansujian=P1^4;//位定義減速鍵
  9. sbit IN1=P1^5;//位定義數(shù)碼管段碼端口
  10. sbit IN2=P1^6;//位定義數(shù)碼管位碼端口
  11. sbit ENA=P1^7;//位定義L298M芯片使能端ENA
  12. sbit duan=P3^0;//位定義L298M芯片控制端IN1
  13. sbit wei=P3^1;//位定義L298M芯片控制端IN2
  14. sbit qitingled=P3^4;//位定義啟停指示燈
  15. sbit zhengzhuanled=P3^5;//位定義正轉(zhuǎn)指示燈
  16. sbit fanzhuanled=P3^6;//位定義反轉(zhuǎn)指示燈
  17. sbit zhuansuled=P3^7;//位定義轉(zhuǎn)速指示燈
  18. sbit waibuzhongduanling=P3^2; //外部中斷0端口
  19. uint qian,bai,shi,ge,zhuansu;//數(shù)碼管千位變量、百位變量、十位變量、個(gè)位變量以及轉(zhuǎn)速變量
  20. 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)志位變量
  21. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x40,0x7c,0x39,0x5e,0x79,0x71,0x00};//共陰數(shù)碼管段碼,高電平點(diǎn)亮段碼,低電平熄滅段碼。
  22. uchar code weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};//共陰數(shù)碼管位碼,低電平點(diǎn)亮位碼,高電平熄滅位碼。
  23. void delay(uint jishi);//毫秒延時(shí)函數(shù)
  24. void TimerInit();//定時(shí)器初始化函數(shù)
  25. void Time0();//定時(shí)器0定時(shí)函數(shù)
  26. void Time1();//定時(shí)器1定時(shí)函數(shù)
  27. void KeyScan();//按鍵掃描函數(shù)
  28. void waibuzhongduanlingjishu();//外部中斷0計(jì)數(shù)函數(shù)
  29. void shumaguandisplay(uint qian,uint bai,uint shi,uint ge);//數(shù)碼管顯示函數(shù)
  30. void shumaguannodisplay(uint qian,uint bai,uint shi,uint ge);//數(shù)碼管無顯示函數(shù)
  31.   void main()//主函數(shù)
  32. {
  33.    TimerInit();//定時(shí)器初始化函數(shù)
  34.    IN1=0;//L298M芯片控制端IN1置低電平,電機(jī)不運(yùn)轉(zhuǎn)。
  35.    IN2=0;//L298M芯片控制端IN2置低電平,電機(jī)不運(yùn)轉(zhuǎn)。
  36.    while(1)//死循環(huán)
  37. {
  38.     KeyScan();//按鍵掃描函數(shù)
  39.     if(qitingnum==1)//判斷啟停鍵是否第一次按下
  40.     shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)
  41.   }
  42. }
  43.   void delay(uint jishi)//延時(shí)函數(shù)
  44. {
  45.    uint i,j;
  46.    for(i=jishi;i>0;i--)
  47.     for(j=110;j>0;j--);
  48.   }
  49.   void TimerInit()//定時(shí)器初始化函數(shù)
  50. {
  51.    TMOD=0x11;//設(shè)定定時(shí)器為定時(shí)器0和定時(shí)器1,工作模式都為1。
  52.    TH0=(65536-1000)/256;//TH0裝初值為65536-100=65436,即定時(shí)100微妙,相當(dāng)于0.1毫秒。
  53.    TL0=(65536-1000)%256;//TL0裝初值為65536-100=65436
  54.    TH1=(65536-50000)/256;//TH1裝初值為65536-50000=15536,即定時(shí)50000微妙,相當(dāng)于50毫秒。
  55.    TL1=(65536-50000)%256;//TL1裝初值為65536-50000=15536
  56.    EA=1;//全局中斷允許
  57.    ET0=1;//打開定時(shí)器0中斷允許
  58.    TR0=1;//開定時(shí)器0      
  59.    EX0=1;//開外部中斷0允許
  60.    IT0=1;//設(shè)置外部中斷0下降觸發(fā)中斷
  61.    ET1=1;//打開定時(shí)器1中斷允許
  62.    TR1=1;//開定時(shí)器1
  63. }
  64.   void Time0() interrupt 1//定時(shí)器0定時(shí)函數(shù),每0.1毫秒產(chǎn)生pwm波一次。
  65. {      
  66.    TH0=(65536-1000)/256;//TH0重裝初值為65536-100=65436,即定時(shí)100微妙,相當(dāng)于0.1毫秒。
  67.    TL0=(65536-1000)%256;//TH0重裝初值為65536-100=65436
  68.    Time0num++;//定時(shí)器0定時(shí)計(jì)數(shù)變量先賦值再自加
  69.    if(Time0num==20)//判斷定時(shí)器0定時(shí)計(jì)數(shù)變量是否大于等于20,PWM波完整周期為20ms,定時(shí)器0定時(shí)計(jì)數(shù)變量Time0num數(shù)值越大,電機(jī)運(yùn)轉(zhuǎn)越快。
  70.   {
  71.     Time0num=0;//定時(shí)器0定時(shí)計(jì)數(shù)變量等于0
  72.    }
  73.    if(Time0num<pwm)//判斷定時(shí)器0定時(shí)計(jì)數(shù)變量還否小于脈沖寬度調(diào)制變量      
  74.   {                              
  75.     ENA=1;//L298M芯片使能端ENA置高電平,電機(jī)運(yùn)轉(zhuǎn)。
  76.     zhuansuled=0;//開轉(zhuǎn)速指示燈
  77.    }
  78.    else
  79.   {
  80.     ENA=0;//L298M芯片使能端ENA置低電平,電機(jī)不運(yùn)轉(zhuǎn)。
  81.     zhuansuled=1;//關(guān)轉(zhuǎn)速指示燈
  82.    }
  83. }
  84.   void Time1() interrupt 3//定時(shí)器1定時(shí)函數(shù),定時(shí)50ms,采集電機(jī)轉(zhuǎn)速。      
  85. {      
  86.    TH1=(65536-50000)/256;//TH1裝初值為65536-50000=15536,即定時(shí)50000微妙,相當(dāng)于50毫秒。
  87.    TL1=(65536-50000)%256;//TH1裝初值為65536-50000=15536
  88.    Time1num++;//定時(shí)器1定時(shí)計(jì)數(shù)變量先賦值再自加
  89.    if(Time1num==20)//判斷定時(shí)器1定時(shí)計(jì)數(shù)變量是否等于20,即每1秒測(cè)速一次。
  90.   {      
  91.     Time1num=0;//定時(shí)器1定時(shí)計(jì)數(shù)變量等于0
  92.     EX0=0;//關(guān)外部中斷0
  93.     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ù)。
  94.     qian=zhuansu/1000;//數(shù)碼管千位顯示
  95.     bai=zhuansu%1000/100;//數(shù)碼管百位顯示
  96.     shi=zhuansu%100/10;//數(shù)碼管十位顯示
  97.     ge=zhuansu%10;//數(shù)碼管個(gè)位顯示
  98.     maichongcount=0;//脈沖計(jì)數(shù)變量歸零
  99.     EX0=1;//開外部中斷0
  100.    }
  101. }
  102.   void waibuzhongduanlingjishu() interrupt 0  using 1//外部中斷0計(jì)數(shù)函數(shù),外部脈沖計(jì)數(shù)。
  103. {
  104.    maichongcount++ ;//脈沖計(jì)數(shù)變量先賦值再自加
  105.   }
  106.   void KeyScan()//按鍵掃描函數(shù)
  107. {
  108.    if(qitingjian==0)//判斷啟停鍵是否按下
  109.   {
  110.     shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)做延時(shí)
  111.     if(qitingjian==0)//再次判斷啟停鍵是否按下
  112.    {
  113.      while(!qitingjian)//啟停鍵釋放
  114.      shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)
  115.      qitingnum++;//啟停鍵按下數(shù)次變量先賦值再加加
  116.      qitingled=0;//開啟停指示燈
  117.      if(qitingnum==2)//判斷啟停鍵按下數(shù)次變量是否為2
  118.     {
  119.       qitingnum=0;//啟停鍵按下數(shù)次變量歸零
  120.       qitingled=1;//關(guān)啟停指示燈
  121.       zhengzhuanled=1;//關(guān)正轉(zhuǎn)指示燈
  122.       fanzhuanled=1;//關(guān)反轉(zhuǎn)指示燈
  123.       zhuansuled=1;//關(guān)轉(zhuǎn)速指示燈
  124.       zhengzhuanflag=0;//正轉(zhuǎn)標(biāo)志位變量為0
  125.       fanzhuanflag=0;//反轉(zhuǎn)標(biāo)志位變量為0
  126.       IN1=0;//L298M芯片控制端IN1置低電平,電機(jī)不運(yùn)轉(zhuǎn)。
  127.       IN2=0;//L298M芯片控制端IN2置低電平,電機(jī)不運(yùn)轉(zhuǎn)。
  128.       shumaguannodisplay(qian,bai,shi,ge);//數(shù)碼管無顯示函數(shù)
  129.      }
  130.     }
  131.    }
  132.    if(qitingnum==1)//判斷啟停鍵是否第一次按下
  133.   {     
  134.     if(zhengzhuan==0)//判斷是否按下正轉(zhuǎn)鍵
  135.    {
  136.      shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)做延時(shí)
  137.      if(zhengzhuan==0)//再次判斷是否按下正轉(zhuǎn)
  138.     {
  139.       while(!zhengzhuan)//正轉(zhuǎn)鍵釋放
  140.       shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)做延時(shí)
  141.       zhengzhuanled=0;//開正轉(zhuǎn)指示燈
  142.       fanzhuanled=1;//關(guān)反轉(zhuǎn)指示燈
  143.       zhengzhuanflag=1;//正轉(zhuǎn)標(biāo)志位變量為1
  144.       fanzhuanflag=0;//反轉(zhuǎn)標(biāo)志位變量為0
  145.       IN1=1;//L298N芯片控制端IN1置高電平
  146.       IN2=0;//L298N芯片控制端IN2置低電平
  147.      }
  148.     }
  149.     if(fanzhuan==0)//判斷是否按下反轉(zhuǎn)鍵
  150.    {
  151.      shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)做延時(shí)
  152.      if(fanzhuan==0)//再次判斷是否按下反轉(zhuǎn)鍵
  153.     {
  154.       while(!fanzhuan)//反轉(zhuǎn)鍵釋放
  155.       shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)做延時(shí)
  156.       zhengzhuanled=1;//關(guān)正轉(zhuǎn)指示燈
  157.       fanzhuanled=0;//開反轉(zhuǎn)指示燈
  158.       zhengzhuanflag=0;//正轉(zhuǎn)標(biāo)志位變量為0
  159.       fanzhuanflag=1;//反轉(zhuǎn)標(biāo)志位變量為1
  160.       IN1=0;//L298N芯片控制端IN1置低電平
  161.       IN2=1;//L298N芯片控制端IN2置高電平
  162.      }
  163.     }
  164.    }
  165.     if(zhengzhuanflag==1||fanzhuanflag==1)//判斷電機(jī)是否為正轉(zhuǎn)或反轉(zhuǎn)
  166.    {
  167.      if(jiasujian==0)//判斷是否按下加速鍵
  168.     {
  169.       shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)做延時(shí)
  170.       if(jiasujian==0)//再次判斷是否按下加速鍵
  171.      {
  172.        while(!jiasujian)//加速鍵釋放
  173.        shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)做延時(shí)
  174.        if(pwm < 20)//判斷脈沖寬度調(diào)制變量是否小于20
  175.        pwm++;//脈沖寬度調(diào)制變量先賦值再加加
  176.        if(pwm >= 20)//判斷脈沖寬度調(diào)制變量是否大于等于20
  177.        pwm = 19;//脈沖寬度調(diào)制變量等于20                                 
  178.       }
  179.      }
  180.      if(jiansujian==0) //判斷是否按下減速鍵
  181.     {
  182.       shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)做延時(shí)
  183.       if(jiansujian==0)//再次判斷是否按下減鍵
  184.      {
  185.        while(!jiansujian)//減速鍵釋放
  186.        shumaguandisplay(qian,bai,shi,ge);//數(shù)碼管顯示函數(shù)做延時(shí)
  187.        if(pwm > 0)//判斷脈沖寬度調(diào)制變量是否大于0
  188.        pwm--;//脈沖寬度調(diào)制變量先賦值再減減
  189.        if(pwm <= 0)//判斷脈沖寬度調(diào)制變量是否小于等于0
  190.        pwm = 0;//脈沖寬度調(diào)制變量等于0
  191.       }
  192.      }
  193.     }
  194.    }
  195.   void shumaguandisplay(uint qian,uint bai,uint shi,uint ge)//數(shù)碼管顯示函數(shù)
  196. {
  197.    duan=1;//開數(shù)碼管段碼端口                     
  198.    P0=table[qian];//數(shù)碼千位顯示
  199.    duan=0;//關(guān)數(shù)碼管段碼端口
  200.    P0=0x00;//關(guān)數(shù)碼管段碼顯示
  201.    wei=1;//開數(shù)碼管位碼端口
  202.    P2=weima[0];//第1位數(shù)碼管顯示
  203.    wei=0;//關(guān)數(shù)碼管位碼端口
  204.    delay(1);//延時(shí)
  205.    
  206.    duan=1;//開數(shù)碼管段碼端口                     
  207.    P0=table[bai];//數(shù)碼百位顯示
  208.    duan=0;//關(guān)數(shù)碼管段碼端口
  209.    P0=0x00;//關(guān)數(shù)碼管段碼顯示
  210.    wei=1;//開數(shù)碼管位碼端口
  211.    P2=weima[1];//第2位數(shù)碼管顯示
  212.    wei=0;//關(guān)數(shù)碼管位碼端口
  213.    delay(1);//延時(shí)

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

  222.    duan=1;//開數(shù)碼管段碼端口                        
  223.    P0=table[ge];//數(shù)碼管個(gè)位顯示
  224.    duan=0;//關(guān)數(shù)碼管段碼端口
  225.    P0=0x00;//關(guān)數(shù)碼管段碼顯示
  226.    wei=1;//開數(shù)碼管位碼端口
  227.    P2=weima[3];//第4位數(shù)碼管顯示
  228.    wei=0;//關(guān)數(shù)碼管位碼端口
  229.    delay(1);//延時(shí)     
  230. }
  231.   void shumaguannodisplay(uint qian,uint bai,uint shi,uint ge)//數(shù)碼管顯示函數(shù)
  232. {
  233.    duan=1;//開數(shù)碼管段碼端口  
  234.    P0=table[qian];//數(shù)碼千位顯示
  235.    duan=1;//關(guān)數(shù)碼管段碼端口
  236.    P0=0x00;//關(guān)數(shù)碼管段碼顯示
  237.    wei=1;//開數(shù)碼管位碼端口
  238.    P2=weima[0];//第1位數(shù)碼管顯示
  239.    wei=1;//關(guān)數(shù)碼管位碼端口
  240.    delay(1);//延時(shí)
  241.    
  242.    duan=1;//開數(shù)碼管段碼端口                     
  243.    P0=table[bai];//數(shù)碼百位顯示
  244.    duan=1;//關(guān)數(shù)碼管段碼端口
  245.    P0=0x00;//關(guān)數(shù)碼管段碼顯示
  246.    wei=1;//開數(shù)碼管位碼端口
  247.    P2=weima[1];//第2位數(shù)碼管顯示
  248.    wei=1;//關(guān)數(shù)碼管位碼端口
  249.    delay(1);//延時(shí)

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

  258.    duan=1;//開數(shù)碼管段碼端口                        
  259.    P0=table[ge];//數(shù)碼管個(gè)位顯示
  260.    duan=1;//關(guān)數(shù)碼管段碼端口
  261.    P0=0x00;//關(guān)數(shù)碼管段碼顯示
  262.    wei=1;//開數(shù)碼管位碼端口
  263.    P2=weima[3];//第4位數(shù)碼管顯示
  264.    wei=1;//關(guān)數(shù)碼管位碼端口
  265.    delay(1);//延時(shí)     
  266. }
復(fù)制代碼



評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:723721 發(fā)表于 2020-5-5 07:32 來自觸屏版 | 只看該作者
樓主樓主有沒有程序和仿真文件呀
回復(fù)

使用道具 舉報(bào)

板凳
ID:171036 發(fā)表于 2020-5-6 19:57 | 只看該作者
NT果凍布丁粉 發(fā)表于 2020-5-5 07:32
樓主樓主有沒有程序和仿真文件呀

看程序就可以做出來啊
回復(fù)

使用道具 舉報(bào)

地板
ID:817071 發(fā)表于 2020-9-7 15:54 來自觸屏版 | 只看該作者
樓主 為什么程序編譯的時(shí)候有很多錯(cuò)誤提示
回復(fù)

使用道具 舉報(bào)

5#
ID:156220 發(fā)表于 2020-9-9 10:10 | 只看該作者
樓主的注釋太詳細(xì)了,謝謝分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 天天艹| 狠狠干夜夜草 | 国产在线观看一区二区三区 | 国产999精品久久久 午夜天堂精品久久久久 | 亚洲午夜精品久久久久久app | 欧美888 | 成人做爰999| 日韩成人高清 | 亚洲不卡av在线 | 暖暖日本在线视频 | 日韩最新网址 | 99久久电影 | av在线免费不卡 | 91精品国产乱码久久久久久久久 | 玖玖久久 | 在线激情视频 | 精品一区二区三区四区 | 日本亚洲一区二区 | 国产综合久久 | 中文字幕亚洲视频 | 国产精品中文字幕在线 | 国产精品久久久久久久久久久久久久 | 日韩欧美三区 | 国产精品久久7777777 | 久久99久久98精品免观看软件 | 999国产视频 | 国产在线97 | 中文字幕国产精品 | 一区二区三区四区在线 | 国产成人影院 | 欧美日韩国产一区二区三区 | 久久久久亚洲精品 | 亚洲成a| 日韩久久成人 | 99精品视频在线观看 | 久久精品视频12 | 久久久久久久久久爱 | 毛色毛片免费看 | 国产毛片毛片 | 国产高清在线精品一区二区三区 | 成人欧美一区二区三区黑人孕妇 |