首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管下动态显示出来

2012-08-27 
以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态显示出来,#include reg52.h#define

以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态显示出来,
#include <reg52.h>
 #define uchar unsigned char
 #define uint unsigned int
 sbit dula=P2^6;//段选
 sbit wela=P2^7;//位选
 //数码管显示表格 0-F
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar wela_table[]=
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位选,1-6
uchar i,flag,j;
uchar wan,qian,bai,shi,ge;
uchar temp[2]={0,0};
uint num;//2个字节,16位0_65535
void Com_Init();//串口初始化程序
void Delay(uint z);//延时函数
void T1_Init();//T1定时器初始化程序
void IE_Init();//中断允许初始化
void Init();
void LED_Display(uchar Data,uchar Wei);//数码管显示数据和显示位置
 void main()
 {
 Init();//调用初始化程序
while(1)
{  
if(flag==2)//说明数据已经接收完成(已经接收了两次)
{
i=0;
flag=0;
  num=(uint)(temp[0]*256+temp[1]);//转换成十进制数据
//CHAR类型转换成INT类型 每个数据都可以有多种不同编码表示(B D HEX等)
//高8位 低8位
wan=num/10000;
qian=(num/1000)%10;
bai=(num/100)%10;
shi=(num/10)%10;
ge=num%10;

LED_Display(table[wan],wela_table[0]);
LED_Display(table[qian],wela_table[1]);
LED_Display(table[bai],wela_table[2]);
LED_Display(table[shi],wela_table[3]);
LED_Display(table[ge],wela_table[4]);  
}

}
//串口中断处理(提前串口中断允许处理开的状态)RI=1,TI=1,均会进入
void Do_Com_intrupt() interrupt 4
{
  RI=0;//取消本次中断 
temp[i]=SBUF;
flag++;
i++;
//读取接收寄存器到的数据(将发送过来的0-65536总共16位数据,临时存储) 
//每次只能传送8位数据,分两次发送,如果不保存这两次发送的全部数据,就不能将这数据还原  
//第一次接收前8位,第二次接收后8位  
}
 //串口初始化程序
void Com_Init()
{
//确定串口工作方式
SM0=0;
SM1=1;//方式1,10位异步收发,8位数据 操作SCON寄存器
PCON=0X00;
SM2=0;
REN=1;//打开串口通信允许

}
//延时函数
void Delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//T1定时器初始化程序
void T1_Init()
{
//确定T1工作方式和初值,并启动计数()
TMOD=0x20;//工作方式2 自动重装8位,高8位,低8位自动交替赋值使用(用来确定串口波特率)
TH1=0XFD;//9600bps 晶振11.0592 MHZ
TL1=0XFD;
TR1=1;//启动
}
//中断允许初始化
void IE_Init()
{
EA=1;
ES=1;//打开串口中断允许
}
void Init()
{
  T1_Init();
  Com_Init();
  IE_Init();
  flag=0;

//显示数据和显示位置
void LED_Display(uchar Data,uchar Wei)
{  
P0=Data;//送入显示字符数据
dula=1;
dula=0;

P0=Wei;//送入显示位置
wela=1;
wela=0;
Delay(2);

P0=0xff;//关闭所有显示,以便动态形成时,上一个不会影响下一个的亮度
wela=1;
wela=0;
Delay(2);

}

主要错误在于串口通信,不知道哪出的错,数据传送不成功,求解。

[解决办法]
PC发下来给单片机的?
你仿真时能看到temp[]中的数据不?
[解决办法]
void main()
 {
Init();//调用初始化程序
while(1)
{
if(flag==2)//说明数据已经接收完成(已经接收了两次)----“这里的应该改为if(flag>1){。。。”
假如是“if(flag==2)”已经接收了三个字节了
[解决办法]
更正:
void main()
 {
Init();//调用初始化程序
while(1)
{
if(flag==2)//说明数据已经接收完成(已经接收了两次)----“这里的应该改为if(flag==1){。。。”
假如是if(flag==2)已经接收了三个字节了 

热点排行