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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機步進電機調(diào)速控制 LCD1602顯示圈數(shù)程序與Proteus仿真操作流

[復(fù)制鏈接]
ID:481843 發(fā)表于 2022-5-1 17:56 | 顯示全部樓層 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
1.png

Proteus仿真操作流如下:
步驟一:打開仿真.DSN文件(用Proteus7.8打開)
步驟二:左鍵雙擊U1單片機,打開加載HEX文件界面,左鍵單擊文件夾圖標(biāo)

步驟三:選擇給的1號源程序文件夾,找到HEX文件。
步驟四:左鍵雙擊打開HEX文件,跳到步驟二界面,點擊OK

步驟五:左鍵點擊左下角運行


單片機源程序如下:
  1. #include<reg52.h>
  2. #include<stdio.h>
  3. #include<intrins.h>

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. sbit RS = P2^4;//1602數(shù)據(jù)/命令選擇端(H:數(shù)據(jù)寄存器L:指令寄存器)
  7. sbit RW = P2^5;//1602讀/寫選擇端
  8. sbit E  = P2^6;//1602使能信號端

  9. sbit key1=P3^0;//用戶按鍵
  10. sbit key2=P3^1;
  11. sbit key3=P3^2;
  12. sbit key4=P3^3;
  13. sbit key5=P3^4;

  14. uchar code B_Rotation[8]={0x7f,0x3f,0xbf,0x9f,0xdf,0xcf,0xef,0x6f}; //反轉(zhuǎn)表格
  15. uchar code F_Rotation[8]={0xef,0xcf,0xdf,0x9f,0xbf,0x3f,0x7f,0x6f}; //正轉(zhuǎn)表格


  16. uchar table1[]="dir: +  spe:005";
  17. uchar table2[]="cir:000 ang:000";

  18. uchar num;
  19. uint key,flag,speed=5,zflag,znum,fflag,fnum,select,pp,qq;
  20. //1鍵值2鍵值標(biāo)志3速度4正轉(zhuǎn)標(biāo)志5正轉(zhuǎn)圈數(shù)6反轉(zhuǎn)標(biāo)志7反轉(zhuǎn)圈數(shù)8正轉(zhuǎn)角度9反轉(zhuǎn)角度10選擇
  21. float zang,fang;
  22. /******************************************************************/
  23. /*                    延時函數(shù) Xms                                   */
  24. /******************************************************************/
  25. void delay(uint z)
  26. {
  27.         uint x,y;
  28.         for(x=z;x>0;x--)
  29.                 for(y=110;y>0;y--);
  30. }
  31. /******************************************************************/
  32. /*                   LCD1602寫命令操作                            */
  33. /******************************************************************/
  34. void WriteCommand(uchar com)
  35. {
  36.         delay(5);//操作前短暫延時,保證信號穩(wěn)定
  37.         E=0;
  38.         RS=0;
  39.         RW=0;
  40.         P0=com;
  41.         E=1;
  42.         delay(5);
  43.         E=0;
  44. }
  45. /******************************************************************/
  46. /*                   LCD1602寫數(shù)據(jù)操作                            */
  47. /******************************************************************/
  48. void WriteData(uchar dat)
  49. {
  50.         delay(5);  //操作前短暫延時,保證信號穩(wěn)定
  51.         E=0;
  52.         RS=1;
  53.         RW=0;
  54.         P0=dat;
  55.         E=1;
  56.         delay(5);
  57.         E=0;
  58. }
  59. /******************************************************************/
  60. /*                           1602初始化程序                       */
  61. /******************************************************************/
  62. void InitLcd()//1602初始化程序
  63. {
  64.         delay(15);
  65.         WriteCommand(0x38); //display mode
  66.         WriteCommand(0x38); //display mode
  67.         WriteCommand(0x38); //display mode
  68.         WriteCommand(0x06); //當(dāng)讀或?qū)懸粋字符后地址指針加一,且光標(biāo)加一
  69.         WriteCommand(0x0c); //顯示開及光標(biāo)不顯示
  70.         WriteCommand(0x01); //清屏

  71.         WriteCommand(0x80);
  72.         for(num=0;num<15;num++)//第一行的顯示
  73.         {
  74.                 WriteData(table1[num]);
  75.                 delay(15);
  76.         }
  77.         WriteCommand(0x80+0x40);//第二行的顯示
  78.         for(num=0;num<15;num++)
  79.         {
  80.                 WriteData(table2[num]);
  81.                 delay(15);
  82.         }

  83. }
  84. /******************************************************************/
  85. /*              獨立鍵盤掃描函數(shù)                                  */
  86. /******************************************************************/
  87. void keyscan()  
  88. {        
  89.         
  90.         P3=0xff;//拉高P3口,以讀取P3口的值
  91.         if(key1==0)//鍵1被按下
  92.         {
  93.                 delay(5);//延時消抖
  94.                 if(key1==0)
  95.                 {
  96.                         flag=1;
  97.                 }
  98.                 while(!key1);
  99.                 delay(5);//延時消抖
  100.                 while(!key1);//松手檢測
  101.         }
  102.         if(key2==0)
  103.         {
  104.                 delay(5);
  105.                 if(key2==0)
  106.                 {
  107.                         flag=2;
  108.                 }
  109.                 while(!key2);
  110.                 delay(5);
  111.                 while(!key2);
  112.         }
  113.         if(key3==0)//鍵1被按下
  114.         {
  115.                 delay(5);//延時消抖
  116.                 if(key3==0)
  117.                 {
  118.                         flag=3;
  119.                 }
  120.                 while(!key3);
  121.                 delay(5);//延時消抖
  122.                 while(!key3);//松手檢測
  123.         }
  124.         if(key4==0)
  125.         {
  126.                 delay(5);
  127.                 if(key4==0)
  128.                 {
  129.                         flag=4;
  130.                 }
  131.                 while(!key4);
  132.                 delay(5);
  133.                 while(!key4);
  134.         }
  135.         if(key5==0)
  136.         {
  137.                 delay(5);
  138.                 if(key5==0)
  139.                 {
  140.                         flag=5;
  141.                 }
  142.                 while(!key5);
  143.                 delay(5);
  144.                 while(!key5);
  145.         }
  146. }
  147. /******************************************************************/
  148. /*                           1602顯示3位數(shù)                       */
  149. /******************************************************************/
  150. void write_sfm(uchar add,uint date)//1602顯示
  151. {
  152.         uchar bai,shi,ge;
  153.         bai=date/100;
  154.         shi=date%100/10;
  155.         ge=date%10;
  156.         WriteCommand(0x80+add);//設(shè)置數(shù)據(jù)地址指針
  157.         WriteData(0x30+bai);
  158.         WriteData(0x30+shi);
  159.         WriteData(0x30+ge);
  160.         WriteData(0x20);
  161. }
  162. /******************************************************************/
  163. /*                           鍵值處理                             */
  164. /******************************************************************/
  165. void handle_flag()
  166. {        

  167.         uchar select1;
  168.         if(TR0==0&&TR1==0)
  169.         {        
  170.                 if(flag==1) //正轉(zhuǎn)
  171.                 {
  172.                         WriteCommand(0x80+0x05);
  173.                         WriteData('+');
  174.                         delay(20);
  175.                         select=0;
  176.                 }
  177.                 if(flag==2) //反轉(zhuǎn)
  178.                 {
  179.                         WriteCommand(0x80+0x05);
  180.                         WriteData('-');
  181.                         delay(20);
  182.                         select=1;
  183.                 }
  184.                 if(flag==3)//轉(zhuǎn)速加
  185.                 {
  186.                     speed++;
  187.                         if(speed>=12)
  188.                                 speed=12;
  189.                         write_sfm(0x0c,speed);//顯示速度
  190.                         delay(20);
  191.             }
  192.                 if(flag==4)        //轉(zhuǎn)速減
  193.                 {
  194.                         speed--;
  195.                         if(speed<=1)
  196.                                 speed=1;
  197.                         write_sfm(0x0c,speed);//顯示速度
  198.                         delay(20);
  199.                 }
  200. }
  201.         if(flag==5)////關(guān)閉中斷,停止電機
  202.         {
  203.                 select1++;
  204.                 select1%=2;
  205.                 if( select1==0)
  206.                 {
  207.                         TR0=0;
  208.                         TR1=0;
  209.                         if(select==0)//顯示轉(zhuǎn)動的角度
  210.                                 write_sfm(0x40+0x0c,zang);
  211.                         else
  212.                                 write_sfm(0x40+0x0c,fang);
  213.              }
  214.                 else
  215.                 {if(select==0)
  216.                 {
  217.                         TR0=1;//開定時器0,產(chǎn)生正轉(zhuǎn)相序
  218.                         TR1=0;//關(guān)定時器1
  219.                 }
  220.                 else
  221.                 {        
  222.                         TR1=1;//開定時器1,產(chǎn)生反轉(zhuǎn)相序
  223.                         TR0=0;//關(guān)定時器0        
  224.                 }
  225.                 }                        
  226.         }
  227.         flag=0;
  228. }


  229. void main()
  230. {
  231.         
  232.         pp=0;
  233.         qq=0;
  234.    
  235.         InitLcd();
  236.         TMOD=0x11;
  237.     EA=1;
  238.         ET0=1;
  239.         ET1=1;

  240.         TH0=(65536-(14648/speed))/256;
  241.         TL0=(65536-(14648/speed))%256;
  242.         TH1=(65536-(14648/speed))/256;
  243.         TL1=(65536-(14648/speed))%256;

  244.         TR0=0;
  245.         TR1=0;
  246.         
  247.         while(1)
  248.         {        
  249.                 keyscan();
  250.                 handle_flag();        
  251.         }

  252. }

  253. void time0() interrupt 1
  254. {        
  255.         uint zz;
  256.         TH0=(65536-(14648/speed))/256; // 360/(5.625/64)=4096   
  257.                                    //假設(shè)60秒轉(zhuǎn)一圈,即60秒中斷4096次,
  258.                                                                    //那么一次中斷需要60000000/4096=14648個時鐘
  259.                                                                    //60000000/(4096*speed)   zflag=4096時一圈
  260.         TL0=(65536-(14648/speed))%256;
  261.         zz%=8;
  262.         P1=F_Rotation[zz];  //輸出對應(yīng)的相
  263.         zz++;
  264.         zflag++;
  265.         if(zflag==4096) //正轉(zhuǎn)了一圈
  266.         {        
  267.                 zflag=0;
  268.                 znum++;
  269.                 write_sfm(0x40+0x04,znum);
  270.         }
  271.         if(zflag%64==0)//計算正轉(zhuǎn)動的角度
  272.         {
  273.                 pp++;
  274.                 zang=(uint)(pp*5.625);
  275.                 if(zang==360)
  276.                         pp=0;
  277.                 write_sfm(0x40+0x0c,zang);
  278.         }
  279.         //zang=0.088*zflag;
  280.         //write_sfm(0x40+0x0c,zang);
  281. }
  282. void time1() interrupt 3
  283. {        
  284.         
  285.         uint ff;
  286.         TH1=(65536-(14648/speed))/256;
  287.         TL1=(65536-(14648/speed))%256;
  288.     ff%=8;
  289.         P1=B_Rotation[ff]; //輸出對應(yīng)的相
  290.         ff++;
  291.         fflag++;
  292.         if(fflag==4096) //反轉(zhuǎn)了一圈
  293.         {        
  294.                 fflag=0;
  295.                 fnum++;
  296.                 write_sfm(0x40+0x04,fnum);
  297.         }
  298.         if(fflag%64==0)//計算反轉(zhuǎn)動的角度
  299.         {
  300.                 qq++;
  301.                 fang=(uint)(qq*5.625);
  302.                 if(fang==360)
  303.                 qq=0;
  304.                 write_sfm(0x40+0x0c,fang);
  305.         }
  306. }
