找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求红外遥控电动机转速系统设计

[复制链接]
跳转到指定楼层
楼主
通过红外遥控器的按键不同,实现步进电机的启动,停住,正转,反转,快转,慢转动作,附上清晰的仿真图和C语言程序,急用,请大神帮忙!!单片机最好是  AT89C51

QQ图片20150607170134.jpg (88.4 KB, 下载次数: 78)

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

使用道具 举报

沙发
ID:35471 发表于 2015-6-7 20:35 | 只看该作者
//红外遥控解码,控制电机Pwm调速
#include<reg52.h>
#include<51hei.h>
#define uint unsigned int
#define uchar unsigned char
uchar code char1[]="KeyValue:";
uchar code char2[]="PWM:";
uchar key_code[2];
sbit lcdrs=P3^5;
sbit lcdrw=P2^7;
sbit lcden=P3^4;
sbit ir=P3^3;
sbit motor0=P1^0;
sbit motor1=P1^1;
uchar key_value,time;
char pwm_num;
//延时函数
//普通延时函数
void delay(uint t){
        uchar i;
        for(;t>0;t--)
                for(i=0;i<110;i++);
}
//红外延时函数
void delay8900us(){
        TH0=0xdf;
        TL0=0xf6;
        TR0=1;
        while(!TF0);
        TF0=0;
        TR0=0;
}
void delay4500us(){
        TH0=0xef;
        TL0=0xcd;
        TR0=1;
        while(!TF0);
        TF0=0;
        TR0=0;       
}
void delay600us(){
        TH0=0xfd;
        TL0=0xd7;
        TR0=1;
        while(!TF0);
        TF0=0;
        TR0=0;
}
//***********************lcd控制代码*********************
//lcd总线初始化
void init_lcd_bus(){
        lcdrw=0;
        lcden=0;
}
//lcd写命令
void lcdw_cmd(uchar cmd){
        lcdrs=0;
        P0=cmd;
        lcden=1;
        delay(5);
        lcden=0;
}
//lcd写数据
void lcdw_data(uchar dat){
        lcdrs=1;
        P0=dat;
        lcden=1;
        delay(5);
        lcden=0;
}
//lcd显示模式设置
void lcd_show_mode(){
        lcdw_cmd(0x38);
        lcdw_cmd(0x0c);
        lcdw_cmd(0x06);
        lcdw_cmd(0x01);
}
//lcd在指定位置显示指定数据
void lcd_display(uchar addr,uchar dat){
        uchar ge,shi;
        ge=dat%10;
        shi=dat/10;
        lcdw_cmd(0x80+addr);
        lcdw_data(0x30+shi);
        lcdw_data(0x30+ge);
}
//显示提示语
void lcd_init_show(){
        uchar i;
        lcdw_cmd(0x80);
        for(i=0;i<9;i++)
                lcdw_data(char1[i]);
        lcdw_cmd(0x80+0x40);
        for(i=0;i<4;i++)
                lcdw_data(char2[i]);
        lcdw_cmd(0x80+0x40+7);
        lcdw_data('%');
}
//显示pwm占空比
void lcd_show_pwm(char dat){
        uchar ge,shi,bai;
        ge=dat%10;
        shi=dat%100/10;
        bai=dat/100;
        lcdw_cmd(0x80+0x40+4);
        lcdw_data(0x30+bai);
        lcdw_data(0x30+shi);
        lcdw_data(0x30+ge);
}
//**********************红外遥控解码***********************
uchar get_code(){
        uchar i,dat;
        for(i=0;i<8;i++){
                dat>>=1;
                while(!ir);
                delay600us();
                if(ir==1){
                        dat|=0x80;
                        while(ir);
                }
        }
        return dat;
}
//*************************直流电机控制代码*****************
void zheng(){
        motor0=0;
        motor1=1;
        if(time>=100)
                time=0;
        if(time>=pwm_num)
                motor1=0;
}
void fan(){
        motor0=1;
        motor1=0;
        if(time>=100)
                time=0;
        if(time>=pwm_num)
                motor0=0;
}
void stop(){
        motor0=0;
        motor1=0;
}
void pwm(){
        switch(key_value){
                case 1:
                        key_code[0]=1;
                        break;
                case 2:
                        key_code[0]=2;
                        break;
                case 5:
                        key_code[1]=3;
                        break;
                case 6:
                        key_code[1]=4;
                        break;
                default :
                        key_code[0]=0;
                        break;
        }
        if(key_code[0]==1){
                zheng();
                //key_code[0]=0;
                if(key_code[1]==3){
                        key_value=1;
                        key_code[1]=5;
                        pwm_num-=5;
                        if(pwm_num<=0)
                                pwm_num=0;
                }
                else if(key_code[1]==4){
                        key_value=1;
                        key_code[1]=5;
                        pwm_num+=5;
                        if(pwm_num>=100)
                                pwm_num=100;
                }
        }
        else if(key_code[0]==2){
                fan();
                //key_code[1]=0;
                if(key_code[1]==3){
                        key_value=2;
                        key_code[1]=5;
                        pwm_num-=5;
                        if(pwm_num<=0)
                                pwm_num=0;
                }
                else if(key_code[1]==4){
                        key_value=2;
                        key_code[1]=5;
                        pwm_num+=5;
                        if(pwm_num>=100)
                                pwm_num=100;
                }
        }
        else{
                stop();
        }
}


//外部中断初始化及定时器0初始化
void init_other(){
        ir=1;
        TMOD=0x11;
        TH1=0xfc;
        TL1=0x66;
        TR1=1;
        ET1=1;
        EX1=1;
        IT1=1;
        EA=1;
       
        motor0=0;
        motor1=1;
        pwm_num=50;
}

//总初始化
void init(){
        guandz();
        guanled();
        init_other();
        init_lcd_bus();
        lcd_show_mode();
        lcd_init_show();
}
//主函数
void main(){
        init();
        while(1){
                lcd_display(9,key_value);
                lcd_show_pwm(pwm_num);
                pwm();
        }
}
//红外中断函数
void inter1() interrupt 2
{
        uchar code1,code2,code3,code4;
        EA=0;
        delay8900us();
        if(ir){
                EA=1;
                return;
        }
        while(!ir);
        delay4500us();
        if(ir){
                EA=1;
                return;
        }
        //while(ir);
        code1=get_code();
        code2=get_code();
        code3=get_code();
        code4=get_code();
       
        while(!ir);
        if(code3!=~code4){
                key_value=99;
                EA=1;
                return;
        }
        key_value=code3;
        EA=1;
}
//定时器1中断函数
void timer1() interrupt 3
{
        TH1=0xfc;
        TL1=0x66;
        time++;
}



































评分

参与人数 1威望 +50 黑币 +50 收起 理由
admin + 50 + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:82613 发表于 2015-6-10 13:02 | 只看该作者
路过帮顶~~楼上回答的不错。。。。。。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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