这是我做的红外遥控控制的1602显示转速和转向的步进电机c语言原程序,已经调试成功!有些模块是以前做其他实验时做的,现在是直接调用的,包括1602液晶显示技术,TC9012红外解码,然后就是四相步进电机的控制程序了,我是把这些东西结合起来。对这个东西有兴趣的或者要做毕业设计的可以看看啊,不懂的请上单片机论坛http://www.51hei.com/bbs/ 公开讨论,我会给大家做出详细的解答。

#include

#include#include#define uchar unsigned char

#define uint unsigned int

static unsigned int count; //计数

unsigned int hour,minute,second,count;

sbit RS = P2^3;//Pin4

sbit RW = P2^2; //Pin5

sbit E = P2^4;//Pin6

#define Data P0 //数据端口

static int step_index; //步进索引数,值为0-7

bit k=0; //红外解码判断标志位,为0则为有效信号,为1则为无效

uchar n=0; //用来控制外部中断

static bit turn; //步进电机转动方向

static bit stop_flag; //步进电机停止标志

static int speedlevel; //步进电机转速参数,数值越大速度越慢,最小值为1,速度最快

static int spcount; //步进电机转速参数计数

void delay(unsigned int endcount); //延时函数,延时为endcount*0.5毫秒

void gorun(); //步进电机控制步进函数

uchar data date[4]; //date数组为存放地址原码,反码,数据原码,反码

char data Test1[]=" ";

#define IR_RE P3_2

void DelayUs(unsigned char us)//delay us

{

unsigned char uscnt;

uscnt=us>>1;/* Crystal frequency in 12MHz*/

while(--uscnt);

}

/*****************************************************/

void DelayMs(unsigned char ms)//delay Ms

{

while(--ms)

{

DelayUs(250);

DelayUs(250);

DelayUs(250);

DelayUs(250);

}

}

void WriteCommand(unsigned char c)

{

DelayMs(5);//short delay before operation

E=0;

RS=0;

RW=0;

_nop_();

E=1;

Data=c;

E=0;

}

/******************************************************/

void WriteData(unsigned char c)

{

DelayMs(5); //short delay before operation

E=0;

RS=1;

RW=0;

_nop_();

E=1;

Data=c;

E=0;

RS=0;

}

/***********http://www.51hei.com单片机原创作品******************/

void ShowChar(unsigned char pos,unsigned char c)

{

unsigned char p;

if (pos>=0x10)

p=pos+0xb0; //是第二行则命令代码高4位为0xc

else

p=pos+0x80; //是第二行则命令代码高4位为0x8

WriteCommand (p);//write command

WriteData (c); //write data

}

/********************************************************/

void ShowString (unsigned char line,char *ptr)

{

unsigned char l,i;

l=line<<4;

for (i=0;i<16;i++)

ShowChar (l++,*(ptr+i));//循环显示16个字符

}

/*******************************************************/

void InitLcd()

{

DelayMs(15);

WriteCommand(0x38); //display mode

WriteCommand(0x38); //display mode

WriteCommand(0x38); //display mode

WriteCommand(0x06); //显示光标移动位置

WriteCommand(0x0c); //显示开及光标设置

WriteCommand(0x01); //显示清屏

}

/*--------------------------延时1ms程子程序-----------------------*/

delay1000()

{

uint i,j;

for(i=0;i<1;i++)

for(j=0;j<124;j++)

;

}

/*---------------------------延时882us子程序-----------------------*/

delay882()

{

uint i,j;

for(i=0;i<1;i++)

for(j=0;j<109;j++)

;

}

/*--------------------------延时2400ms程子程序-----------------------*/

delay2400()

{

uint i,j;

for(i=0;i<3;i++)

for(j=0;j<99;j++)

;

}

void IR_decode()

{

uchar i,j;

while(IR_RE==0);

delay2400();

if(IR_RE==1) //延时2.4ms后如果是高电平则是新码

{

delay2400(); //延时4.8ms避开4.5ms的高电平

for(i=0;i<4;i++)

{

for(j=0;j<8;j++)

{

while(IR_RE==0); //等待地址码第1位高电平到来

delay882(); //延时882ms判断此时引脚电平

///CY=IR_RE;

if(IR_RE==0)

{

date[i]>>=1;

date[i]=date[i]&0x7f;

}

else if(IR_RE==1)

{

delay1000();

date[i]>>=1;

date[i]=date[i]|0x80;

}

} //1位数据接收结束

} //32位二进制码接收结束

}

if (date[2]==0x16)

TR0 = 0;

else if(date[2]==0x14)

{TR0 = 1;

}

else if(date[2]==0x10)

{if (speedlevel>1)

speedlevel--;

else

speedlevel=1;

}

else if(date[2]==0x1A)

{if(speedlevel<5)

speedlevel++;

else

speedlevel=5;

}

else if(date[2]==0x11)

turn=~turn;

[page]

}

