lyf 发表于 2012-7-26 18:15:21

stc89c52串口通讯实验

怎样才能在串口助手上,一个接一个的循环显示数字,比如先显示1,过1.5S后再显示2,调试助手上每次只显示一个数字。。。求程序。。。

lcw_swust 发表于 2012-7-26 19:25:29

貌似有的“超级终端”可以,大概是接收backspace删除之前的字符,再显示新字符

lyf 发表于 2012-7-26 23:19:25

lcw_swust 发表于 2012-7-26 19:25 static/image/common/back.gif
貌似有的“超级终端”可以,大概是接收backspace删除之前的字符,再显示新字符 ...

你说那个 我不懂,我只是个初学者,我现在,在做秒表(不过是0到50)在串口上显示的实验,求大侠指导,没思路。。。

lcw_swust 发表于 2012-7-27 09:31:28

本帖最后由 lcw_swust 于 2012-7-27 09:33 编辑

抄了一些程序,凑合着用吧
//系统时钟定义,用于计算波特率
#define FOSC 11059200
//--------------------------------------------------
//毫秒级延时
//--------------------------------------------------
void delayms(int t)
{
        int i;
        for(;t>0;t--)
                for(i=FOSC/13186;i>0;i--);
}
//--------------------------------------------------
//串口1初始化
//--------------------------------------------------

void uart1_init(int baud,char es)
{
        char v;
        TMOD&=0x0f;
        TMOD|=0X20;        //T1方式2
        v=256-((FOSC*10/12/32/baud+5)/10);//四舍五入
        TH1=v;
        TL1=v;
        //IOSET(AUXR,BIT(6));//T1x12,让T1的时钟变为原来的12倍,波特率也提高了
        TR1=1;
        SCON=0X50;                //0101 0000 方式1,允许接收
        ES       =es;                //允许串行中断
        //EA       =1;                //全局中断允许
}
//--------------------------------------------------
//串口1发送单个字符
//--------------------------------------------------
void uart1_sendbyte(char ud)
{
        SBUF=ud;
        while(TI==0);                                //等待它由0变为1
        TI=0;                                                //清发送标志
}

void main(void)
{
int i;
uart1_init(9600,1);
while(1)
{
for(i=0;i<50;i++)
{
uart1_sendbyte(i);
delayms(1500);
}
}
}

lyf 发表于 2012-7-27 11:12:51

lcw_swust 发表于 2012-7-27 09:31 static/image/common/back.gif
抄了一些程序,凑合着用吧
//系统时钟定义,用于计算波特率
#define FOSC 11059200


嗯,谢谢了,我自己在调试下。。。

136420962 发表于 2012-7-27 17:27:30

呃..看不懂

oufuqiang 发表于 2012-7-27 17:32:28

一般的串口调试助手不支持这样的功能吧,超级终端可以,通过发送0x0C(12)即可实现清屏。

lyf 发表于 2012-7-27 18:10:00

lcw_swust 发表于 2012-7-27 09:31 static/image/common/back.gif
抄了一些程序,凑合着用吧
//系统时钟定义,用于计算波特率
#define FOSC 11059200


我用定时器写了程序,串口助手总是1到50循环显示,这两个循环之间相隔1.5S,我想让两个数据之间相隔1.5S,该怎么改?我程序帖出来,顺便问一下,如何让串口显示十进制数?

lyf 发表于 2012-7-27 18:12:37

lyf 发表于 2012-7-27 18:10 static/image/common/back.gif
我用定时器写了程序,串口助手总是1到50循环显示,这两个循环之间相隔1.5S,我想让两个数据之间相隔1.5S ...

两个数据之间相隔1.5S,就是先发送1,1.5S后发送2,后到50自动变零,在循环。。。
      #include<reg52.h>                //头文件
//#define FOSC 11059200
#define uchar unsigned char
#define uchar unsigned char
uchar num;
uchar m;
/**************************************************************************/
//初始化子程序
void Time1_1(void)
       {

             TH0=(65536-5000)/256;//高位赋初值50毫秒
         TL0=(65536-5000)%256;//低位赋初值50毫秒
         EA=1;//开总中断
         ET0=1;//设置定时器0中断
         TMOD= 0x21;//定时器0方式1
         TR0=1; //启动Timer0
           }
void uart1_Init()//串口初始化
{
TMOD=0x20;                   //用定时器设置串口波特率                   9600
        TH1=0xfd;
        TL1=0xfd;
        SCON=0x50;
        TR1=1;
        REN=1;          //串口初始化
        SM0=0;
        SM1=1;
        EA=1;         //开启总中断
        ES=1;                
}
//void delayms(int t)
//{
//      int i;
//      for(;t>0;t--)
//      for(i=FOSC/13186;i>0;i--);
//}
//--------------------------------------------------
//串口1初始化
//--------------------------------------------------
//
//void uart1_init(int baud,char es)
//{
//      char v;
//      TMOD&=0x0f;
//      TMOD|=0X20;      //T1方式2
//      v=256-(( FOSC*10/12/32/baud+5)/10);//四舍五入
//      TH1=v;
//      TL1=v;
//      //IOSET(AUXR,BIT(6));//T1x12,让T1的时钟变为原来的12倍,波特率也提高了
//      TR1=1;
//      SCON=0X50;                //0101 0000 方式1,允许接收
//      ES=1;                //允许串行中断
//      //EA         =1;                //全局中断允许
//}                                  
//--------------------------------------------------
//串口1发送单个字符
//--------------------------------------------------
void uart1_sendbyte(char ud)
{
      SBUF=ud;
      while(TI==0);                              //等待它由0变为1
      TI=0;                                                //清发送标志
}

void main(void)
{
int i;
uart1_Init();
Time1_1();
        while(1)
        {                                  
       if(num==31)
             {   
               m=i;                        
        for(i=0;i<51;i++)
        {
             num=0;          
                 
               
                   uart1_sendbyte(i);
                  
                  }
                }       
           }
}
void uart1_1(void) interrupt 4 //串口中断函数
        {
        TI=0;
        RI=0;
        ES=0;
        }
void Time1_0(void) interrupt 1//定时器0中断入口
        {   
                                                 
         
                  
         TH0=(65536-50000)/256;                              //定时50毫秒
         TL0=(65536-50000)%256;
             TR0=1;
               num++;
                  
             
       }

sf49ers 发表于 2012-7-27 19:01:56

i=1;
while(1)
{
    if(num==31)
    {
      uart1_sendbyte(i);
      i++;
       if(i>50) i=1;
    }
}

lyf 发表于 2012-7-28 09:44:16

sf49ers 发表于 2012-7-27 19:01 static/image/common/back.gif
i=1;
while(1)
{


                           i++;
               num1=1;
               if(i==51)i=0;
                        num=0;
                                                         
                }
                if(num1==1)
                {
       uart1_sendbyte(i);
                num1=0;
                }

          还需要 个标志位,昨天刚调试的, 否则会重复发送一个数,不过还是谢谢你!
页: [1]
查看完整版本: stc89c52串口通讯实验