<p>PC发送到
单片机
后显示在数码管并将数据返回PC,以下为源程序,在ST89C52上烧录后没有问题,但是
proteus运行出现的如上图输入5对应ASCII码35,但是单片机上为000,返回给电脑的值也是00(16进制)。
#include<reg51.h>
#include<intrins.h>
#define led P0
/*******************************************************************************
实验:单片机与PC串口
通信
发送十六进制的数据也就是HEX发送,单片机得到的就是原值;
若文本形式发送,单片机接收到相应的ASCII码;
这里采用十六进制发送,无需转换。
*******************************************************************************/
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
typedef unsigned int u16; //重定义
typedef unsigned char u8;
/*******************************************************************************
* 函 数 名 :chuanchushi
* 函数功能 :串口初始化
*******************************************************************************/
void chuanchushi()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置波特率为4800,
TL1=0XF3;
TR1=1; //打开计数器
}
u8 code smgduan[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
//0-9
u8 DisplayData[8];
//用来存放要显示的8位数的值
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : Display
* 函数功能 : 使用数码管显示
*******************************************************************************/
void Display()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
led=DisplayData
;//发送段码
delay(10); //扫描间隔时间设定
led=0x00;//消隐
}
}
void main()
{
u8 receiveData;//定义接收数据类型
chuanchushi();//初始化
while(1)
{
if(RI == 1) //判断是否接收到数据
{
receiveData = SBUF; //读取数据
RI = 0; //清除标志位
SBUF=receiveData; //发送接收到的数据
while(!ti);
TI=0; //清楚接受中断标志位
//最大为255,所以只需要前三个数码管//
DisplayData[0] = 0x00;// 个位
DisplayData[1] = 0x00; //十位
DisplayData[2] = 0x00;//百位
DisplayData[3] = 0x00;
DisplayData[4] = 0x00;
DisplayData[5] = smgduan[receiveData / 100];
DisplayData[6] = smgduan[receiveData % 100 / 10];
DisplayData[7] = smgduan[receiveData % 10];
}
Display();
}
}
一周热门 更多>