用c++写的程序向单片机发送坐标(x,y)都是4位,怎么在8位数码管上显示坐标? 50

急用单片机上的程序,x坐标在前y坐标在后刚好占满8位数码管。如果可以把c++里面向单片机发送坐标数据的代码也给我吧,谢谢,最佳答案追加30分。51单片机,vc6.0,用串... 急用单片机上的程序,x坐标在前y坐标在后刚好占满8位数码管。如果可以把c++里面向单片机发送坐标数据的代码也给我吧,谢谢,最佳答案追加30分。
51单片机,vc6.0, 用串口通信
展开
 我来答
rjsvu7862
2011-05-11 · TA获得超过476个赞
知道答主
回答量:410
采纳率:100%
帮助的人:257万
展开全部
楼主你在时序上有些错误
1。在转换时没有留够足够的转换时间。根据DS18B20芯片手册,9位精度转换时间为93.75ms。12位精度转换时间为750ms。而DS18B20默认为12位精度。所以我加了750ms延时
2。在写函数的时候
void ds18b20_write_byte(uchar date) //写一个字节
{
uchar i;
for(i=0;i<8;i++) //一个字节八位
{
if((date&&0x01)==1) //写入1
{
ds18b20=0;
delay_15us();
ds18b20=1;
}
else //写入0
{
ds18b20=0;
delay_60us();
ds18b20=1;
}
date>>=1; //右移一位
}
}

应该是if((dat&0x01)==0x01)这里多了一个&号,导致结果错误。
3。我增加了用1602显示的模块,删除了用液晶显示的模块。

/**********************************
以下是程序,并附上仿真图一张
**********************************/

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

uchar temp,tmph,tmpl;

sbit ds18b20=P2^3;

sbit rw=P2^6;
sbit lcde=P2^7;
sbit rs=P2^5;
//下面是1602的驱动程序
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);

}
void write_com(uchar com,bit i) //是命令写0 数据写1
{
rs=i;
P0=com;
delay(5);
lcde=1;
delay(5);
lcde=0;

}
void lcd1602init(void)
{
rw=0;
write_com(0x01,0);
write_com(0x02,0);
write_com(0x06,0);
write_com(0x0c,0);
write_com(0x38,0);

}
void display(uchar x,uchar y,uchar date)
{
x&=0x01;
y&=0x0f;
if(x)
{
y+=0x40;
}
y+=0x80;
write_com(y,0);
write_com(date,1);

}

void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}

/////////////////////////////////////////////////////////
/////DS18B20部分////////////
///////////////////////////

//延时部分
void delay_600us(void)
{
uchar i;
for(i=0;i<180;i++);
}//延时600us

void delay_400us(void)
{
uchar i;
for(i=0;i<120;i++);
}

void delay_60us(void)
{
uchar i;
for(i=0;i<18;i++);
}//延时60us

void delay_15us(void)
{
uchar i;
for(i=0;i<3;i++);
}//延时15us

//复位脉冲
bit resetpulse(void)
{
ds18b20=0;
delay_600us();
ds18b20=1;
delay_60us();
return ds18b20;
}

//ds18b20初始化
void ds18b20_init(void)
{
while(1)
{
if(!resetpulse()) //收到ds18b20的低电平信号
{
ds18b20=1;
delay_400us();
break;
}
else
resetpulse(); //继续发送复位信号
}
}

void ds18b20_write_byte(uchar date) //写一个字节
{
uchar i;
for(i=0;i<8;i++) //一个字节八位
{
// if((date&&0x01)==1) //写入1

//这里错了
if((date&0x01)==0x01)
{
ds18b20=0;
_nop_();
ds18b20=1;
delay_60us();
} //end if
else //写入0
{
ds18b20=0;
delay_60us();
ds18b20=1;
} //end else
delay_15us();
date>>=1; //右移一位
}
}

uchar ds18b20_read_byte(void) //读一个字节
{
uchar i,u;
for(i=0;i<8;i++)
{

u>>=1;
ds18b20=0;
_nop_();
//释放总线
ds18b20=1;
_nop_();
_nop_();
if(ds18b20==1) //读1
{
u|=0x80;

}
else
{ u=u&0x7f; //读0

}
delay_60us();

}
return u;
}

uchar read_temperaturn()
{
ds18b20_init(); //初始化;
ds18b20_write_byte(0xcc); //跳过ram;
ds18b20_write_byte(0x44); //启动温度测量 当为高电平时转换完成
delayms(750); //转换时间要求

ds18b20_init(); //初始化;
ds18b20_write_byte(0xcc); //跳过ram;
ds18b20_write_byte(0xbe); //采集温度
delayms(750);
tmpl=ds18b20_read_byte(); //低位温度数据
tmph=ds18b20_read_byte(); //高位温度数据

tmph<<=4; //左移4位
tmph+=(tmpl&0xf0)>>4;
return(tmph);
}

void main()
{
uchar temph=0;
uchar templ=0;
lcd1602init();
while(1)
{ temp=read_temperaturn();

temph=temp/10+'0';
templ=temp%10+'0';
delayms(20);
display(0,0,temph);
display(0,1,templ);

}
}
谢应宸
2011-05-25 · TA获得超过2640个赞
知道大有可为答主
回答量:2731
采纳率:66%
帮助的人:2149万
展开全部
vc程序你去搜一个串口类用一下,很多封装好了的类,用起来非常方便,只需要初始化一下即可
51单片机的串口程序也非常多,先将两者通讯搞通

然后坐标的数字每个数字对应一个数码管,建立一个10元素的数组,分别表示0-9,然后根据传入的数字分别点亮即可

参考资料: assInputUsername0

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式