復(fù)制代碼

Keil4代碼與Proteus7.5,8.8仿真下載:
資料.7z (388.36 KB, 下載次數(shù): 166)
回復(fù)

使用道具 舉報

ID:1032999 發(fā)表于 2022-6-15 08:59 | 顯示全部樓層
您好,請問一下最后一個按鍵的作用是什么
回復(fù)

使用道具 舉報

無效樓層,該帖已經(jīng)被刪除
ID:95059 發(fā)表于 2022-7-9 20:59 | 顯示全部樓層
轉(zhuǎn)真電機不能轉(zhuǎn),啥情況啊??
回復(fù)

使用道具 舉報

ID:228452 發(fā)表于 2022-7-9 22:17 | 顯示全部樓層

"Hello, what is the function of the last button?"
Snap1.jpg
回復(fù)

使用道具 舉報

ID:228452 發(fā)表于 2022-7-9 22:21 | 顯示全部樓層
"The real motor can't turn, what's the situation? ?"

It is motor wiring (driver sequence)
also motor voltage should be 5V
回復(fù)

使用道具 舉報

7#
無效樓層,該帖已經(jīng)被刪除
ID:95059 發(fā)表于 2022-7-23 17:21 | 顯示全部樓層
確實不能轉(zhuǎn)動,可惜了
回復(fù)

