注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

沙粒的博客

 
 
 

日志

 
 

pc-c51: c51显示收到的数字  

2014-11-09 13:03:29|  分类: 通信 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

/*
程序功能:
c51接收2位数据,在P1脚分时显示出来,先显示高位数字,后显示低位数字。
程序说明:
1、共阳数码管接P1脚
2、
*/

#include <reg52.h>
#define uchar unsigned char

//定义变量
uchar recbuf[10]; //接收数据缓存
uchar recnum; //接收数据字节数

//定义数码管转换表 
//共阳:
uchar tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//共阴转换表 uchar tab[10]={0xcf,0x03,0x5d,0x5b,0x93,0xda,0xde,0x43,0xdf,0xdb};

//初始化工作,
//T0、T1 设置为工作方式2,一个作波特率发生器,一个作定时器定时发送控制信号
//串口设置,
void init();

//声明处理函数
void answer();


//延时程序
void delayms(uchar ms);

void delays(uchar s);

//主函数
void main()
{




 
  init();
  while(1)
  {
    
answer();
  }

 

}

//初始化工作,
//T0、T1 设置为工作方式2,一个作波特率发生器,一个作定时器定时发送控制信号
//串口设置,
void init()
{
  //定时器设置
  //T1,方式2,自动重载作波特率发生器
  //T0,方式0,13位计数器,作定时器,超时溢出
  TMOD=0x20;

  //T1常数计算,baud=9600,f=11.0592MHZ
  //晶振->12分频->定时器输入,8位计数,定时器输出->2分频(默认SMOD=0,如SMOD=1不分频)->16分频->波特率
  //常数TC=2^8-f/12/2/16/baud  
  TL1=0xfd;
  TH1=0xfd;

  //串口设置
  //串口方式1,允许接收
  SCON=0x50;

  //中断设置,串口开中断
  ES=1; //串口开中断
  EA=1; //打开 总允许



  //启动定时器
  TR1=1;
 


}


//定义串口中断程序,不需要声明
void serial() interrupt 4
{

  //关中断
  TI=0;
  ES=0;  //关键语句,关闭中断,程序可顺序向下执行

  //启动定时器,超时推出
  TH0=0x00;
  TL0=0x00;
  TR0=1;

  //
  recnum=0;

  //----- 收到第一个字节

  //没有收到数据,未超时,等待
  while((RI==0) && (TF0==0));
  //手动复位
  RI=0;
  //如果超时,返回
  if(TF0==1)
  goto mm; 
   
  //收到第一个字节数据
  recbuf[recnum++]=SBUF;


  //----- 收到第二个字节

  //启动定时器,超时推出
  TH0=0x00;
  TL0=0x00;
  
  //没有收到数据,未超时,等待
  while((RI==0) && (TF0==0));
  //手动复位
  RI=0;
  //如果超时,返回
  if(TF0==1)
  goto mm; 
   
  //收到第二个字节数据
  recbuf[recnum++]=SBUF;

  //----- 收到第三个字节

  //启动定时器,超时推出
  TH0=0x00;
  TL0=0x00;
  
  //没有收到数据,未超时,等待
  while((RI==0) && (TF0==0));
  //手动复位
  RI=0;
  //如果超时,返回
  if(TF0==1)
  goto mm; 
   
  //收到第三个字节数据
  recbuf[recnum++]=SBUF;

  //----- 收到第四个字节

  //启动定时器,超时推出
  TH0=0x00;
  TL0=0x00;
  
  //没有收到数据,未超时,等待
  while((RI==0) && (TF0==0));
  //手动复位
  RI=0;
  //如果超时,返回
  if(TF0==1)
  goto mm; 
   
  //收到第四个字节数据
  recbuf[recnum++]=SBUF;

  //----- 收到第五个字节

  //启动定时器,超时推出
  TH0=0x00;
  TL0=0x00;
  
  //没有收到数据,未超时,等待
  while((RI==0) && (TF0==0));
  //手动复位
  RI=0;
  //如果超时,返回
  if(TF0==1)
  goto mm; 
   
  //收到第五个字节数据
  recbuf[recnum++]=SBUF;

  //----- 收到第六个字节

  //启动定时器,超时推出
  TH0=0x00;
  TL0=0x00;
  
  //没有收到数据,未超时,等待
  while((RI==0) && (TF0==0));
  //手动复位
  RI=0;
  //如果超时,返回
  if(TF0==1)
  goto mm; 
   
  //收到第六个字节数据
  recbuf[recnum++]=SBUF;


  //关闭T0
mm:TR0=0;
    TF0=0;
  ES=1;

        
}


//定义处理函数
void answer()
{
  //关中断发送数据
   RI=0;
   TI=0;
   ES=0;
  
   if(recnum>0)
   {

     //数据高位
     P1=tab[recbuf[0]];


delays(2);


//数据低位
P1=tab[recbuf[1]];

delays(2);









  
  
 

  
  
   }

   ES=1;
  
}

//参数表示延时毫秒数
void delayms(uchar ms)
{
    uchar i; 
   while(ms--)
   {
      i=97;
 while(i--);
   }
    

}

void delays(uchar s)
{
    uchar i;
    while(s--)
{
  for(i=0;i<10;i++)
  {
     delayms(100);
}
}
    

}

  评论这张
 
阅读(270)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017