本人用51单片机制作了一辆红外遥控车,遇到了一个问题,我的程序在学习板上能正常控制小车的电机转动,
看一下:
IO口接线顺序一样吗?
晶振频率对吗?
最小系统板的P0口有上拉电阻吗?
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit lcden = P2^7;
sbit lcdrs = P2^6;
sbit lcdwr = P2^5;
sbit IR = P3^2;
uchar IRCOM[6];//数组,用于存储红外编码
uchar code table1[] = "remote control";
uchar code table2[] = "CODE:";
void delayms(uchar x)// 延时x*0.14ms
{
uchar i;
while(x--)
for(i=0;i<13;i++){}
}
void delay(uchar x)//延时xms
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
/****************************LCD部分***********************************************/
void write_com(uchar com)
{
lcden = 0;
lcdrs = 0;
lcdwr = 0;
P0 = com;
delay(5);
lcden = 1;
delay(5);
lcden = 0;//别忘了lcden拉低
}
void write_date(uchar date)
{
lcden = 0;
lcdrs = 1;
lcdwr = 0;
P0 = date;
delay(5);
lcden = 1;
delay(5);
lcden = 0;
}
void lcd_init(void)
{
lcden = 0;
lcdrs = 0;
lcdwr = 0;
delay(5);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
/*****************main()************************/
void main(void)
{
uchar count=0;
IR = 1;
lcd_init();
write_com(0x80);
while(table1[count]!='\0')
{
write_date(table1[count]);
count++;
delay(5);
}
count = 0;
write_com(0x80+0x40);
while(table2[count]!='\0')
{
write_date(table2[count]);
count++;
delay(5);
}
IE = 0x81; //开中断
TCON = 0x01;//脉冲负边沿触发
while(1);
}
/*********************红外中断**************************/
void IR_time() interrupt 0
{
uchar i,j,TimeNum=0;//TimeNum用来计IR高电平次数 从而判断是0还是1
EX0 = 0; //关闭中断
delayms(5);
if(1 == IR)
{
EX0 = 1;
return;
}
while(!IR) //跳过9ms前导低电平
delayms(1);
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(IR) //跳过4.5ms的前导高电平
delayms(1);
while(!IR) //跳过0.56ms的低电平
delayms(1);
while(IR)
{
TimeNum++; //计时高电平时间从而判断读取的是0还是1
delayms(1);
}
if(TimeNum>=30)//按键按下时间过长 跳过
{
EX0 = 1;
return;
}
IRCOM[i] = IRCOM[i]>>1;
if(TimeNum >= 8) //8*0.14ms 这时读取的是1;
{
IRCOM[i] = IRCOM[i]|0x80;
}
TimeNum = 0;
}
}
if(IRCOM[2]!=~IRCOM[3])//判断八位数据和八位数据反码是否相等
{
EX0 = 1;
return;
}
IRCOM[4] = IRCOM[2]&0x0f;//取低四位
IRCOM[5] = IRCOM[2]>>4; //IRCOM[5]取IRCOM[2]高四位
if(IRCOM[4] > 9) //转换成字符
{
IRCOM[4] = IRCOM[4] + 0x37;
}
else
IRCOM[4] = IRCOM[4] + 0x30;
if(IRCOM[5] > 9)
{
IRCOM[5] = IRCOM[5] + 0x37;
}
else
IRCOM[5] = IRCOM[5] + 0x30;
delay(5);
write_com(0x80 + 0x40 + 5);
write_date(IRCOM[5]);
write_date(IRCOM[4]);
EX0 = 1; //重新开启外部中断
}
你用最小系统时,电机是怎么供电的,与学习板一样吗,有ULN2003吗,单片机肯定是不能直接控制电机的,必须有电路,要么用ULN2003,要么用三极管。
你的51最小系统通过什么电路来控制电机?
你有没有共地啊
答:关注 展开全部 这个是自己搭电路 然后用红外接收管,利用外部中断计数器的管脚,才捕捉到的脉冲,在进行软件内部的解码解调,这个你安照这个思路就可以哈 自己努力想,才能学会51单片机,而且51是最基础的,还是你自己做出来为好 本回答被网友采纳 已赞过 已踩过< 你对这个回答的评价是? 评论 收起 ...
答:我只做过6121编解码的,但并没有实物调试发送和接收(两机同时)程序,手里只有一块板子,因此不能验证,但用的是一个电视机的万能遥控,单片机接收并显示且执行相应功能没问题。发送部分仅做过仿真(Proteus),不知道符合要求否?270531131@QQ.com!图片为仿真时的波形,有仿真文件及原码(C51)!!知...
答:bit NewIRcode=0; //指示当处理完了32位码后,就有了新的遥控码 bit DataRight=0; //为1时读取数据正确 bit bSampleOk;bit bSampling;bit b10msInt;bit b1msInt;bit bKeySound;bit b1msMain;bit IR_E; //表示有新的遥控键控下就更新扫描数据 bit b3msint;void SendDataToDisp...
答:一个89C51,一个三极管8050,一个红外发射管,很容易的。
答:线路连接问题。51单片机红外遥控小车是一个比较经典的51单片机项目,适合用来作为新手的毕业项目,红外扫不出很大问题是线路的连接问题导致的,重新将线路连接一遍即可恢复。51单片机红外遥控小车这个项目考察的比较综合,需要反复进行调试才可以保证这个遥控小车不出问题。
答:sbit IR_OUT = P3^2;unsigned char SigInfo[4];//存储红外按键编码,SigInfo[2]为按键值void Cmd_Require(void);void INT_Ext0() interrupt 1 //外部中断0{ u8 i, j; u16 time = 8000; EA = 0; for (i=0; i<10; i++) { delay0_7ms (); if (IR_OUT)...
答:下面是一个对51ISP编程实验开发板配套的红外线遥控器的解码程序,它可以把红外遥控器每一个按键的键值读出来,并且通过实验板上P1口的8个LED显示出来,在解码成功的同时并且能发出“嘀嘀嘀”的提示音。ORG 0000H AJMP MAIN;转入主程序 ORG 0003H ;外部中断P3.2脚INT0入口地址 AJMP INT ;转入外部...
答:实物 原理图 include <reg52.h>#include <intrins.h>sbit relay = P3^7;sbit relay1 = P1^2;bit test_bit,send_bit;unsigned char test,data_1;unsigned char data_H[16]={0};unsigned char code data_c[5]={0x34,0x0f,0x10,0x10,0x10};void delay2s(void) //误差 0us{ ...
答:发送1的时候38K不工作,发送0的时候直接输出38K。
答:你注意看 temp = temp & 0x7F ,以及 temp = temp | 0x80。这是常用的位运算,前者是把 temp 的最高位清零,后者是把它的最高位置 1。但均保留其它位不变。变量初始化的时候,temp 应该写成 unsigned char temp=0; 它的程序规范性差了些。循环右移,是因为数据串行发送的时候,低位在前,...