使用道具 舉報

ID:445725 發(fā)表于 2024-12-23 18:31 | 顯示全部樓層
非常不錯的,可以轉(zhuǎn)動,不過電機很抖,最大只能到12圈就加不上去了
回復(fù)

使用道具 舉報

ID:445725 發(fā)表于 2024-12-23 18:39 | 顯示全部樓層
可以轉(zhuǎn)動,感謝老師的辛苦
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美精选一区二区 | 日韩美女在线看免费观看 | 国产免费va | 国产精品国产精品 | 日本视频在线播放 | 在线国产99 | 国产精品久久久久久久久久久久久 | 日韩视频在线免费观看 | 欧美精品一区二区三区在线播放 | 午夜精品久久久久久久久久久久 | 欧美日韩中文字幕 | 男人午夜视频 | 色综合国产 | 日韩精品一区二区三区在线播放 | 欧美成人激情视频 | 人操人人 | 成人国产精品久久 | 凹凸日日摸日日碰夜夜 | 精品国产一区二区三区性色av | 日韩欧美中文字幕在线观看 | 久久宗合色 | 日韩欧美一区在线 | 欧美一级特黄aaa大片在线观看 | 欧美日韩国产不卡 | 99精品一区二区三区 | 成人免费在线播放 | 欧美精品久久 | 香蕉一区二区 | 国产一区二区自拍 | 亚洲国产二区 | 美女一级毛片 | 欧美久久久久久 | 久久九九网站 | 亚洲精品久久久久久下一站 | 国产精品一区二 | 天天操天天干天天爽 | www.狠狠干| 在线观看免费观看在线91 | 亚洲一二三在线观看 | 国产在线观看福利 | 日韩中文字幕高清 |