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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

這里面哪個單片機代碼是獲取霍爾元件的數據啊?

[復制鏈接]
跳轉到指定樓層
樓主

單片機源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. void displaym();
  5. sbit en=P2^5;                //1602  6管腳
  6. sbit rs=P2^7;         //1602端口        4管腳
  7. sbit rw=P2^6;//lcd1602控制端口 5管腳
  8. sbit num1=P1^0;                                                //占空比加1
  9. sbit num2=P1^1;                                                                   //占空比減一
  10. sbit num3=P1^2;                                                                                           //正傳
  11. sbit num4=P1^3;                                                                                                         //反轉
  12. sbit num5=P1^4;                                                                                                                   //開始停止切換
  13. sbit num6=P2^3;

  14. sbit out=P3^4;                                                         //PWM輸出用于正傳
  15. sbit out1=P3^7;                        //PWM輸出用于反轉

  16. uint zhuansu,flag,z1,z2,m,flag_1,zheng,fan,kai,buzzer,zs;




  17. void delay(uint z)//延時1ms函數
  18. {

  19. uint x,y;
  20. for(x=0;x<z;x++)
  21.      for(y=0;y<110;y++);
  22. }



  23. void write_com(uchar com)//向1602寫一字節(控制指令)
  24. {
  25.   rs=0;
  26.   P0=com;
  27.   delay(5);
  28.   en=0;
  29.   delay(10);
  30.   en=1;
  31. }
  32. void write_data(uchar date)//向1602寫一字節(數據)
  33. {
  34.   rs=1;
  35.   P0=date;
  36.   delay(5);
  37.   en=0;
  38.   delay(5);
  39.   en=1;
  40. }
  41. void init()//初始化函數
  42. {
  43.   en=0;
  44.   rw=0;
  45.   write_com(0x01);         //lcd初始化
  46.   write_com(0x38);                                           //5X7顯示
  47.   write_com(0x0c);                         //關閉光標
  48.   TMOD=0x01;               //定時器方式1   
  49.         
  50.   TH0=0xdc;
  51.   TL0=0x00;                //定時器裝入初值
  52.   EA=1;                    //開總中斷
  53.   ET0=1;                   //定時器0開中斷
  54.         
  55.   TR0=1;
  56.   EX1=1;
  57. IT1=1;                 //定時器啟動  
  58. TH1=0xfc;
  59.   TL1=0x66;//定時100us
  60.   ET1=1;                   //定時器1開中斷
  61.   TR1=1;
  62.         
  63.         
  64.   write_com(0x80);
  65.   write_data('V');
  66.   write_data(':');
  67.   write_com(0x87);                 //第一行顯示轉速
  68.   write_data('r');
  69.   write_data('p');
  70.   write_data('m');
  71.   write_com(0xc0);
  72.   write_data('z');
  73.   write_data('h');
  74.   write_data('a');
  75.   write_data('n');
  76.   write_data('k');
  77.   write_data('o');
  78.   write_data('n');
  79.   write_data('g');
  80.   write_data('b');
  81.   write_data('i');          //在第二行顯示zhankongbi:
  82.   write_data(':');
  83.   displaym();
  84. }
  85. void keyscan()  //鍵盤掃描函數
  86. {
  87.   if(num1==0)     
  88.   {
  89.     delay(5);      //消除抖動
  90.          if(num1==0)
  91.          {
  92.                 if(m<=199)
  93.                  m++;
  94.                         displaym();                                                                  //設定占空比加一
  95.      }
  96.   }
  97.   if(num2==0)
  98.   {
  99.     delay(5);
  100.          if(num2==0)
  101.          {
  102.                   if(m>=1)
  103.                 m--;
  104.                         displaym();                                        //設定占空比減一
  105.         
  106.          }
  107.   }
  108.     if(num3==0)
  109.   {
  110.     delay(5);
  111.          if(num3==0)
  112.          {
  113.           zheng=1;                //正傳標志置1
  114.           fan=0;          // 反轉標志置0
  115.         
  116.          }
  117.   }
  118.       if(num4==0)
  119.   {
  120.     delay(5);
  121.          if(num4==0)
  122.          {
  123.           zheng=0;                 //正傳標志置0
  124.           fan=1;          // 反轉標志置1
  125.         
  126.          }
  127.   }
  128.       if(num5==0)
  129.   {
  130.     delay(5);
  131.          if(num5==0)
  132.          {
  133.          while(num5==0)         ;
  134.           kai=1-kai;
  135.          }
  136.   }
  137. }
  138. void display()
  139. {
  140.   write_com(0x82);
  141.   zhuansu=zhuansu*10;          //將兩秒內的計數乘以30得到轉每分

  142.   if(zhuansu/10000!=0)
  143.    write_data(zhuansu/10000+0x30);                                                  //如果轉速的萬位不為0        正常顯示否則顯示空格
  144.    else
  145.    write_data(' ');

  146.   if(zhuansu/1000==0)
  147.   write_data(' ');
  148.   else
  149.   write_data(zhuansu%10000/1000+0x30);                                                                //如果轉速小于1000 千位為空格 否則正常顯示

  150.   if(zhuansu/100==0)
  151.   write_data(' ');
  152.   else
  153.   write_data(zhuansu%10000%1000/100+0x30);                                           //如果轉速小于100 百位為空格 否則正常顯示

  154.     if(zhuansu/10==0)
  155.   write_data(' ');
  156.   else
  157.   write_data(zhuansu%10000%1000%100/10+0x30);                                  //如果轉速小于10 十位為空格 否則正常顯示

  158.   write_data(zhuansu%10000%1000%100%10+0x30);
  159.   write_com(0xd0);                          //如果沒有這句,當中斷內的顯示函數執行完,就會在轉速的位置顯示占空比數據,導致亂碼
  160. }
  161. void displaym()
  162. {
  163.    write_com(0xcd);
  164.          write_data(m/2/100+0x30);
  165.         
  166.          write_com(0xce);
  167.          write_data(m/2%100/10+0x30);        

  168.         write_com(0xcf);
  169.          write_data(m/2%10+0x30);               
  170.         
  171.         
  172.         
  173.         
  174.         
  175.    if(m/200%10!=0)
  176.   write_data(m/200%10+0x30);                           //如果占空比百位不為0則顯示百位否則顯示空格
  177.   else
  178.   write_data(' ');

  179.   if(m/200%10==0&&m/20%10==0)
  180.   write_data(' ');
  181.   else
  182.   write_data(m/20%10+0x30);                                 //如果占空比小于10 十位正常顯示  否則顯示空格

  183.   write_data(m/2%10+0x30);                                 //顯示個位
  184. }
  185. typedef unsigned int u16;
  186. void delayb(u16 i)
  187. {
  188. while(i--);
  189. }
  190. void warning()
  191. {   
  192.           if (buzzer ==1)
  193.         {
  194.     num6=~num6 ;
  195.     delayb(5) ;
  196.         }
  197.         else
  198.         {
  199.         num6=0;
  200.         delayb(5);
  201.         }
  202. }
  203. void main()
  204. {
  205.     flag_1=0;
  206.         m=100;                                                         //占空比為100
  207.         zhuansu=0;                                           //轉速初值0
  208.         flag=0;
  209.         zheng=1;                                  //初始化電機正轉動
  210.         fan=0;

  211.     init();              //初始化

  212.         while(1)
  213.         {
  214.         keyscan();                                //鍵盤掃描程序
  215.         zs=write_(0x82);
  216.                                       



  217.                         
  218.         if        (zs>)
  219.         {
  220.            buzzer=1;
  221.           if(buzzer==1)
  222.         {
  223.       num6=~num6 ;
  224.        delayb(5) ;
  225.         }
  226.         }
  227.         }

  228. }
  229. void int1()interrupt 2                                //外部中斷1脈沖技術記錄電機的轉速 電機轉一圈zhuansu加一
  230. {
  231.   zhuansu++;
  232. }
  233. void int2()interrupt 1                                  //定時器0顯示轉速
  234. {

  235.   TH0=0xdc;
  236.   TL0=0x00;//定時10ms
  237.   flag++;
  238.          
  239.   if(flag==200)                                   //計時到達2s
  240.     {


  241.         display();                                        //顯示轉速
  242.         zhuansu=0;                                          //轉速置0
  243.         flag=0;

  244.         }
  245. }
  246. void int3()interrupt 3                                         //產生PWM
  247. {

  248.   TH1=0xfc;
  249.   TL1=0x66;//定時100us

  250.           flag_1++;
  251.         if(flag_1>199)
  252.         flag_1=1;
  253.         if(kai==1)                  //如果kai==1電機啟動
  254.         {
  255.         if(zheng==1)                                //電機正轉
  256.         {
  257.         if(flag_1<m)                                          //小于占空比m輸出PWM=0輸出電壓為1
  258.      {out=0;
  259.          out1=1;}
  260.          else
  261.          {
  262.            out=1;
  263.            out1=1;
  264.          }
  265.          }
  266.                  if(fan==1)                           //電機反轉
  267.         {
  268.         if(flag_1<m)                                //小于占空比m輸出PWM=0輸出電壓為1
  269.           {
  270.             out=1;
  271.                 out1=0;
  272.           }
  273.          else                                                                         //大于m輸出PWM=1輸出電壓為0
  274.           {
  275.             out=1;
  276.                 out1=1;
  277.           }
  278.          }
  279.          }
  280.          if(kai==0)                          //kai=0電機停止轉動
  281.          {
  282.            out=1;
  283.            out1=1;
  284.          
  285.          }
  286. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:390416 發表于 2021-5-16 19:52 | 只看該作者
霍爾傳感器 是中斷輸入,中斷號是2,建議觀看 人人學會單片機的視頻教程 徹底學好STC單片機中斷
回復

使用道具 舉報

板凳
ID:88256 發表于 2021-5-16 20:20 | 只看該作者
基礎太差,電路圖顯示霍爾接在P3.3引腳,而P3.3是INT1,對應的就是第253行的void int1()interrupt 2                //外部中斷1脈沖技術記錄電機的轉速 電機轉一圈zhuansu加一    的整段程序
回復

使用道具 舉報

地板
ID:342822 發表于 2021-5-16 20:46 | 只看該作者
懶惰不看程序。程序已注明:外部中斷1脈沖計數記錄電機的轉速 電機轉一圈zhuansu加1
回復

使用道具 舉報

5#
ID:913176 發表于 2021-5-16 20:48 | 只看該作者
hhdsdy 發表于 2021-5-16 20:20
基礎太差,電路圖顯示霍爾接在P3.3引腳,而P3.3是INT1,對應的就是第253行的void int1()interrupt 2        ...

那我如果想要在主函數的while循環中調用zhuansu該怎么調用啊,我直接在里面用zhaunsu表示不行
回復

使用道具 舉報

6#
ID:236035 發表于 2021-5-17 08:44 | 只看該作者
suit8515 發表于 2021-5-16 20:48
那我如果想要在主函數的while循環中調用zhuansu該怎么調用啊,我直接在里面用zhaunsu表示不行

這是全局變量,在哪都可以調用。多學習下,否則到哪都是問題,都要問人,次數多了,人家就不愿意了。
回復

使用道具 舉報

7#
ID:844772 發表于 2021-5-17 09:00 | 只看該作者
suit8515 發表于 2021-5-16 20:48
那我如果想要在主函數的while循環中調用zhuansu該怎么調用啊,我直接在里面用zhaunsu表示不行

zhuansu這個變量保存的僅僅是計數,不能直接知道轉數,要計算一段時間的zhuansu變量的差值,推算轉數,
回復

使用道具 舉報

8#
ID:824490 發表于 2021-5-17 09:46 | 只看該作者
glinfei 發表于 2021-5-17 09:00
zhuansu這個變量保存的僅僅是計數,不能直接知道轉數,要計算一段時間的zhuansu變量的差值,推算轉數,

按你的電路圖和代碼,zhuansu這個變量是計數輪子轉了多少圈,這個值*6.28*輪子半徑就近似小車移動的距離
回復

使用道具 舉報

9#
ID:824490 發表于 2021-5-17 10:35 | 只看該作者
本帖最后由 名字不是重點 于 2021-5-17 10:39 編輯

1:
zheng=1;                                  //初始化電機正轉動
fan=0;
這2 個互斥,可以只設一個就行了。
2:
write_data(zhuansu%10000%1000%100%10+0x30);
這個可以優化為:
write_data(zhuansu%10+0x30);
相同的還有 write_data(zhuansu%10000%1000%100/10+0x30)==>write_data(zhuansu%100/10+0x30)

等等
連續取模的,可只取最后一個。
3:
void int2()interrupt 1 中不要做display(); 建議做法是if(flag==200)插入一個標志update,在main()的while(1)中判斷update,再決定是否刷顯轉速。
4:
按鍵掃描都是P1口,建議一次讀入P1的值,再用switch來做分支處理。

認真找找,應該還有很多地方能做優化的。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄色片视频免费 | 久久久久黑人 | 国产精品久久久久久久久久三级 | 亚洲视频在线观看一区二区三区 | 在线观看免费黄色片 | 精精久久| 99精品视频一区二区三区 | www.一区二区三区 | 亚洲草草视频 | 亚洲精品成人网 | 国产日韩欧美一区 | 精品国产黄色片 | 亚洲黄色视屏 | 午夜欧美一区二区三区在线播放 | 天天干天天操天天爽 | 精品乱码久久久久 | 欧美亚洲国产日韩 | hitomi一区二区三区精品 | 国产精品久久久久久久久久免费 | 成人国产在线视频 | 久久精品亚洲 | 91久久久久久久久久久久久 | 日韩精品免费在线观看 | 亚洲精品一区二区三区丝袜 | 91久久北条麻妃一区二区三区 | a级大片免费观看 | 男女网站免费观看 | 国产精品久久久久久久久久免费看 | 亚洲成人一区 | 成人a免费 | 欧美日韩一卡二卡 | com.色.www在线观看 | 国产精品视频一二三区 | 久久亚洲精品久久国产一区二区 | 成人在线观看免费视频 | 国产亚洲欧美在线 | 国产精品视频免费观看 | 久色视频在线观看 | 91精品国产综合久久久久久丝袜 | 亚洲一区在线播放 | 欧美在线高清 |