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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

Proteus仿真步進(jìn)電機(jī) 數(shù)碼管+1602 有仿真圖和單片機(jī)源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:399416 發(fā)表于 2020-6-4 15:35 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. /*  步進(jìn)電機(jī)程序              */
  2. /*P1^0 為四相單四拍, P1^1 為四相雙四拍, P1^2 為四相八拍  */
  3. /*P1^3 為啟動 / 停止控制、 P1^4 方向控制、 P1^5 加速、 P1^6 減速  */
  4. /* 用 4 位 LED 數(shù)碼管顯示工作步數(shù)。                */
  5. /* 用 3 個發(fā)光二極管顯示狀態(tài)  */
  6. /* 正轉(zhuǎn)時紅燈亮,反轉(zhuǎn)時黃燈亮,不轉(zhuǎn)時綠燈亮      */
  7. /* 編寫人:  */
  8. /* 時間: 2013-06-26 */
  9. /***********************************************************/
  10. #include<reg51.h>
  11. #define uchar unsigned char
  12. #define uint unsigned int
  13. #define SegData P0        // 數(shù)碼管數(shù)據(jù)口
  14. #define KeyData P1        // 按鍵控制數(shù)據(jù)口
  15. #define MotorData P2        // 電機(jī)控制數(shù)據(jù)口
  16. #define dula P0     //段選
  17. sbit wela1=P3^0; // 數(shù)碼管位選 1
  18. sbit wela2=P3^1; // 數(shù)碼管位選 2
  19. sbit wela3=P3^3; // 數(shù)碼管位選 3
  20. sbit wela4=P3^7; // 數(shù)碼管位選 4
  21. sbit wela5=P2^4; // 數(shù)碼管位選 5
  22. sbit wela6=P2^5; // 數(shù)碼管位選 6
  23. sbit wela7=P2^6; // 數(shù)碼管位選 7
  24. sbit wela8=P2^7; // 數(shù)碼管位選 8
  25. sbit RS=P2^6;
  26. sbit RW=P2^5;
  27. sbit E=P2^7;
  28. #define LCD_data  P0     
  29. uchar   code  table2[13]={"RAOZU:Y90S-2"};
  30. uchar   code  table3[25]={"DZ:0X200 ZS:75"};
  31. sbit LedGreen=P3^4;// 控制綠燈-停止
  32. sbit LedRed=P3^5;  // 控制紅燈-停止
  33. sbit LedYellow=P3^6;// 控制黃燈-停止
  34. uchar PositiveSingleFour[]={0xf1,0xf4,0xf2,0xf8}; // 步進(jìn)電機(jī)正相單四拍數(shù)表 ;
  35. uchar PositiveDoubleFour[]={0xf5,0xf6,0xfa,0xf9}; // 步進(jìn)電機(jī)正相雙四拍數(shù)表 ;
  36. uchar PositiveEight[]={0xf1,0xf5,0xf4,0xf6,0xf2,0xfa,0xf8,0xf9};// 步進(jìn)電機(jī)正相八拍數(shù)表 ;
  37. uchar NegitiveSingleFour[]={0xf1,0xf8,0xf2,0xf4}; // 步進(jìn)電機(jī)反相單四拍數(shù)表 ;
  38. uchar NegitiveDoubleFour[]={0xf9,0xfa,0xf6,0xf5}; // 步進(jìn)電機(jī)反相雙四拍數(shù)表 ;
  39. uchar NegitiveEight[]={0xf1,0xf9,0xf8,0xfa,0xf2,0xf6,0xf4,0xf5};// 步進(jìn)電機(jī)反相八拍數(shù)表 ;
  40. uchar table[]={   
  41. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  42. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
  43. 0x40,0x76,0x38};//數(shù)碼管顯示
  44. uchar Flag=0; // 用來控制拍數(shù)循環(huán);  
  45. uchar Mode=0; // 用來標(biāo)志工作模式;
  46. uchar Way=0; // 用來標(biāo)志運(yùn)轉(zhuǎn)方向
  47. uchar Num=0; // 用來定時計數(shù)
  48. uchar Delay=0; // 用來標(biāo)志延時時間到
  49. uchar Move=0; // 用來標(biāo)志啟動或停止
  50. uint Step=0; // 用來計算步數(shù)的;
  51. char Speed=12;  // 用來表示速度
  52. char SpeedMax=2; // 最大速度 - 參數(shù)為時間
  53. char SpeedMin=22; // 最小速度
  54. char SpeedChang=1; // 速度每次改變量
  55. uint Pulse=0;  //計數(shù)
  56. uint Period=0 ; //周期計數(shù)
  57. uint real_speed=0;  //實際轉(zhuǎn)速
  58. uint lilun_speed=0;  //理論轉(zhuǎn)速
  59. /****************** 函數(shù)聲明部分 **********************/
  60. void Init();
  61. //void Display(uint);
  62. void DelayMs(uint);
  63. void KeyScan();
  64. void Motor();
  65. void display(uint first,uint second,uint third,uint forth);
  66. void display2(uint first,uint second,uint third,uint forth);
  67. /****************** 主函數(shù) **********************/
  68. /********************************/
  69. void delay_us(); //18us
  70. void delay_ms(uint);
  71. void lcd_init();
  72. void lcd_write_com(uchar com);
  73. void lcd_write_dat(uchar dat);
  74. void lcd_init();
  75. void lcd_display(uchar add,uchar dat);
  76. /***********************************/
  77. void delay_us()
  78. {
  79. uchar x;
  80. for(x=0;x<5;x++);
  81. }
  82. void delay_ms(uint z)
  83. {
  84. uint x,y;
  85. for(x=0;x<z;x++)
  86.   for(y=0;y<123;y++);
  87. }
  88. void lcd_write_com(uchar com)
  89. {
  90.   E=0;
  91.   RS=0;
  92.   RW=0;
  93.   delay_us();
  94.   LCD_data=com;
  95.   E=1;    //高脈沖寫入數(shù)據(jù)
  96.   delay_us();
  97.   E=0;
  98. }
  99. void lcd_write_dat(uchar dat)
  100. {
  101.   E=0;
  102.   RS=1;
  103.   RW=0;
  104.   delay_us();
  105.   LCD_data=dat;
  106.   E=1;    //高脈沖寫入數(shù)據(jù)
  107.   delay_us();
  108.   E=0;
  109. }
  110. void lcd_init()    //lcd初始化
  111. {
  112. delay_ms(15);
  113. lcd_write_com(0x38);
  114. delay_ms(10);
  115. lcd_write_com(0x0c);
  116. lcd_write_com(0x06);
  117. lcd_write_com(0x01);
  118. delay_ms(2);


  119. }
  120. void lcd_display(uchar add,uchar dat)    //lcd顯示(地址,數(shù)據(jù))
  121. {
  122. lcd_write_com(add);

  123. lcd_write_dat(dat);
  124. delay_us();
  125. }
  126. void main()
  127. {
  128. char i;
  129.   lcd_init();
  130. for(i=0;i<12;i++)
  131. {
  132.   lcd_display(0x80+i,table2[i]);
  133. }
  134. for(i=0;i<14;i++)
  135. {
  136.   lcd_display(0x80+0x40+i,table3[i]);
  137. }
  138.    Init();
  139. while(1)
  140. {
  141.    KeyScan();
  142.    Motor();
  143.   // display(real_speed/1000,real_speed%1000/100,real_speed%100/10,real_speed%10) ;
  144.    display(lilun_speed/1000,lilun_speed%1000/100,lilun_speed%100/10,lilun_speed%10) ;
  145. }
  146. }
  147. //顯示函數(shù)
  148. void display(uint first,uint second,uint third,uint forth)   
  149. {
  150.   wela1 = 0;
  151. dula = table[first];   //顯示第一個
  152. DelayMs(1);
  153. wela1 = 1;
  154. dula = 0x00;    //一定要加,否則不穩(wěn)定
  155. wela2 = 0;
  156. dula = table[second];  //顯示第二個
  157. DelayMs(1);
  158. wela2 = 1;
  159. dula = 0x00;
  160. wela3 = 0;
  161. dula = table[third];  //顯示第三個
  162. DelayMs(1);
  163. wela3 = 1;
  164. dula = 0x00;
  165. wela4 = 0;
  166. dula = table[forth];   //顯示第4個
  167. DelayMs(1);
  168. wela4 = 1;
  169. dula = 0x00;
  170. }
  171.   //顯示函數(shù)
  172. void display2(uint first,uint second,uint third,uint forth)   
  173. {
  174.     wela5 = 0;
  175. dula = table[first];   //顯示第一個
  176. DelayMs(1);
  177. wela5 = 1;
  178. dula = 0x00;    //一定要加,否則不穩(wěn)定
  179. wela6 = 0;
  180. dula = table[second];  //顯示第二個
  181. DelayMs(1);
  182. wela6 = 1;
  183. dula = 0x00;
  184. wela7 = 0;
  185. dula = table[third];  //顯示第三個
  186. DelayMs(1);
  187. wela7 = 1;
  188. dula = 0x00;
  189. wela8 = 0;
  190. dula = table[forth];   //顯示第4個
  191. DelayMs(1);
  192. wela8 = 1;
  193. dula = 0x00;
  194. }
  195. /****************** 電機(jī)運(yùn)轉(zhuǎn)函數(shù) **********************/
  196. void Motor()
  197. {
  198. if(Move==1)
  199. {
  200.      LedGreen=0;
  201.    if(Delay==1)
  202.    {
  203.      Delay=0;
  204.      if(Way==0)
  205.      {
  206.       LedRed=0;
  207.     LedYellow=1;
  208.        switch(Mode)
  209.        {
  210.            /* 電機(jī)步進(jìn)拍數(shù)表數(shù)據(jù)送到電機(jī)控制口;判斷一周拍數(shù)是否完成;步數(shù)加 1*/
  211.          case 1:MotorData=PositiveSingleFour[Flag++];if(Flag>=4) Flag=0;Step++;break;
  212.          case 2:MotorData=PositiveDoubleFour[Flag++];if(Flag>=4) Flag=0;Step++;break;
  213.          case 3:MotorData=PositiveEight[Flag++];if(Flag>=8) Flag=0;Step++;break;
  214.          default:  ;
  215.        }
  216.      }
  217.      else
  218.      {
  219.      LedRed=1;
  220.     LedYellow=0;
  221.        switch(Mode)
  222.        {
  223.          case 1:MotorData=NegitiveSingleFour[Flag++];if(Flag>=4) Flag=0;Step++;break;
  224.          case 2:MotorData=NegitiveDoubleFour[Flag++];if(Flag>=4) Flag=0;Step++;break;
  225.          case 3:MotorData=NegitiveEight[Flag++];if(Flag>=8) Flag=0;Step++;break;
  226.          default:  ;
  227.        }
  228.      }
  229.    }
  230. }
  231. else
  232. {
  233.    MotorData=0xef;
  234.    LedGreen=1;
  235. }
  236. }
  237. /****************** 初始化函數(shù) **********************/
  238. void Init()
  239. {
  240. Move=0;
  241. LedGreen=1;
  242. Step=0;
  243. MotorData=0xef;
  244. IT0=1;//跳變沿出發(fā)方式(下降沿)
  245. EX0=1;//打開INT0的中斷允許。
  246. EA=1;//打開總中斷  
  247. TMOD=0x11;        // 定時器 0 初始化
  248. TH0=(65536-2000)/256;
  249. TL0=(65536-2000)%256;
  250. EA=1;          // 開總中斷
  251. ET0=1;          // 開定時器 0 中斷
  252. TR0=1;          // 開始計時
  253. }
  254. /****************** 按鍵檢測函數(shù) **********************/
  255. void KeyScan()
  256. {
  257. uchar Temp,Over=0;
  258. Temp=KeyData;
  259. Temp=Temp&0x08;
  260.   if(Temp!=0x08)   // 啟動鍵按下
  261. {
  262.     Move=1;
  263.    Temp=KeyData;
  264.    Temp=Temp&0x60;
  265.    if(Temp!=0x60)
  266.    {
  267.       DelayMs(2);          // 按鍵軟件消抖
  268.       Temp=KeyData;
  269.      Temp=Temp&0x60;
  270.      if(Temp!=0x60)
  271.      {  
  272.         Over=1;        // 有鍵按下則不掃描后續(xù)按鍵
  273.         if(Temp==0x40)    // 加速鍵按下
  274.        {
  275.           while(Temp!=0xe7)  // 按鍵松開檢測
  276.          {
  277.            Temp=KeyData;
  278.            Temp=Temp&0xe7;
  279.          }
  280.          Speed=Speed-SpeedChang;   
  281.          if(Speed<=SpeedMax)
  282.          {
  283.             Speed=SpeedMax;  // 一直按加速鍵則保持到最大速度
  284.          }
  285.        }
  286.         else if(Temp==0x20)          // 減速鍵按下
  287.        {  
  288.           while(Temp!=0xe7)
  289.          {
  290.            Temp=KeyData;
  291.            Temp=Temp&0xe7;
  292.          }
  293.          Speed=Speed+SpeedChang;
  294.          if(Speed>=SpeedMin)
  295.          {
  296.            Speed=SpeedMin;
  297.          }
  298.        }
  299.      }
  300.    }
  301.     if(Over==0)              // 判斷前是否有鍵按下
  302.    {
  303.       Temp=KeyData;
  304.      Temp=Temp&0x10;
  305.      if(Temp!=0x10)
  306.      {
  307.        DelayMs(2);
  308.        Temp=KeyData;
  309.        Temp=Temp&0x10;
  310.        if(Temp!=0x10)
  311.        {
  312.           Way=0;          // 方向按鍵按下,電機(jī)順時針轉(zhuǎn)動
  313.        }
  314.      }
  315.       else
  316.      {
  317.        Way=1;
  318.      }
  319.    }
  320.    if(Over==0)
  321.    {
  322.      Temp=KeyData;
  323.      Temp=Temp&0x07;
  324.      if(Temp!=0x07)
  325.      {
  326.        DelayMs(2);
  327.        Temp=KeyData;
  328.        Temp=Temp&0x07;
  329.        if(Temp!=0x07)
  330.        {
  331.          switch(Temp)
  332.          {
  333.             case 0x06:  Mode=1;break;// 電機(jī)四相單四拍運(yùn)行
  334.             case 0x05:  Mode=2;break;// 電機(jī)四相雙四拍運(yùn)行
  335.             case 0x03:  Mode=3;break;// 電機(jī)四相八拍運(yùn)行
  336.          }
  337.        }
  338.      }
  339.    }
  340. }
  341.   else
  342. {
  343.     Move=0;              // 電機(jī)停止
  344. }
  345. }
  346. /**************** 毫秒延時 ***************/
  347. void DelayMs(uint z)
  348. {
  349. uint t1,y;
  350. for(t1=z;t1>0;t1--)
  351.    for(y=110;y>0;y--);
  352. }
  353. /**************** 定時器 0 中斷函數(shù) ***************/
  354. void T0_time() interrupt 1
  355. {
  356. // TH0=(65536-45872)/256;
  357. // TL0=(65536-45872)%256;
  358. TH0=(65536-2000)/256;
  359. TL0=(65536-2000)%256;
  360. Num++;
  361. Period++;
  362. if(Num>=Speed)
  363. {
  364.     Num=0;
  365.     Delay=1;      // 延時時間到
  366. }
  367.   if(Period >= 500)
  368.   {  
  369.     real_speed=Pulse*60;   //實際轉(zhuǎn)速
  370.     lilun_speed =Step*15;  //理論轉(zhuǎn)速
  371. Step=0;
  372.     Pulse=0;
  373. Period=0;
  374.   }
  375. }
  376. /*外部中斷0的中斷函數(shù)*/
  377. void Int0()        interrupt 0               
  378. {
  379.   Pulse++;//脈沖++
  380. }
