求助!51单片机和上位机通讯
小弟初学单片机,前几天做了个设计。让一个红外传感器信号输出线接在STC单片机的P0.2口,当传感器感应到人时,便输出信号给单片机,单片机通过串口给上位机(计算机)发信号。程序如下,可就是不对,请各位大哥大姐帮忙看看。传感器
#include<reg52.h>
#include<intrins.h>
sfr ISP_CONTR=0xe7;
sbit D0=P0^1;
void Uart_timer1_init() 串口初始化,这一块是对的,我确信。
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
////////////////////////////////
void Uart_init()interrupt 4 串口中断
{
unsigned char Write_C=0;
if(RI)
{
RI=0;
Write_C=SBUF;
if(Write_C==0xc3) ISP_CONTR=0X60;
}
if(TI)
{
TI=0;
}
}
/**************************************************/
void main()
{
Uart_timer1_init();
if(D0==0)SBUF=0X0A;
}
[最优解释]
把传感器去掉,直接在P0^1接5V和0V电压试试,先确定是那一边的问题
[其他解释]
while(1)
{
int i;
if(D1==0)
{
D2=0;
for(i = 0; i < 0xffff; =+i)asm("nop");
D2 = 1;
write();//给串口发数据
}
}
传感器的数据采集看的接的引脚的设置,数字的还是模拟的,看看手册怎么写的
[其他解释]
NPN输出的光电传感器需要加上拉电阻,在传感器输出端到VCC加一个10K左右电阻试试
[其他解释]
void main()
{
Uart_timer1_init();
while (1){
if(D0==0)SBUF=0X0A;
............
}
}
/* 记得你的main()一定要写成一个循环...... */
[其他解释]
用万用表测下传感器输出的电平信号是否正常
[其他解释]
if(D0==0)SBUF=0X0A;//这是对的
else SBUF=0x41;//'A';这也应该对
[其他解释]
while(1)
{
if(D1==0)D2=0;
}
这个是一个死循环啊!
一旦D1==0,那么你的D2就一直为0.
那么一直为0,你的蜂鸣器会一直响的了!
在这个问题上建议你写一个D0的置1的程序!
或者一个延时控制程序!
[其他解释]
把错误说出来
[其他解释]
我不连传感器,直接给P0.1口低电平,用串口调试助手就能收到单片机发来的信号0A,但接上传感器就不行了,谢谢大哥,我的程序有什么毛病吗
[其他解释]
单片机P3.7口接的是蜂鸣器,P0.1口接传感器,当传感器感应到人时,蜂鸣器响了,可就是像上位机通信那块不行
#include<reg52.h>
sbit D1=P0^1;
sbit D2=P3^7;
void main()
{
while(1)
{
if(D1==0)D2=0;
}
}
[其他解释]
传感器感应到人时输出低电平,大致在-3.7到-6V之间,通电没人时在3.2到5.4V之间,没通电时差不多为零,输入信号电压十五伏左右,怎么采集啊?就写if(D0==0)....吗?
单片机P3.7口接的是蜂鸣器,P0.1口接传感器,
#include<reg52.h>
sbit D1=P0^1;
sbit D2=P3^7;
void main()
{
while(1)
{
if(D1==0)D2=0;
}
}
上面程序是错的,把程序下到单片机后,再给传感器上电,蜂鸣器就响了,要是先给传感器上电,再给单片机上电,他又不响了,但你给传感器断电,他也响,怎么办啊,各位大哥?帮帮小弟我刚学啊
[其他解释]
更正:
unsigned int i;
for(i = 0; i < 0xffff; ++i)asm("nop");//延时
[其他解释]
没有数据手册,型号是GY10-W3-3E1,是直接连吗?需要对他的输出信号进行处理吗?
[其他解释]
我测了一下,加5v电压,没人时传感器输出电平是3.65v,有人时是0.77V,信号线直接接到单片机的P0.1口,用万用表的红表笔接信号线,黑表笔接5v电源负端,应该是那样测的,传感器有正、负电源线,信号线,输出为NPN,运行下面程序不行啊,有人时蜂鸣器也不响
#include<reg52.h>
sbit D1=P0^1;
sbit D2=P3^7; 接蜂鸣器
void main()
{
while(1)
{
int i;
if(D1==0)
{
D2=0;
for(i = 0; i < 0xffff; ++i)asm("nop");
D2 = 1;
write();//给串口发数据
}
}
}
[其他解释]
我用的单片机是STC89C52,开发板上在P0口接有1G的排阻,可以吗
[其他解释]
1G的排阻??
[其他解释]
1K的,错了
[其他解释]
手册到网上可以下,你的信号采集看来很有问题,对P0.1的设置好好看看
ps:手册的学习的重要资料,你居然没有
[其他解释]
wuhulove大哥,你还在么?
[其他解释]
谢谢了,我的设计做出来了,真的非常感谢。
[其他解释]
小弟现在也正在做这个设计,不太会啊,帮忙带一把