void int0() interrupt 0 using 1

{

uint i;

for(i=0;i<4;i++)

{

delay1000();

if(IR_RE==1){k=~k;} //刚开始为4.5ms的引导码,如果4ms内出现高电平则退出解码程序

}

if(k==0)

{

EX0=0; //检测到有效信号关中断,防止干扰

IR_decode(); //如果接收到的是有效信号,则调用解码程序

//解码成功,调用显示程序,显示该键值

}

EX0=1; //开外部中断,允许新的遥控按键

}

void main(void)

{

InitLcd();//

DelayMs(15);

sprintf(Test1,"STEP MOTOR SPEED");//the first line

ShowString(0,Test1);

ShowChar(0x19,\'r\');

ShowChar(0x1a,\'p\');

ShowChar(0x1b,\'m\');

count = 0;

step_index = 0;

spcount = 0;

stop_flag = 0;

P1_0 = 0;

P1_1 = 0;

P1_2 = 0;

P1_3 = 0;

SP=0x60;

EA = 1; //允许CPU中断

TMOD = 0x11; //设定时器0和1为16位模式1

ET0 = 1; //定时器0中断允许

EX0=1;

TH0 = 0xFE;

TL0 = 0x0C; //设定时每隔0.5ms中断一次

TR0 = 1; //开始计数

turn=0;

speedlevel=1;

while(1)

{

if(turn==0)

ShowChar(0x14,\'+\');

else

ShowChar(0x14,\'-\');

if(TR0 ==0)

{

ShowChar(0x15,\'0\');

ShowChar(0x16,\'0\');

ShowChar(0x17,\'0\');

ShowChar(0x18,\'0\');

}

else

{

if(speedlevel==1)

{

ShowChar(0x15,\'3\');

ShowChar(0x16,\'0\');

ShowChar(0x17,\'0\');

ShowChar(0x18,\'0\');

}

else if(speedlevel==2)

{

ShowChar(0x15,\'1\');

ShowChar(0x16,\'5\');

ShowChar(0x17,\'0\');

ShowChar(0x18,\'0\');

}

else if(speedlevel==3)

{

ShowChar(0x15,\'1\');

ShowChar(0x16,\'0\');

ShowChar(0x17,\'0\');

ShowChar(0x18,\'0\');

}

else if(speedlevel==4)

{

ShowChar(0x15,\'0\');

ShowChar(0x16,\'7\');

ShowChar(0x17,\'5\');

ShowChar(0x18,\'0\');

}

else if(speedlevel==5)

{

ShowChar(0x15,\'0\');

ShowChar(0x16,\'6\');

ShowChar(0x17,\'0\');

ShowChar(0x18,\'0\');

}

}

}

}

//定时器0中断处理

void timeint(void) interrupt 1 using 0

{

TH0=0xFE;

TL0=0x0C; //设定时每隔0.5ms中断一次

count++;

spcount--;

if(spcount<=0)

{

spcount = speedlevel;

gorun();

}

}

void delay(unsigned int endcount)

{

count=0;

do{}while(count}

void gorun()

{

if (stop_flag==1)

{

P1_0 = 0;

P1_1 = 0;

P1_2 = 0;

P1_3 = 0;

return;

}

switch(step_index)

{

case 0: //0

P1_0 = 1;

P1_1 = 0;

P1_2 = 0;

P1_3 = 0;

break;

case 1: //0、1

P1_0 = 1;

P1_1 = 1;

P1_2 = 0;

P1_3 = 0;

break;

case 2: //1

P1_0 = 0;

P1_1 = 1;

P1_2 = 0;

P1_3 = 0;

break;

case 3: //1、2

P1_0 = 0;

P1_1 = 1;

P1_2 = 1;

P1_3 = 0;

break;

case 4: //2

P1_0 = 0;

P1_1 = 0;

P1_2 = 1;

P1_3 = 0;

break;

case 5: //2、3

P1_0 = 0;

P1_1 = 0;

P1_2 = 1;

P1_3 = 1;

break;

case 6: //3

P1_0 = 0;

P1_1 = 0;

P1_2 = 0;

P1_3 = 1;

break;

case 7: //3、0

P1_0 = 1;

P1_1 = 0;

P1_2 = 0;

P1_3 = 1;

}

if (turn==0)

{

step_index++;

if (step_index>7)

step_index=0;

}

else

{

step_index--;

if (step_index<0)

step_index=7;

}

}

步进电机红外遥控C语言程序,单片机红外遥控+步进电机+1602液晶显示c语言源程序...相关推荐

  1. 电视摇控器c语言程序,单片机红外电视遥控器C51程序代码

    原标题:单片机红外电视遥控器C51程序代码 //************************************************************** //名称:代码() /*- ...

  2. 振动传感器的c语言程序,单片机红外对射传感器实验详解 附程序源码

    #include #define                            BUF_LENTH              128                            // ...

  3. 单片机发射红外c语言程序,单片机模拟红外发射源程序IR-send

    单片机模拟红外遥控器发射的C语言程序 //********************************************单片机红外发射**************************** ...

  4. C语言 int 转单精度浮点,单精度浮点数与十六进制转换 C语言程序 单片机也可用...

    单精度浮点数与十六进制转换 C语言程序 单片机也可用 #include float Hex_To_Decimal(unsigned char *Byte,int num)//十六进制到浮点数 { // ...

  5. DSB算法C语言程序,单片机中使用DSB温度传感器C语言程序.doc

    单片机中使用DSB温度传感器C语言程序 单片机中使用DS18B20温度传感器C语言程序(参考1) /************************************************** ...

  6. 可运行的C语言程序的拓展名,可运行的c语言程序的扩展名为什么?

    可运行的c语言程序的扩展名为".exe".c语言程序经过"编译程序"编译之后,生成一个后缀为".obj"的二进制文件:然后由"连接 ...

  7. c语言单片机红外报警设计,超级简单单片机红外感应开关DIY设计

    描述 说明: 强光直射和家用电器的红外遥控器的环境中会有干扰,使开关自动跳变,稳定性差.于是这次我重点改进了源程序,加入了强光下.红外遥控器环境下的防干扰算法,让这个红外感应开关非常稳定,不再受任何干 ...

  8. 单片机自动调光C语言,C51单片机控制40w调光电源C语言程序

    C51单片机控制40w调光电源C语言程序,12M晶振,500Hz 2ms,1000Hz 1ms,300Hz 3.3ms,330Hz 3ms .3ms为一个周期,30us中断一次,共可以有100次中断, ...

  9. 好听的歌曲单片机c语言程序,单片机C语言程序举例(三)

    原标题:单片机C语言程序举例(三) 14.音乐播放 //此程序在硬件上调试通过 //本程序的晶振采用11.0592M #include sbit speaker=P1^2; unsigned char ...

最新文章

  1. html中不透明度怎么写,css如何设置div不透明度?
  2. 并发编程-08安全发布对象之发布与逸出
  3. 不使用第三个变量交换两个变量的值
  4. Oracle on Azure
  5. PyTorch 和 Tensorflow 学哪个?上手简单的PyTorch考虑一下!
  6. 【Python】while循环实现用户登录的三次机会
  7. Java中的瞬态关键字及其使用
  8. C++ — 智能指针的简单实现以及循环引用问题
  9. java 对象工厂_Java设计模式之--工厂方式
  10. 技术女性的是是非非(2)
  11. ASCII中关于大小写字母间隔为32的思考
  12. Centos 6.8 为自己打造Linux小系统
  13. java easyui 模板_漂亮easyui皮肤组件html模板下载A 最新 最全
  14. jquery消息插件 toastr 消息提示插件 弹框提示
  15. 如何用计算机考核教学设计,计算机一级教案
  16. GL/gl.h: No such file or directory
  17. python 文件缓存
  18. 微软发布支持Linux的SQL Server
  19. 【限时】21天学习挑战赛 - 经典算法
  20. python代码编写工具_编写更好的Python代码的终极指南

热门文章

  1. luogu P3379 【模板】最近公共祖先(LCA)
  2. Ants UVA - 1411(km板题竟然让我换了个板子)
  3. C#中的快捷键,可以更方便的编写代码
  4. 安全测试中常见的术语
  5. 八大排序算法的java实现
  6. Win10系列:JavaScript图形
  7. Numpy基础学习与总结
  8. php中json_encode中文编码问题分析
  9. poj 3038 Children of the Candy Corn bfs dfs
  10. 批量Excel数据导入Oracle数据库