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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3250|回復: 0
收起左側

51單片機紅外遙控控制步進電機的LCD顯示源程序

[復制鏈接]
ID:707040 發表于 2020-6-5 12:51 | 顯示全部樓層 |閱讀模式
最近玩了51控制步進電機,利用51單片機紅外控制步進電機的LCD顯示(成功了),壓縮包內代碼全面,可直接套用,有興趣的話大家可以下載研究。

單片機源程序如下:
  1. /*******************************************************************************
  2. * 實驗名                           : 紅外控制步進電機1602顯示值實驗
  3. * 使用的IO             : 電機用P2口
  4. * 實驗效果       : LCD1602顯示出讀取到的紅外線的值,步進電機作出相應的動作,啟動、停止、正轉反轉等
  5. *        注意                                         :
  6. *******************************************************************************/
  7. #include<reg51.h>
  8. #include"lcd.h"

  9.   sbit EN=P2^2;
  10. sbit DIR=P2^1;
  11. sbit CLK=P2^0;
  12. sbit  Speaker=P1^5;

  13. sbit IRIN=P3^2;

  14.   
  15. typedef unsigned char u8;
  16. typedef unsigned int u16;


  17. u16 z=0,cyl;



  18. unsigned char code CDIS1[13]={" Red Control "};
  19. unsigned char code CDIS2[13]={" IR-CODE:--H "};
  20. unsigned char IrValue[6];
  21. unsigned char Time;
  22. void IrInit();
  23. void DelayMs(unsigned int );
  24. void T0_init();
  25. void T1_init();

  26. void keyscan();

  27. /*  void delay1s(void);
  28.   void delay1s(void)

  29. {

  30. unsigned char h,i,j,k;

  31. for(h=5;h>0;h--)

  32. for(i=4;i>0;i--)

  33. for(j=116;j>0;j--)

  34. for(k=214;k>0;k--);

  35. }  */


  36. void T0_init()
  37. {
  38. //對TMOD進行賦值,選擇T0/T1
  39.     //TMOD 8位 低4位用于T0,高4位用于T1 : GATE  C/T(C計數器高位有效,T定時器低位有效)  M1M2(工作方式 : 00 01 10 11)
  40.     //或運算|防止其他位被影響
  41.     TMOD|=0x11;
  42.     //計算初值  1ms=1000us的初值 :2的16次方(65535)-1000+1 = 64536 = FC18H  (工具)
  43.   
  44.   TH0=(65536-50)/256;
  45.   TL0=(65536-50)%256;
  46.     //定時器0使能
  47.     ET0=1;

  48.     //打開總中斷
  49.     EA=1;
  50.     //TR0/TR1是T0/T1的運行控制位 TR0置1,T0開始工作,置1則停止工作
  51.    

  52.    }
  53.    //中斷函數
  54. void Timer0() interrupt 1
  55. {
  56.    
  57.   TH0=(65536-50)/256;
  58.   TL0=(65536-50)%256;
  59.   
  60.         
  61.         CLK=~CLK ;

  62.         
  63.         }

  64.    
  65. void T1_init()
  66. {

  67.   TH1=(65536-50000)/256;
  68.   TL1=(65536-50000)%256;
  69.     //定時器0使能
  70.     ET1=1;

  71.     //打開總中斷
  72.     EA=1;
  73.     //TR0/TR1是T0/T1的運行控制位 TR0置1,T0開始工作,置1則停止工作
  74.    

  75.    }
  76.    //中斷函數
  77. void Timer1() interrupt 3
  78. {
  79.    

  80.   TH1=(65536-50000)/256;
  81.   TL1=(65536-50000)%256;

  82.       z++;  
  83.         


  84.         
  85.         }



  86. /*******************************************************************************
  87. * 函數名         : main
  88. * 函數功能                   : 主函數
  89. * 輸入           : 無
  90. * 輸出                  : 無
  91. *******************************************************************************/

  92. void main()
  93. {
  94.         unsigned char i;
  95.         IrInit();        
  96.         LcdInit();
  97.         
  98.         LcdWriteCom(0x80);

  99.                  EN=0;
  100.                 DIR=0;
  101.                 T0_init();
  102.                 T1_init();
  103.                

  104.         for(i=0;i<13;i++)
  105.         {
  106.                 LcdWriteData(CDIS1[i]);        
  107.         }
  108.         LcdWriteCom(0x80+0x40);
  109.         for(i=0;i<13;i++)
  110.         {
  111.                 LcdWriteData(CDIS2[i]);        
  112.         }
  113.         while(1)
  114.         {
  115.                 IrValue[4]=IrValue[2]>>4;                          //高位
  116.                 IrValue[5]=IrValue[2]&0x0f;                //低位        
  117.                 if(IrValue[4]>9)
  118.                 {
  119.                         LcdWriteCom(0xc0+0x09);                        //設置顯示位置
  120.                         LcdWriteData(0x37+IrValue[4]);        //將數值轉換為該顯示的ASCII碼
  121.                 }
  122.                 else
  123.                 {
  124.                         LcdWriteCom(0xc0+0x09);
  125.                         LcdWriteData(IrValue[4]+0x30);        //將數值轉換為該顯示的ASCII碼
  126.                 }        
  127.                 if(IrValue[5]>9)
  128.                 {
  129.                         LcdWriteCom(0xc0+0x0a);
  130.                         LcdWriteData(IrValue[5]+0x37);                //將數值轉換為該顯示的ASCII碼
  131.                 }
  132.                 else
  133.                 {
  134.                         LcdWriteCom(0xc0+0x0a);
  135.                         LcdWriteData(IrValue[5]+0x30);                //將數值轉換為該顯示的ASCII碼
  136.                 }


  137.                 keyscan();
  138.                
  139.                
  140.                
  141.                

  142.         }
  143. }

  144. void keyscan()
  145. {
  146.                    if( IrValue[4]==4&&        IrValue[5]==5) //步進啟動
  147.                  {
  148.                     
  149.                         TR0=1;
  150.                 EN=1;
  151.                         
  152.                
  153.                  }

  154.         

  155.                  else if( IrValue[4]==4&&        IrValue[5]==4) //停止
  156.                  {
  157.                         
  158.                         TR0=0;
  159.                      EN=0;
  160.                
  161.                
  162.                  }
  163.                   else if( IrValue[4]==0&&        IrValue[5]==9) //正
  164.                  {
  165.                     
  166.                    DIR=1;
  167.                  }
  168.                  else if( IrValue[4]==1&&        IrValue[5]==5) //反
  169.                  {
  170.                    DIR=0;
  171.                  }

  172.                  
  173.                  
  174.                
  175.                
  176.                


  177. }
  178.                                                                         
  179. /*******************************************************************************
  180. * 函數名         : DelayMs()
  181. * 函數功能                   : 延時
  182. * 輸入           : x
  183. * 輸出                  : 無
  184. *******************************************************************************/

  185. void DelayMs(unsigned int x)   //0.14ms誤差 0us
  186. {
  187. unsigned char i;
  188.   while(x--)
  189. {
  190.   for (i = 0; i<13; i++)
  191. {}
  192. }
  193. }



  194. /*******************************************************************************
  195. * 函數名         : IrInit()
  196. * 函數功能                   : 初始化紅外線接收
  197. * 輸入           : 無
  198. * 輸出                  : 無
  199. *******************************************************************************/

  200. void IrInit()
  201. {
  202.         IT0=1;//下降沿觸發
  203.         EX0=1;//打開中斷0允許
  204.         EA=1;        //打開總中斷

  205.         IRIN=1;//初始化端口
  206. }
  207. /*******************************************************************************
  208. * 函數名         : ReadIr()
  209. * 函數功能                   : 讀取紅外數值的中斷函數
  210. * 輸入           : 無
  211. * 輸出                  : 無
  212. *******************************************************************************/

  213. void ReadIr() interrupt 0
  214. {
  215.         unsigned char j,k;
  216.         unsigned int err;
  217.         Time=0;                                         
  218.         DelayMs(70);

  219.         if(IRIN==0)                //確認是否真的接收到正確的信號
  220.         {         
  221.                
  222.                 err=1000;                                //1000*10us=10ms,超過說明接收到錯誤的信號
  223.                 /*當兩個條件都為真是循環,如果有一個條件為假的時候跳出循環,免得程序出錯的時
  224.                 侯,程序死在這里*/        
  225.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低電平過去                  
  226.                 {                        
  227.                         DelayMs(1);
  228.                         err--;
  229.                 }
  230.                 if(IRIN==1)                        //如果正確等到9ms低電平
  231.                 {
  232.                         err=500;
  233.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高電平過去
  234.                         {
  235.                                 DelayMs(1);
  236.                                 err--;
  237.                         }
  238.                         for(k=0;k<4;k++)                //共有4組數據
  239.                         {                                
  240.                                 for(j=0;j<8;j++)        //接收一組數據
  241.                                 {
  242.                                        
  243.                                         err=60;               
  244. ……………………

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

所有程序51hei提供下載:
紅外控制·步進電機 LCD1602顯示.rar (39.52 KB, 下載次數: 60)


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91久久精品国产91久久 | 国产精品毛片无码 | 国产欧美精品一区二区 | 欧美精品欧美精品系列 | 精品国产乱码久久久久久影片 | 免费成人高清在线视频 | 男女视频在线免费观看 | 二区在线视频 | 欧美日韩亚洲一区 | 国产午夜精品理论片a大结局 | 国产一级片免费视频 | 午夜性视频 | av日韩在线播放 | 国产婷婷在线视频 | 成人小视频在线观看 | 一级黄色日本片 | 亚洲乱码一区二区三区在线观看 | 日韩精品亚洲专区在线观看 | 日日操操操 | 国产精品视频网 | 久久影音先锋 | 欧美一级在线 | 高清久久久 | 日韩色在线 | 中文字幕一区在线观看视频 | 国产精品国产a | 91最新在线视频 | 精品国产乱码久久久久久牛牛 | 福利片在线看 | 亚洲乱码国产乱码精品精98午夜 | 黄色成人在线网站 | 中文字幕高清在线 | 华丽的挑战在线观看 | 欧美日韩在线视频一区 | 在线观看亚 | 羞羞视频网站免费看 | www.欧美视频| 精品九九九 | 亚洲欧美日韩精品久久亚洲区 | 俺去俺来也www色官网cms | 国产精品久久7777777 |