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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機步進電機正反轉加減速 LCD12864顯示,Proteus仿真程序

[復制鏈接]
跳轉到指定樓層
樓主
三個步進電機,需要自提
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)



單片機源程序如下:
  1. #include <AT89X51.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #define uc unsigned char
  5. #define ui unsigned int
  6. #define LCDPAGE 0xB8                                  //設置頁指令。
  7. #define LCDLINE 0x40                                  //設置列指令。
  8. sbit E=        P3^5;
  9. sbit RW=P3^4;
  10. sbit RS=P3^2;
  11. sbit L=P3^1;                                                 //左半平面
  12. sbit R=P3^0;                                                 //右半平面
  13. sbit Busy=P2^7;//                                         //忙 判斷位
  14. uc scan_key1,scan_key2;                        //按鍵功能選擇,00 停止,01 正轉 10 反轉
  15. uc step1;step2;
  16. static  step_index;
  17. ui count1,count2;                                   //定時
  18. uc butter;                                                        //按鍵
  19. static  speed;                                                //速度參數
  20.   //;本文件為16×16點陣中文字庫文件,字的橫向8點構成一字節,左邊點在字節的高                 
  21. //位,字符點陣四角按左上角→右上角→左下角→右下角取字
  22. //;如你想在以后繼續用HZDotReader打開文件,追加漢字點陣數據,請不要修改或增刪所有注釋         
  23. uc code JIANG[]=
  24. {
  25. //;江   CBDAD                                                               
  26. 0x10,0x60,0x01,0xC6,0x30,0x00,0x04,0x04,
  27. 0x04,0xFC,0x04,0x04,0x04,0x04,0x00,0x00,
  28. 0x04,0x04,0x7E,0x01,0x20,0x20,0x20,0x20,
  29. 0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x00,
  30. };
  31. uc code XI[]=
  32. {

  33. uc code DI[]=                                                           //低
  34. {                                 
  35. 0x40,0x20,0xF0,0x0C,0x07,0x02,0xFC,0x44,
  36. 0x44,0x42,0xFE,0x43,0x43,0x42,0x40,0x00,
  37. 0x00,0x00,0x7F,0x00,0x00,0x00,0x7F,0x20,
  38. 0x10,0x28,0x43,0x0C,0x10,0x20,0x78,0x00,
  39. };
  40. //////////////////函數聲明 **************////////
  41. //************************************************
  42. void iniLCD(void);                                                           
  43. void chkbusy(void);
  44. void wcode(uc cd) ;
  45. void wdata(uc dat);
  46. void disrow(uc page,uc col,uc *temp);
  47. void display( uc page,uc col,uc *temp);
  48. void ground(step);                                     //轉步
  49. void run1();                                     //正轉
  50. void run2();
  51. void stop();
  52. void delay(ui time);
  53. //************************************
  54. //**************LCD初始化 ***************
  55. //*********************************
  56. void iniLCD(void)                               //初始化
  57. { L=1;R=1;
  58.   wcode(0x38);
  59.   wcode(0x0f);                                        //開顯示 設置
  60.   wcode(0xc0);                                          //設置顯示啟動為第一行
  61.   wcode(0x01);                                            //清屏
  62.   wcode(0x06);                                                 //畫面不動,光標右移。
  63. }
  64. //******************LCD判斷忙的子程序**********
  65. //**********************************************8
  66. void chkbusy(void)                                 //   測LCD忙狀態
  67. {
  68.   E=1;                                                               //使能LCD
  69.   RS=0;                                                               //讀寫指令
  70.   RW=1;                                                                  //讀
  71.   P2=0xff;                                                       //讀操作前先進行一次空讀操作 ,接下來才能讀到數據
  72.   while(!Busy);                                                 //等待,不忙退出
  73. }
  74. //*****************************************
  75. //*****************寫指令代碼*****************
  76. //***********************************************
  77. void wcode(uc cd)                                        //寫指令 代碼
  78. {
  79.   chkbusy();                                                             //寫等待
  80.   P2=0xff;                                                                          //使能LCD
  81.   RW=0;                                                                             //讀禁止
  82.   RS=0;                                                                              //輸出 設置
  83.   P2=cd;                                                                     //寫數據代碼
  84.   E=1;                                                                               //以下兩句產生下降沿
  85.   E=0;                                                 //
  86. }
  87. //*******************把顯示數據寫到內存單元中 *****************
  88. void wdata(uc dat)                                           //寫顯示數據
  89. {
  90.   chkbusy();                                                                //寫等待
  91.   P2=0xff;                                                                             //使能LCD
  92.   RW=0;                                                                                   //讀禁止
  93.   RS=1;                                                                                  //輸出 設置
  94.   P2=dat;                                                                        //寫數據代碼
  95.   E=1;                                                                                 //以下兩句產生下降沿
  96.   E=0;                                                         //
  97. }
  98. //***********************************************
  99. //****************顯示LCD程序********************
  100. //*****************可以更改程序中的64變為32就可以輸出數字了**********
  101. //****************************************************************
  102. //*************還可以換成生成圖片的形式,具體****************
  103. ///****************************************************
  104. void  disrow(uc page,uc col,uc *temp)
  105. {
  106.   uc i;
  107.   if(col<64)                                                // 左半平面
  108.   {
  109.     L=1;R=0;
  110.         wcode(LCDPAGE+page);                               // 寫指令 頁
  111.         wcode(LCDLINE+col);                                       //寫指令行
  112.         if((col+16)<64)                                              //如果字在左半平面顯示不了,轉到右半平面去
  113.         {
  114.          for(i=0;i<16;i++)                                      //寫字
  115.          wdata(*(temp+i));
  116.          }
  117.          else                                                              //右半平面
  118.          {
  119.            for(i=0;i<64-col;i++)                                 //減去左邊數,從右半平面第一位開始顯示
  120.          wdata(*(temp+i));                                         //寫字 顯示
  121.          L=0;R=1;                                                         //右半平面
  122.      wcode(LCDPAGE+page);                            // 寫指令 頁
  123.      wcode(LCDLINE);                                       //寫指令行
  124.            for(i=64-col;i<16;i++)                                 //寫字 右半平面
  125.          wdata(*(temp+i));
  126.      }
  127.    }
  128.    else
  129.    {  
  130.      L=0;R=1;
  131.      wcode(LCDPAGE+page);                          // 寫指令 頁
  132.      wcode(LCDLINE+col-64);                              //寫指令行
  133.           for(i=0;i<16;i++)                                      //寫字
  134.          wdata(*(temp+i));
  135.         }
  136. }
  137. //*********************供調用 ****子程序 *************
  138. //****************************************
  139. void  display( uc page,uc col,uc *temp)
  140. {
  141.         disrow( page, col, temp);                               //顯示上半字
  142.                 disrow( page+1, col, temp+16);                     //顯示下半字
  143. }
  144. //***********************主***控****程********序********************
  145. //******************************************************************
  146. //***************程序完成于2008年6月 1日,兒童節********************
  147. //***************程序員:韓福偉************************************
  148. //**********江西理工大學應用科學學院機電學部自動化******************
  149. //******************************************************************
  150. //*********
  151. void main(void)
  152. {  
  153.    P2=0xff;
  154.    iniLCD();                                      //初始化 LCD
  155.    display(0,0x00,&JIANG);                         //    江
  156.    display(0,0x10,&XI);                                   //    西
  157.    display(0,0x20,&LI);                                   //   理
  158.    display(0,0x30,&GONG);                         //   工
  159.    display(0,0x40,&DA);                                   //  大
  160.    display(0,0x50,&XUE);                            //        學
  161.    step2=0;
  162.    step1=0;
  163.    P1=0xff;
  164.    P0=0;
  165.    EX1=1;
  166.    EA=1;                                               //開中斷
  167.    speed=2010;
  168.    while(1)
  169.   {  
  170.      if((scan_key1==1)&(scan_key2==0))             // 正轉
  171.          {  
  172.             display(6,0x00,&ZHENG);                     //  LCD顯示
  173.         display(6,0x10,&ZHUAN);
  174.             ground(step_index);
  175.             delay(speed);
  176.                step_index++;                                                   //大于7,從頭再來
  177.             if(step_index>7)
  178.                    step_index=0;
  179.           }
  180.          if((scan_key1==0)&(scan_key2==1))                   //反轉
  181.          {                                                                    
  182.            ground(step_index);
  183.            display(6,0x00,&FAN);                      //         LCD顯示
  184.        display(6,0x10,&ZHUAN);
  185.            delay(speed);
  186.               step_index--;
  187.            if(step_index<0)                                                        //小于0,從頭再來。
  188.                    step_index=7;
  189.           }
  190.          if(scan_key1==0&scan_key2==0)
  191.           {
  192.            display(6,0x00,&TING);                     //        停止
  193.        display(6,0x10,&ZHI);
  194.            display(6,0x20,&BAI);
  195.            display(6,0x30,&BAI);
  196.            P0=0xff;
  197.           }
  198.          if(step1==1&step2==0)
  199.           {
  200.             speed=speed-100;
  201.                 if(speed<200|speed==200)                                   //小于話,說明電機的速度不能再提高了。
  202.                 { speed=200;                                                           //speed參數自己設定,以下遇到也是一樣的。我只是一個亂寫的值
  203.                   display(6,0x20,&ZHENG);                                 //正常運行
  204.                   display(6,0x30,&CHANG);
  205.                   display(6,0x40,&YUN);
  206.                   display(6,0x50,&XING);
  207.                  }
  208.                  else                                                //加速
  209.                 {
  210.                  display(6,0x20,&JIA);
  211.                  display(6,0x30,&SU);
  212.                 }
  213.           }
  214.           if(step1==0&step2==1)
  215.           {
  216.             speed=speed+100;                               //這里面的參數,論實際情況更改
  217.                 if(speed>2500|speed==2500)                          //如果 小于了,就說明到餓低速,可以用停止按鍵停止。
  218.                  { speed=2500;                                                   //低速運行
  219.                   display(6,0x20,&DI);
  220.                   display(6,0x30,&SU);
  221.                   display(6,0x40,&YUN);
  222.                   display(6,0x50,&XING);
  223.                  }
  224.                   else
  225.                   {
  226.                   display(6,0x20,&JIAN);                    //減速
  227.                   display(6,0x30,&SU);
  228.                   }
  229.           }
  230. }
  231. }
  232. //***************************************************
  233. //*************************        延時子程序**************
  234. //**************************************************
  235. void delay(ui time)                                    ///延時程序
  236. { for (count1=0;count1<time;count1++ )                        //此處可以用中斷進行準確定時。我只是瞎定了幾個參數
  237.   for(count2=0;count2<3;count2++);
  238. }
  239. //*********************************************************
  240. //******************按鍵處理程序****************************
  241. //************************************************************
  242. void key(void) interrupt 2
  243. {
  244.   uc i;
  245.   for(i=0;i<200;i++);                                                   //延時防抖
  246.   if(P3_3==0)                                                        
  247.    {
  248.     butter=~P1;
  249.     switch(butter)
  250.          {case 0x01:    scan_key1=1;scan_key2=0; break;        //正常運行 ,用兩個數字進行選擇,是不錯的辦法
  251.            case 0x02:    scan_key1=0;scan_key2=0;break;        //停止
  252.           case 0x04:    scan_key1=0 ;scan_key2=1; break;      //加速
  253.           case 0x08:    step1=1;step2=0;break;               //減速
  254.           case 0x10:    step1=0;step2=1;break;              //正轉
  255.           default :                     ;                             //其它值返回
  256.          }
  257.    }
  258.    P1=0XFF;
  259. }
  260. //**************************************************
  261. //**********************轉步************************
  262. //**************************************************
  263. void ground(step_index)         //轉步
  264. {
  265. switch(step_index)
  266.    {
  267.      case 0://0            // 這里就說明了同步電機是怎么轉的。我本來是用了代碼的,
  268.       P0_0 = 1;                   //但是后來考慮了一些初學者不懂同步電機到底怎么轉的
  269.       P0_1 = 0;                   //我就換成這個了, 知道怎么轉的人,就換成代碼把,一樣的
  270.       P0_2 = 0;
  271.       P0_3 = 0;
  272.       break;
  273.           case 1://0,1  
  274.       P0_0 = 1;
  275.       P0_1 = 1;
  276.       P0_2 = 0;
  277.       P0_3 = 0;
  278.       break;
  279.           case 2://1
  280.       P0_0 = 0;
  281.       P0_1 = 1;
  282.       P0_2 = 0;
  283.       P0_3 = 0;
  284.       break;
  285.           case 3://1,2
  286.       P0_0 = 0;
  287.       P0_1 = 1;
  288.       P0_2 = 1;
  289.       P0_3 = 0;
  290.       break;
  291.           case 4://2
  292.       P0_0 = 0;
  293.       P0_1 = 0;
  294.       P0_2 = 1;
  295.       P0_3 = 0;
  296.       break;
  297.           case 5://2,3
  298.       P0_0 = 0;
  299. ……………………

  300. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

Keil代碼與Proteus仿真下載:
僅供參考.7z (98.74 KB, 下載次數: 54)

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

使用道具 舉報

沙發
ID:143767 發表于 2020-10-16 13:18 | 只看該作者
兩個文件這么小壓縮成一個就好了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩在线免费视频 | 三级黄视频在线观看 | 夜夜夜夜草 | 精品久久久久久久久亚洲 | 亚洲欧美综合精品另类天天更新 | 欧美国产视频 | 欧美色综合一区二区三区 | 99久久精品国产毛片 | 成人免费在线视频 | 精品一区二区久久久久久久网站 | 欧美日韩国产欧美 | 91在线一区 | 国产资源一区二区三区 | 国产精品视频网 | 999久久 | 日本一区二区三区视频在线 | 欧美成人精品一区二区三区 | 麻豆av网站 | 中文字幕在线视频网站 | 国产午夜精品一区二区三区在线观看 | 一级一片在线观看 | 亚洲视频在线看 | 精品一区二区在线看 | 日韩免费中文字幕 | 国产午夜精品一区二区三区嫩草 | 亚洲色欲色欲www | 日韩欧美一二三区 | 涩涩视频在线观看免费 | 日本不卡一区二区三区在线观看 | 日韩精品一区二区三区 | www天天操| 一区二区在线免费观看 | 国家aaa的一级看片 h片在线看 | 羞羞色影院 | 久久综合入口 | 日韩三级精品 | 亚洲免费精品 | 精品成人一区 | 亚洲欧美第一视频 | 国产精品久久久久999 | 亚洲一区国产精品 |