復(fù)制代碼
全部資料51hei下載地址:
步進(jìn)電機(jī)1602 數(shù)碼管.rar (155.69 KB, 下載次數(shù): 87)

評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:143767 發(fā)表于 2020-10-23 19:40 | 只看該作者
仿真看了一下1602顯示的數(shù)據(jù)沒有任何變化,無論按哪個按鍵1602都無任何變化,不知為何?樓主能否告訴是什么原因,謝謝!
回復(fù)

使用道具 舉報

板凳
ID:143767 發(fā)表于 2020-10-30 16:26 | 只看該作者
帖子都沉了也沒人回答
回復(fù)

使用道具 舉報

地板
ID:675166 發(fā)表于 2020-11-9 10:04 | 只看該作者

仿真看了一下1602顯示的數(shù)據(jù)沒有任何變化,無論按哪個按鍵1602都無任何變化,不知為何?樓主能否告訴是什么原因,謝謝!
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品视频久久 | 爱综合| 久久精品国产一区二区电影 | 国产精品一区二区久久 | 国产成人精品一区二区 | 中文字幕一区在线观看视频 | 一区二区三区在线观看免费视频 | 亚洲国产二区 | 国产欧美精品一区二区色综合 | 高清一区二区 | 亚洲精品短视频 | 亚洲欧洲在线视频 | 亚洲精品成人 | 亚洲女人的天堂 | 欧美色综合一区二区三区 | 夜夜精品视频 | 成人av观看| 国产一区二区三区久久久久久久久 | 久久久久久久久中文字幕 | 欧美一区二区三区精品免费 | 一区二区三区欧美 | 一区二区三区日韩精品 | 99国产精品久久久 | 国产一级电影在线观看 | 欧美久久久久 | 免费黄色a级毛片 | 精品久久久久一区二区国产 | 国产精品久久久亚洲 | 欧美一级黄 | 人人干超碰 | 国产国拍亚洲精品av | 国内精品在线视频 | 中文字幕一区二区三区四区五区 | 日韩欧美国产精品 | 免费一区二区三区在线视频 | 最新国产精品精品视频 | 51ⅴ精品国产91久久久久久 | 91在线电影 | 欧美日韩精品一区 | 成人免费在线观看 | 欧美精品在线看 |