标题:
1602液晶+步进电机的单片机控制实训资料
[打印本页]
作者:
ATXD
时间:
2017-5-28 15:40
标题:
1602液晶+步进电机的单片机控制实训资料
1602+步进电机控制
矩阵键盘、附带程序和仿真图
0.png
(76.11 KB, 下载次数: 75)
下载附件
2017-5-28 16:55 上传
单片机源程序如下:
#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)
2017-5-28 15:40 上传
点击文件名下载附件
1602+步进电机控制
下载积分: 黑币 -5
作者:
admin
时间:
2017-5-28 16:59
好东东 不过仿真文件无法打开
作者:
半路
时间:
2017-5-28 17:15
下载下来研究一下,感谢楼主分享。
作者:
tiandiko86
时间:
2017-5-28 18:32
不孬,收藏了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1