找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2915|回复: 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)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表