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

2020-02-04 09:03发布


(原文件名:IMG0364A.jpg)


(原文件名:IMG0365A.jpg)


(原文件名:1111.jpg)
原理很简单,就是VC写的串口程序,向单片机发数据,单片机接到数据再用红外发射出去,小车接收到红外数据后拖动电机。大二的时候学校开过课,但是一学期下来流水灯都不会。我是自学的,没有任何老师指导,有问题都是自己想或是网上解决的,所以想告诉大家自学单片机是完全可以学出来的。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
60条回答
freestylehll
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);

}

一周热门 更多>