PC机向单片机送数"11-20"在其数码管上显示出来? 求单片机C语言编程程序

PC机向单片机送数"11-20"在其数码管上显示出来? 求单片机C语言编程程序,第1张

没现在的程序,但这个不难,给个思路,照写就行,先要认清PC的串口发送数字时,0是0X30是0X31 所以你在单片机的串口接收数据中,得到的要 -48 再去送显示 PC可送任何位数的数字,方法很多,如果你要用单片机的串口来计算接收到多少位,也行,如果你自定协议,在PC送的时候,加开头特定字符和一共多少位数,这样单片机收的时候,就直接读到位数,至于数码管的显示,只不过是扫描的方法而已

uchar
idata
SystemBuf[10];
//用于接收
uchar
Rx=0;
//
接收数据
条数
uchar
code
AT[]="YES,IT
IS";
void
UART_init
(void)
{
TMOD=0x20;
//用定时器1
PCON=0x00;
//
波特率
不加倍
SCON=0x50;
//串行方式1
TH1=0xFD;
//9600
TL1=0xFD;
//
EA=1;
//
ES=1;
//
TR1
=1;
}
void
sendchar(uchar
ch)
//串口送一个字节
{
SBUF=ch;
while(TI==0);
TI=0;
}
void
sendstring(uchar
p)
//送字符串
{
while(p)
{
sendchar(p);
p++;
}
}
///////
void
receive(void)
interrupt
4
using
1
//中断
{
if(RI)
{
if(Rx<10)
//这儿最多收10个字节
{
SystemBuf[Rx]=SBUF;
Rx++;
}
RI=0;
}
}
///
void
main()
{
uchar
i;
UART_init();
while(1)
{
if(SystemBuf=='S')
{
sendstring(AT);
for(i=0;i<10;i++)
//接收清0
{
SystemBuf[i]=0;
}
Rx=0;
}
}
}
//////////如有小错误,自己调下,手打的,大小写可能不正常,这是标准程序,直接用,

#include<reg51h>
#define uchar unsigned char
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//0-9
uchar scanled=0,time=0,i=0,err=0;
uchar disdat[6]={'A','B','C','D','E','F'};
uchar recive[6];
bit flag=0;
void t0isr() interrupt 1 //显示
{
TH0=0xec;
TL0=0x78;
switch(scanled)
{
case 0:
P2=~0x01;
if(err==1)P0=ledtab[0x10];
else
P0=ledtab[disdat[5]-'A'+10];
break;
case 1:
P2=~0x02;
if(err==1)P0=ledtab[0x10];
else
P0=ledtab[disdat[4]-'A'+10];
break;
case 2:
P2=~0x04;
if(err==1)P0=ledtab[0x10];
else
P0=ledtab[disdat[3]-'A'+10];
break;
case 3:
P2=~0x08;
if(err==1)P0=ledtab[0x10];
else
P0=ledtab[disdat[2]-'A'+10];
break;
case 4:
P2=~0x10;
if(err==1)P0=ledtab[0x10];
else
P0=ledtab[disdat[1]-'A'+10];
break;
case 5:
P2=~0x20;
if(err==1)P0=ledtab[0x10];
else
P0=ledtab[disdat[0]-'A'+10];
break;
default:break;
}
scanled++;
scanled%=6;
}
void uart() interrupt 4
{
if(RI)
{
RI=0;
disdat[i]=SBUF;
i++;
i%=6;
if(i==0)flag=1;
}
}
main()
{
uchar num=0;
TMOD=0x21;
TH1=0xf3;
TL1=0xf3
TH0=0xec;
TL0=0x78;
SCON=0x50;
EA=1;
ES=1;
TR1=1;
TR0=1;
ET0=1;
while(1)
{
if(flag==1)
{
flag=0;
err=0;
for(num=0;num<6;num++){if(recive[num]!=disdat[num])err=1;}
if(err==0)
{
SBUF='O';while(!TI);TI=0;
SBUF='K';while(!TI);TI=0;
}
}
}
}

如果液晶能直接显示ASCII码的啊,比如上位机向单片机传送‘HELLO’字符串,这就是ASCII码组成的,即直接送到液晶上显示即可。
但是有的液晶不能直接显示,那就把ASCII码对应的字模送到屏幕上显示了。

不是很理解为什么你的
send_data();
redata_data();
这两个函数都有发送的
串口中断照你这样写可能会出现问题如果有RI中断,但是a>string_max就会直接退出中断函数,这样并不会将RI标志清0,建议分开写
void serial() interrupt 4
{
if(RI)
{
RI=0;
if(a<=string_max)
{
redata[a++]=SBUF;
if(redata[a]=='\0'||(a>=string_max-1))
{
a = 0; //这里a要清零
flag=1;
}
}
}
}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13214522.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-21
下一篇 2023-06-21

发表评论

登录后才能评论

评论列表(0条)

保存