1602+步进电机控制
矩阵键盘、附带程序和仿真图
单片机源程序如下:
- #include<reg52.h>
- #include<stdio.h>
- #include"1602.h"
- #include"delay.h"
- sbit A1=P2^0; //定义步进电机连接端口
- sbit B1=P2^1;
- sbit C1=P2^2;
- sbit D1=P2^3;
- sbit key1=P3^7;
- sbit key2=P3^4;
- sbit key3=P1^7;
- sbit key4=P1^3;
- #define KeyPort P3
- void Init_Timer0(void);
- unsigned char KeyPro(void);
- #define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
- #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
- #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
- #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
- #define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
- #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
- #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
- #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
- #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电
- unsigned char Speed=1;
- bit StopFlag;
- unsigned char code code_1602[]={'1','2','3','4','5','6','7','8','9'};//转换成液晶显示的字符
- main()
- {
- unsigned int i=512;//旋转一周时间
- // unsigned char num;
- unsigned shi,ge;
- Init_Timer0();
- LCD_Init();
- // LCD_Clear();
-
- while(1) //正向
- {
- //num为键盘值
- //num=KeyPro();
- //LCD_Write_String(0,1,"Speed:0");
- switch(KeyPro())
- {
- case 1:{
- Coil_OFF
- StopFlag=1;
- LCD_Write_String(2,0," stop ");
- LCD_Write_String(0,1,"Speed:0");
- }break;
- case 2:{
- StopFlag=0;
- LCD_Write_String(2,0," running ");
- }break;
- case 3:{
- if(Speed<18)
- {
- Speed++;
- LCD_Write_String(2,0," Speed up ");
- LCD_Write_String(0,1,"Speed:");
- shi=Speed/10;
- ge=Speed%10;
- LCD_Write_Char(6,1,code_1602[shi]);
- LCD_Write_Char(7,1,code_1602[ge]);
- }
- }break;
- case 4:{
- if(Speed>1)
- {
- Speed--;
- LCD_Write_String(2,0,"Speed down");
- LCD_Write_String(0,1,"Speed:");
- LCD_Write_Char(6,1,code_1602[Speed]);
- }
- }break;
- }
- // if(num==2)//第一个按键,速度等级增加
- // {
- // if(Speed<18)
- // {
- // Speed++;
- // LCD_Write_String(2,0," Speed up ");
- // LCD_Write_String(0,1,"Speed:");
- // shi=Speed/10;
- // ge=Speed%10;
- // LCD_Write_Char(6,1,code_1602[shi]);
- // LCD_Write_Char(7,1,code_1602[ge]);
- // }
- // }
- // else if(num==3)//第二个按键,速度等级减小
- // {
- // if(Speed>1)
- // Speed--;
- // LCD_Write_String(2,0,"Speed down");
- // LCD_Write_String(0,1,"Speed:");
- // LCD_Write_Char(6,1,code_1602[Speed]);
- // }
- // else if(num==0)//电机停止
- // {
- // Coil_OFF
- // StopFlag=1;
- // LCD_Write_String(2,0," stop ");
- // LCD_Write_String(0,1,"Speed:0");
- // }
- // else if(num==1)//电机启动
- // {
- // StopFlag=0;
- // LCD_Write_String(2,0," running ");
- // }
- }
- }
- /*------------------------------------------------
- 定时器初始化子程序
- ------------------------------------------------*/
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
- //TH0=0x00; //给定初值
- //TL0=0x00;
- EA=1; //总中断打开
- ET0=1; //定时器中断打开
- TR0=1; //定时器开关打开
- PT0=1; //优先级打开
- }
- /*------------------------------------------------
- 定时器中断子程序
- ------------------------------------------------*/
- void Timer0_isr(void) interrupt 1
- {
- static unsigned char times,i;
- TH0=(65536-1000)/256; //重新赋值 1ms
- TL0=(65536-1000)%256;
-
- //Display(0,8);
- if(!StopFlag)
- {
- if(times==(20-Speed))//最大值18,所以最小间隔值20-18=2
- {
- times=0;
-
- switch(i)
- {
- case 0:Coil_A1;i++;break;
- case 1:Coil_B1;i++;break;
- case 2:Coil_C1;i++;break;
- case 3:Coil_D1;i++;break;
- case 4:i=0;break;
- default:break;
- }
- }
- times++;
- }
- }
- ///*------------------------------------------------
- //按键扫描函数,返回扫描键值
- //------------------------------------------------*/
- //unsigned char KeyScan(void) //键盘扫描函数,使用行列反转扫描法
- //{
- // unsigned char cord_h,cord_l;//行列值中间变量
- // KeyPort=0x0f; //行线输出全为0
- // cord_h=KeyPort&0x0f; //读入列线值
- // if(cord_h!=0x0f) //先检测有无按键按下
- // {
- // DelayMs(10); //去抖
- // if((KeyPort&0x0f)!=0x0f)
- // {
- // cord_h=KeyPort&0x0f; //读入列线值
- // KeyPort=cord_h|0xf0; //输出当前列线值
- // cord_l=KeyPort&0xf0; //读入行线值
- //
- // while((KeyPort&0xf0)!=0xf0);//等待松开并输出
- //
- // return(cord_h+cord_l);//键盘最后组合码值
- // }
- // }return(0xff); //返回该值
- //}
- ///*------------------------------------------------
- //按键值处理函数,返回扫键值
- //------------------------------------------------*/
- //unsigned char KeyPro(void)
- //{
- // switch(KeyScan())
- // {
- // case 0x7e:return 0;break;//0 按下相应的键显示相对应的码值
- // case 0x7d:return 1;break;//1
- // case 0x7b:return 2;break;//2
- // case 0x77:return 3;break;//3
- // case 0xbe:return 4;break;//4
- // case 0xbd:return 5;break;//5
- // case 0xbb:return 6;break;//6
- // case 0xb7:return 7;break;//7
- // case 0xde:return 8;break;//8
- // case 0xdd:return 9;break;//9
- // case 0xdb:return 10;break;//a
- // case 0xd7:return 11;break;//b
- // case 0xee:return 12;break;//c
- // case 0xed:return 13;break;//d
- // case 0xeb:return 14;break;//e
- // case 0xe7:return 15;break;//f
- // default:return 0xff;break;
- // }
- //}
- unsigned char KeyPro(void)
- {
- if(key1 == 0)
- {
- DelayMs(10);//在此处可以添加去抖动程序,防止按键抖动造成错误
- if(key1 == 0)
- while(!key1);//等待按键释放
- {
- return 1;
- }
- }
- if(key2 == 0)
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
实训.zip
(14.19 MB, 下载次数: 30)
|