自学单片机3个月,我的第一个单片机作品无线串口控制小车......

2020-02-04 09:03发布


(原文件名:IMG0364A.jpg)


(原文件名:IMG0365A.jpg)


(原文件名:1111.jpg)
原理很简单,就是VC写的串口程序,向单片机发数据,单片机接到数据再用红外发射出去,小车接收到红外数据后拖动电机。大二的时候学校开过课,但是一学期下来流水灯都不会。我是自学的,没有任何老师指导,有问题都是自己想或是网上解决的,所以想告诉大家自学单片机是完全可以学出来的。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
59条回答
6liang
1楼-- · 2020-02-04 23:44
当自强,菜鸟飞过深有体会
hometongsina
2楼-- · 2020-02-05 03:03
源码啊……

学习下……
zgzjwzcn07
3楼-- · 2020-02-05 06:48
 精彩回答 2  元偷偷看……
freestylehll
4楼-- · 2020-02-05 08:41
红外发射模块
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char       
uchar tabledu[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x00,0xC6,0x40,0x86,0x8E};
uchar tablewe[]={0xfd,0xfe};
sbit led=P1^1;
sbit out=P1^0;
void display(uchar a);
void delay(uchar aa);
void delay_xianshi();
void delayms(uchar aa);//延时程序
void khz(uchar aa);//是发射38KHZ的程序
void chuankouinit();
void fasong(uchar num);
uchar flag;      //发送标志位
uchar i,a,num1;
uchar sbuf;
void main()
{
        chuankouinit();
        while(1)
        {
        display(sbuf);
        if(flag)
        {
        ES=0;
        SBUF=sbuf;
        while(!TI);
        TI=0;
        ES=1;
        flag=0;
        }
        }
}
void delay_xianshi()
{
uchar aa=50;
while(aa--);
}
void display(uchar a)
{
P2=tablewe[1];
P0=tabledu[a/16];
delay_xianshi();
P0=0xff;
P2=tablewe[0];
P0=tabledu[a%16];
delay_xianshi();
P0=0xff;
}
void delay(uchar aa)
{
        uchar bb,cc;
        for(bb=aa;bb>0;bb--)
                for(cc=200;cc>0;cc--);
}
void chuankou() interrupt 4
{
flag=1;
sbuf=SBUF;
fasong(sbuf);
RI=0;
led=0;
delay(200);
led=1;
delay(200);
led=0;
delay(200);
led=1;       
}
void chuankouinit()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SM0=0;
SM1=1;
REN=1;
ES=1;
EA=1;
}
void delayms(uchar aa)
{
for(a=aa;a>0;a--)
        {
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
        }
}
void khz(uchar aa)//是发射38KHZ的程序
{
        for(a=aa;a>0;a--)   //这个for语句可以得到准确的26.3波特率
                {
                        out=0;
                        i=7;                //低了17us
                        while(i>0)i--;                //   38kHZ  
                        out=1;
                                //高了9us      17+9=26us   比26.3快一点点
                }
}
void fasong(uchar num)
{
        khz(116);//发射3ms 38khz
        delayms(125);        //2ms
        for(num1=8;num1>0;num1--) //原来用的是a  后来出错,肯定在这里!
        {
                khz(40);        //1ms
                if(num&0x01)
                        {
                        delayms(93);//delay 1.5ms
                        delayms(93);//delay 1.5ms
                        }
                else
                        {
                        delayms(65);//delay 1ms
                        }
                num=num>>1;
        }
        khz(20);

}
freestylehll
5楼-- · 2020-02-05 12:48
小车程序
#include <reg52.h>
#define uchar unsigned char
uchar tablewe[]={0xf1,0xf2,0xf4,0xf8};                   //P2
uchar tabledu[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x00,0xC6,0x40,0x86,0x8E};                   //P1
sbit ina=P0^0;
sbit inb=P0^1;
sbit inc=P0^2;
sbit ind=P0^3;
void time1init();
void int1init();
void irpros();
void irwork();
void jieshou();
void delay();
void display();
void work();
uchar ircode;
uchar irdata[9];
uchar disp[2];
uchar irrecvok;
uchar irprosok;
uchar start_flag;
uchar bitnum;
uchar irtime;
void main()
{
time1init();
int1init();
while(1)
{
jieshou();
display();
work();
}
}
void time1init()
{
TMOD=0x20;
TH1=0;
TL1=0;
TR1=1;
ET1=1;
EA=1;
}
void int1init()
{
IT1=1;
EX1=1;
EA=1;
}
void time1() interrupt 3
{
        irtime++;       
}
void int1() interrupt 2
{
        if(start_flag)
        {
                 if(irtime>18)
                 {
                         irdata[0]=irtime;
                        bitnum=1;
                        irtime=0;
                 }
                 else
                 {
                         irdata[bitnum]=irtime;
                        irtime=0;
                         bitnum++;
                        if(bitnum==9)
                        {
                                bitnum=0;
                                start_flag=0;
                                irrecvok=1;
                        }
                 
                 }
        }
        else
        {
                start_flag=1;
                irtime=0;
        }
}
void irpros()
{
uchar i,k;
uchar value;
k=1;

for(i=0;i<8;i++)
{
        value>>=1;
        if(irdata[k]>14)
        {
                value|=0x80;
        }
        k++;
}
ircode=value;
irprosok=1;
}
void irwork()
{
disp[0]=ircode/16;
disp[1]=ircode%16;
}
void delay()
{
uchar a=50;
while(a--);
}
void display()
{
P2=tablewe[0];
P1=tabledu[disp[0]];
delay();
P1=0xff;
P2=tablewe[1];
P1=tabledu[disp[1]];
delay();
P1=0xff;
P2=tablewe[2];
P1=tabledu[0];
delay();
P1=0xff;
P2=tablewe[3];
P1=tabledu[0];
delay();
P1=0xff;
}
void jieshou()
{
        if(irrecvok)
        {
        irrecvok=0;
        irpros();
        }
        if(irprosok)
        {
        irprosok=0;
        irwork();
        }
}
void work()
{
if(disp[0]==7&&disp[1]==15)                                 //左
{
        ina=0;
        inb=1;
        inc=1;
        ind=0;
}
if(disp[0]==11&&disp[1]==15)                          //右
{
                ina=1;
        inb=0;
        inc=0;
        ind=1;
}
if(disp[0]==13&&disp[1]==15)                         //前进
{
                 ina=1;
        inb=0;
        inc=1;
        ind=0;
}
if(disp[0]==14&&disp[1]==15)                         //后退
{
                 ina=0;
        inb=1;
        inc=0;
        ind=1;
}
if(disp[0]==15&&disp[1]==7)                                 //停止
{
                  ina=1;
        inb=1;
        inc=1;
        ind=1;
}
}
freestylehll
6楼-- · 2020-02-05 15:51
红外发射部分的原理图

(原文件名:红外发射器.jpg)

一周热门 更多>