5532|6

88

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

串口助手发送数据通过单片机控制l ed屏显示? [复制链接]

目的是 用vb通过单片机控制led屏。现在先用串口助手试下。我想用串口助手先发一个数过去,点亮led屏的一个小灯,在依次累加。led屏是用74hc595串起来的。其间也想把单片机接收的数据回显到串口助手来证明接受无误。以前直接烧程序控制屏时点亮第一个小灯是发送0x01,但是现在用串口助手发送一个1,毫无反应阿,为什么呢?


//-----------------------函数声明,变量定义--------------------------------

  #include
  #define COUNT 30                   // 定义接收缓冲区大小
  #define uchar unsigned char  
  #define uint unsigned int

  #define   TIMER0_HIGH 0xF3
  #define   TIMER0_LOW  0x67       //每3.5ms中断一次,计数n=9677
             //注:TIMER0_HIGH=0xDA  
             //    TIMER0_LOW    =0x33  
  #define   T1_HIGH     0xF5
  #define   T1_LOW      0x33       //每1ms中断一次,计数n=2765
  #define   T2_HIGH     0xEA
  #define   T2_LOW      0x66    //每2ms中断一次,计数n=5530
  #define   T5_HIGH     0xCA
  #define   T5_LOW      0x00    //..5ms.......   计数n=13824
  #define   T10_HIGH    0x94
  #define   T10_LOW     0x00    //..10ms......   计数n=27648
  #define   T20_HIGH    0x28
  #define   T20_LOW     0x01    //..20ms......   计数n=55295
//-----------站点相关参数定义-------------------------
  #define   StbDot      (*((uchar volatile xdata*)0x4400))    //输出点的车位泊位位图的锁存命令
//----------定义SFR寄存器变量-------------------------
  sfr   SPCR    =0xD5;
  sfr   SPDAT   =0x86;
  sfr   SPSR    =0xaa;
  sbit  SPIF    =ACC^7;
//----------工作信号控制灯定义--------------------------
  sbit  Led =P3^4;
//----------被调用函数声明----------------------------
  void    UART_Init();                    //串口初始化函数
  void    COM_Send(void);                //串口接收函数
  void    Delay(uint time);

  uchar xdata Buffer[COUNT];         //定义接收缓冲区
  uchar xdata DispBuffer[COUNT];      //定义给spi口发送数据的数组
  uchar xdata SaveBuffer[COUNT];          //定义储存接受的数据的数组
  uint  xdata point=0;                   //定义接收数据个数指示变量
  uint  T0_Count =0;                     //用来计算等待时间  
  uchar code    *pcData;                //指向程序存储器的指针,用于调取显示数据   
  void  In_Order_Send(unsigned char *pcData) ;
//-------------------------------------------------------------------------
// 函数名称: UART_init()串口初始化函数
// 函数功能: 在系统时钟为33.177时,设定串口波特率为9600bit/s
//            串口接收中断允许,发送中断禁止
//初始化串行口和波特率发生器
//-------------------------------------------------------------------------
void UART_init()
{                    
SCON =0x50;          //选择串口工作方式,打开接收允许
TMOD =0x21;          //定时器1工作在方式2串口通信,定时器0工作在方式1用来计时
TH1 =0xf7;           //实现波特率9600(系统时钟33.1776MHZ)
TR1 =1;              //启动定时器T1
TL0=T10_LOW;
TH0=T10_HIGH;  
TR0=1;
ET1 =1;
ET0 =1;
ES=1;                //允许串行口中断
//PS=1;                //设计串行口中断优先级
EA =1;               //单片机中断允许
pcData=&SaveBuffer;
SPCR  =0x5C;      //由于是由SPI串口烧入,所以必须有这个选项   
}

//-------------------------------------------------------------------------
// 函数名称: T0_int中断函数
// 函数功能: 检验单片机是否工作
//-------------------------------------------------------------------------

