求单片机(AT89S52)C程序,实现功能:串口调试软件发送一个数字(0-9),在数码管上显示该数字

求单片机(AT89S52)C程序,实现功能:串口调试软件发送一个数字(0-9),在数码管上显示该数字(共阳数码管接P0口),晶振11.0592M,串口调试软件为串口调试助手V2.2

这个跟硬件是联系的,看看单片机视频教程,基本四五天也就搞定了。推荐郭天祥《十天学会单片机及c语言编程》,讲的不错追问

这个程序只需要我提供的硬件参数,本人有点懒,不想自己写。。。。。

追答

#include
#include
unsigned char tmp;
unsigned char code LED_tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
void send_char(unsigned char txd);
main()
{
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;

SCON = 0x50; // 设定串行口工作方式
PCON &= 0xef; // 波特率不倍增

TR1 = 1; // 启动定时器1
IE = 0x0; // 禁止任何中断

while(1)
{

if(RI) // 是否有数据到来
{
RI = 0;
tmp = SBUF; // 暂存接收到的数据
P0 = LED_tab[tmp]; // 数据传送到P0口
send_char(tmp); // 回传接收到的数据
}
}
}
void send_char(unsigned char txd)
// 传送一个字符
{
SBUF = txd;
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
}

数码管编码不一定对啊,跟你的连线有关。

追问

P0^0-P0^7接a-f,其实这无所谓,只要其他部分没错,我稍改段码就行。
你为什么把中断全关了?
返回的是乱码,而且数码管没反应

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-05-01
很简单,单片机上就一个串口程序和数码管显示程序,主要可以定义一个简单的通信协议来接收串口助手的数据追问

不知道咋弄。上面的程序返回的都是乱码。。。。。

第2个回答  2012-04-29
只有一个数码管?追问

是的,只用一个数码管显示一个数字就行,数码管a-f接P0^0-P0^7,晶振11.0592M

追答

#include
//-------------------------------------------
unsigned char code LED_tab[] = {
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned char tmp;
//-------------------------------------------
main()
{
PCON &= 0x7f; //波特率不倍增.
SCON = 0x50; //串口方式1,允许接收.
TMOD = 0x20; //T1工作2, 用于产生波特率.
TH1 = 0xFD; //波特率9600@11.0592MHz
TL1 = 0xFD;
TR1 = 1; //启动T1
ES = 1;
EA = 1; //开中断.

while(1);
}
//-------------------------------------------
void S0_INT(void) intrupt 4 //串口中断函数.
{
if(RI) { //有数据到来.
RI = 0; //清除标志.
tmp = SBUF; //暂存.
SBUF = tmp; //回传.
P0 = LED_tab[tmp]; //P0口显示.
}
else TI = 0; //清除标志.
}
//-------------------------------------------

追问

返回的是乱码

追答

你的题目是:求程序,实现功能:串口调试软件发送一个数字(0-9),在数码管上显示该数字。

返回的乱码,你可以不看。

追问

yun!关键是数码管上没显示啊

追答

检查你的硬件电路吧。
检查你的通信端口、波特率、数据格式等等。
程序是没有错的,我这里实验,是成功的。

追问

硬件电路绝对没问题,端口绝对没问题,波特率9600,也该没问题,你说的数据格式是指帧结构吗?7位数据位没有校验位(ASCII码就是7位,第八位为1),应该没错吧

追答

再试试下列程序。
下列程序,增加了:把收到的ASCII码,转换成二进制。

那么,你的串口助手,发送、和接收显示,都采用ASCII码进行即可。这就简单了。
另外,应该设置成:9600波特率,8位数据,无校验位,1位停止位。

#include
#define uint unsigned int
#define uchar unsigned char

//-------------------------------------------
unsigned char code LED_tab[] = {
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned char tmp;
//-------------------------------------------
main()
{
PCON &= 0x7f; //波特率不倍增.
SCON = 0x50; //串口方式1,允许接收.
TMOD = 0x20; //T1工作2, 用于产生波特率.
TH1 = 0xFD; //波特率9600@11.0592MHz
TL1 = 0xFD;
TR1 = 1; //启动T1
ES = 1;
EA = 1; //开中断.

while(1);
}
//-------------------------------------------
void S0_INT(void) interrupt 4 //串口中断函数.
{
if(RI) { //有数据到来.
RI = 0; //清除标志.
tmp = SBUF; //暂存.
SBUF = tmp; //回传.
tmp -= 48; //----增加了这一行
P0 = LED_tab[tmp]; //P0口显示.
}
else TI = 0; //清除标志.
}
//-------------------------------------------

追问

还是不行,甚至中断函数里只放P0=0xc0数码管都没反应(而如果再主函数中给数码管赋值的话就完全正常),不知道为什么,仿佛没有进入中断函数一样,但是如果没有进中断函数,又怎么会有乱码返回呢。。。。纠结

追答

同意你的分析。
不理解这种现象。

本回答被提问者采纳
相似回答