找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2239|回复: 4
打印 上一主题 下一主题
收起左侧

1602液晶+步进电机的单片机控制实训资料

[复制链接]
跳转到指定楼层
楼主
1602+步进电机控制
矩阵键盘、附带程序和仿真图

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<stdio.h>
  3. #include"1602.h"
  4. #include"delay.h"

  5. sbit A1=P2^0; //定义步进电机连接端口
  6. sbit B1=P2^1;
  7. sbit C1=P2^2;
  8. sbit D1=P2^3;

  9. sbit key1=P3^7;
  10. sbit key2=P3^4;
  11. sbit key3=P1^7;
  12. sbit key4=P1^3;

  13. #define KeyPort P3

  14. void Init_Timer0(void);
  15. unsigned char KeyPro(void);

  16. #define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
  17. #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
  18. #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
  19. #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
  20. #define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
  21. #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
  22. #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
  23. #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
  24. #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电

  25. unsigned char Speed=1;

  26. bit StopFlag;

  27. unsigned char code code_1602[]={'1','2','3','4','5','6','7','8','9'};//转换成液晶显示的字符

  28. main()
  29. {
  30.         unsigned int i=512;//旋转一周时间
  31. //        unsigned char num;
  32.         unsigned shi,ge;
  33.         Init_Timer0();
  34.         LCD_Init();
  35. //        LCD_Clear();
  36.        
  37.         while(1)  //正向
  38.           {                  
  39.                 //num为键盘值
  40.                 //num=KeyPro();
  41.                 //LCD_Write_String(0,1,"Speed:0");
  42.                 switch(KeyPro())
  43.                 {
  44.                         case 1:{
  45.                                         Coil_OFF
  46.                                     StopFlag=1;
  47.                                     LCD_Write_String(2,0,"    stop   ");
  48.                                     LCD_Write_String(0,1,"Speed:0");
  49.                                    }break;
  50.                         case 2:{
  51.                                         StopFlag=0;
  52.                                         LCD_Write_String(2,0,"  running ");
  53.                                    }break;
  54.                         case 3:{
  55.                                         if(Speed<18)
  56.                                         {
  57.                                                 Speed++;
  58.                                                 LCD_Write_String(2,0," Speed up ");
  59.                                                 LCD_Write_String(0,1,"Speed:");
  60.                                                 shi=Speed/10;
  61.                                                 ge=Speed%10;
  62.                                                 LCD_Write_Char(6,1,code_1602[shi]);
  63.                                                 LCD_Write_Char(7,1,code_1602[ge]);
  64.                                         }               
  65.                                    }break;
  66.                         case 4:{
  67.                                            if(Speed>1)
  68.                                         {
  69.                                                 Speed--;
  70.                                                 LCD_Write_String(2,0,"Speed down");
  71.                                                 LCD_Write_String(0,1,"Speed:");
  72.                                                 LCD_Write_Char(6,1,code_1602[Speed]);
  73.                                     }
  74.                                    }break;
  75.                 }

  76. //                if(num==2)//第一个按键,速度等级增加
  77. //                {
  78. //                        if(Speed<18)
  79. //                        {
  80. //                                Speed++;
  81. //                                LCD_Write_String(2,0," Speed up ");
  82. //                                LCD_Write_String(0,1,"Speed:");
  83. //                                shi=Speed/10;
  84. //                                ge=Speed%10;
  85. //                                LCD_Write_Char(6,1,code_1602[shi]);
  86. //                                LCD_Write_Char(7,1,code_1602[ge]);
  87. //                        }       
  88. //                }       
  89. //                else if(num==3)//第二个按键,速度等级减小
  90. //                {
  91. //                        if(Speed>1)
  92. //                        Speed--;
  93. //                        LCD_Write_String(2,0,"Speed down");
  94. //                        LCD_Write_String(0,1,"Speed:");
  95. //                        LCD_Write_Char(6,1,code_1602[Speed]);
  96. //                }       
  97. //                else if(num==0)//电机停止
  98. //                {
  99. //                        Coil_OFF
  100. //                        StopFlag=1;
  101. //                        LCD_Write_String(2,0,"    stop   ");
  102. //                        LCD_Write_String(0,1,"Speed:0");
  103. //                }
  104. //                else if(num==1)//电机启动
  105. //                {
  106. //                        StopFlag=0;
  107. //                        LCD_Write_String(2,0,"  running ");
  108. //                }               
  109.         }
  110. }


  111. /*------------------------------------------------
  112.                     定时器初始化子程序
  113. ------------------------------------------------*/
  114. void Init_Timer0(void)
  115. {
  116. TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
  117. //TH0=0x00;              //给定初值
  118. //TL0=0x00;
  119. EA=1;            //总中断打开
  120. ET0=1;           //定时器中断打开
  121. TR0=1;           //定时器开关打开
  122. PT0=1;           //优先级打开
  123. }
  124. /*------------------------------------------------
  125.                  定时器中断子程序
  126. ------------------------------------------------*/
  127. void Timer0_isr(void) interrupt 1
  128. {
  129. static unsigned char times,i;
  130. TH0=(65536-1000)/256;                  //重新赋值 1ms
  131. TL0=(65536-1000)%256;

  132. //Display(0,8);
  133. if(!StopFlag)
  134. {
  135.           if(times==(20-Speed))//最大值18,所以最小间隔值20-18=2
  136.           {
  137.                 times=0;
  138.                
  139.                 switch(i)
  140.             {
  141.                         case 0:Coil_A1;i++;break;
  142.                         case 1:Coil_B1;i++;break;
  143.                         case 2:Coil_C1;i++;break;
  144.                         case 3:Coil_D1;i++;break;
  145.                         case 4:i=0;break;
  146.                         default:break;
  147.            }
  148.           }
  149.           times++;
  150. }
  151. }


  152. ///*------------------------------------------------
  153. //按键扫描函数,返回扫描键值
  154. //------------------------------------------------*/
  155. //unsigned char KeyScan(void)  //键盘扫描函数,使用行列反转扫描法
  156. //{
  157. // unsigned char cord_h,cord_l;//行列值中间变量
  158. // KeyPort=0x0f;            //行线输出全为0
  159. // cord_h=KeyPort&0x0f;     //读入列线值
  160. // if(cord_h!=0x0f)    //先检测有无按键按下
  161. // {
  162. //  DelayMs(10);        //去抖
  163. //  if((KeyPort&0x0f)!=0x0f)
  164. //  {
  165. //    cord_h=KeyPort&0x0f;  //读入列线值
  166. //    KeyPort=cord_h|0xf0;  //输出当前列线值
  167. //    cord_l=KeyPort&0xf0;  //读入行线值
  168. //
  169. //    while((KeyPort&0xf0)!=0xf0);//等待松开并输出
  170. //
  171. //    return(cord_h+cord_l);//键盘最后组合码值
  172. //   }
  173. //  }return(0xff);     //返回该值
  174. //}
  175. ///*------------------------------------------------
  176. //按键值处理函数,返回扫键值
  177. //------------------------------------------------*/
  178. //unsigned char KeyPro(void)
  179. //{
  180. //         switch(KeyScan())
  181. //         {
  182. //                  case 0x7e:return 0;break;//0 按下相应的键显示相对应的码值
  183. //                  case 0x7d:return 1;break;//1
  184. //                  case 0x7b:return 2;break;//2
  185. //                  case 0x77:return 3;break;//3
  186. //                  case 0xbe:return 4;break;//4
  187. //                  case 0xbd:return 5;break;//5
  188. //                  case 0xbb:return 6;break;//6
  189. //                  case 0xb7:return 7;break;//7
  190. //                  case 0xde:return 8;break;//8
  191. //                  case 0xdd:return 9;break;//9
  192. //                  case 0xdb:return 10;break;//a
  193. //                  case 0xd7:return 11;break;//b
  194. //                  case 0xee:return 12;break;//c
  195. //                  case 0xed:return 13;break;//d
  196. //                  case 0xeb:return 14;break;//e
  197. //                  case 0xe7:return 15;break;//f
  198. //                  default:return 0xff;break;
  199. //         }
  200. //}

  201. unsigned char KeyPro(void)
  202. {
  203.         if(key1 == 0)
  204.            {
  205.                    DelayMs(10);//在此处可以添加去抖动程序,防止按键抖动造成错误
  206.                    if(key1 == 0)
  207.                            while(!key1);//等待按键释放
  208.                            {
  209.                              return 1;   
  210.                     }
  211.    }

  212.         if(key2 == 0)
  213.            {
  214. ……………………

  215. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
实训.zip (14.19 MB, 下载次数: 30)


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

使用道具 举报

沙发
ID:1 发表于 2017-5-28 16:59 | 只看该作者
好东东 不过仿真文件无法打开
回复

使用道具 举报

板凳
ID:185367 发表于 2017-5-28 17:15 | 只看该作者
下载下来研究一下,感谢楼主分享。
回复

使用道具 举报

地板
ID:103307 发表于 2017-5-28 18:32 | 只看该作者
不孬,收藏了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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