void  T0_int(void) interrupt  1   using   2
    {
       TL0=T10_LOW;
       TH0=T10_HIGH;        //定时器初值重置,实现循环工作            
       T0_Count++;          //定时器计数   
       if((T0_Count%100)==0)
       {
             Led=!Led;
       }
       if((T0_Count%10)==0)
       {
          pcData=&DispBuffer[0];
          In_Order_Send(pcData);  
       }
        if(T0_Count>=500)T0_Count=0;
    }

//-------------------------------------------------------------------------
// 函数名称: com_interrup()串口接收中断处理函数
// 函数功能: 接收数据到数据缓冲区
//-------------------------------------------------------------------------
Com_Interrupt(void) interrupt 4 using 3

{   uchar p=0;
    if(!RI)return;  
      Buffer[point]=SBUF;
      RI=0;
     SaveBuffer[p]=Buffer[point];
     //p++;
   //  if(p==30)p=0;
     SBUF=Buffer[point];
      while(!TI);
      TI=0;
     // point++;
     // if(point==COUNT)point=0;
            
}
//-------------------------------------------------------------------------
// 函数名称:  In_Order_Send()
// 函数功能: 发送数据到屏
//-------------------------------------------------------------------------
void  In_Order_Send(uchar *pcData)
   {
    uchar i;                    
    for(i=0;i<28;i++)                              //Put the output data in order
       {
         DispBuffer[27-i]=*(pcData+i);
       }
     
    for(i=0;i<28;i++)                               //Send the data
       {
            SPDAT=0xff-DispBuffer;  
            do{
                ACC=SPSR;
            
            }while(SPIF==0);
       }
      StbDot=0;
      Delay(150);  
         
   

   }
         
//-------------------------------------------------------------------------
// 函数名称: COM_send()串口发送函数
// 函数功能: 把数据缓冲区的数据发送出去
//-------------------------------------------------------------------------
/*void  COM_Send(void)
{  
SBUF=Buffer[point-1];
      while(!TI);
      TI=0;
     }
*/
//-------------------------------------------------------------------------
// 函数名称: 主函数
// 函数功能: 调度各子函数,完成通信过程
//-------------------------------------------------------------------------
void main(void)
{
    UART_init(); //初始化串口
   do
   {
   
   
   }while(1);
}

//-------------------------------------------------------------------------
void Delay(uint time)
      {uint i,j;
        for(i=0;i             for(j=0;j             }

最新回复

while(!TI); if(!RI)return;   这个都是延时等待,怎么会没必要呢?请指教.   详情 回复 发表于 2008-7-5 21:12
点赞 关注

回复
举报

63

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
串口助手里需要选“十六进制发送”,然后写入 01,表示是0x01,如果直接写1,不选,那就是1的ASCII值了。
让单片机回送回来的时候显示对吗?
 
 

回复

68

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
谢谢指导.
直接发1,串口接受的也是1,如果按您说的发,没有回显.看来我那个串口中断简单的接收回显可能有问题.
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

4
 
直接写1那就是Ascii
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

5
 
串口助手里的接收部分也要选择“十六进制显示”,才能看到01这样的值(其实是0x01,十六进制显示,会去掉0x)。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
//-------------------------------------------------------------------------
// 函数名称: com_interrup()串口接收中断处理函数
// 函数功能: 接收数据到数据缓冲区
//-------------------------------------------------------------------------
Com_Interrupt(void) interrupt 4 using 3

{  uchar p=0;
    if(!RI)return;  
      Buffer[point]=SBUF;
      RI=0;
    SaveBuffer[p]=Buffer[point];
    //p++;
  //  if(p==30)p=0;
    SBUF=Buffer[point];
      while(!TI);
      TI=0;
    // point++;
    // if(point==COUNT)point=0;
            
}
------------------------
while(!TI);这个有必要等吗?应直接放过去.写法如下:
    SBUF=Buffer[point];
    if(TI==1)TI=0;
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

7
 
while(!TI);
if(!RI)return;  
这个都是延时等待,怎么会没必要呢?请指教.


 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表