找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1808|回复: 8
收起左侧

求助各位前辈关于51单片机串口通讯的问题,麻烦各位了。

[复制链接]
ID:469368 发表于 2019-8-28 23:50 | 显示全部楼层 |阅读模式
本帖最后由 Ming305 于 2019-8-29 02:08 编辑

不才在学习单片机在串口通信方面有点问题需要请教各位前辈:
题目:1、基于单片机做一个秒表,按下按键s2,秒表开始/暂停、按下s3秒表清零计时并等待开始计时、秒表在计数的同时在数码管显示
          2、在串口助手显示(同步)数码管所显示的时间
              总言之就是;做一个秒表,秒表的时间通过串口发电脑上

现在我能把要求1做出来了,但是在要求2上反复调试都不能达到所要求的效果。实在是没有思路了,故在此求助各位前辈,望指教,谢谢各位前辈了。
现在我写的代码如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^0;  //λ???尴??
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
sbit dula=P2^6;   //????U1?????????????
sbit wela=P2^7;   //????U2?????????????
uchar code table[]={0x3f,0x06,0x5b,0x4f,
     0x66,0x6d,0x7d,0x07,
     0x7f,0x6f,0x77,0x7c,
     0x39,0x5e,0x79,0x71};

void delayms(uint);
uchar numt0,num;
void display (char numdis) //????????
{
char shi,ge;        //???????????????????
shi=numdis/10;
ge=numdis%10;

dula=1;
P0=table[shi];        //???λ???????
dula=0;
P0=0xff;         //??λ???????????????????????λ??????
wela=1;
P0=0xfe;
wela=0;
delayms(5);

dula=1;         
P0=table[ge];      //???λ???????
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(5);
}
void delayms(uint xms)    //????????
{
  uint i,j;
  for(i=xms;i>0;i--)   //i=xms?????????
   for(j=110;j>0;j--);
   
}
void init()         //?????????
{           //????????0????????1??0000 0001??
  TMOD = 0x01;
  TH0=(65536-45872)/256;     //????50ms????ж?
  TL0=(65536-45872)%256;     
  EA=1;         //?????ж?
  ET0=1;         //???????0?ж?
}
//????????
void UART_init()
{
TMOD = 0x20;   //T1??????2  8λ??????
TH1 = 0xfd;
TL1 = 0xfd;  //??????9600
TR1 = 1;  //???T1?????
SM0 = 0;
SM1 = 1;   //??????????1 10λ??
REN = 1;  //???????????
EA  = 1;  //?????ж?
ES  = 1;  //?????ж??
}
/* void keyscan()
{
if(key1==0)
{
  delayms(10);
  if(key1==0)
  {
   num=0;
   while(!key1);
  }
}
if (key2==0)
{
  delayms(10);
  if(key2==0)
  {
    while(!key2);
   TR0=~TR0;
  }
}  
} */
void main()
{  
  UART_init;
  init();
  while(1)
  {
   display(num);
   //keyscan();
   if(key1==0)
{
  delayms(10);
  if(key1==0)
  {
   num=0;
   while(!key1);
  }
}
if (key2==0)
{
  delayms(10);
  if(key2==0)
  {
    while(!key2);
   TR0=~TR0;
  }
}  

  }
}
void T0_time() interrupt 1
{
   TH0=(65536-45872)/256;     //??????
      TL0=(65536-45872)%256;
   numt0++;
   if(numt0==20)      //???????20?Σ????1s???
   {
    numt0=0;      //????numt????
    num++;
    if(num==60)
     num=0;
   }   
}



回复

使用道具 举报

ID:275826 发表于 2019-8-29 09:22 | 显示全部楼层
程序没看见有串口发送语句呀
回复

使用道具 举报

ID:605057 发表于 2019-8-29 11:36 | 显示全部楼层
你这都没有把秒表数据通过串口发送出去
回复

使用道具 举报

ID:605057 发表于 2019-8-29 11:37 | 显示全部楼层
你这都没有串口发送部分
回复

使用道具 举报

ID:517466 发表于 2019-8-29 11:39 | 显示全部楼层
1、UART_init;这样的语句能通过编译?
2、像楼上说的那样,你都没有执行串口的发送语句。比如SBUF=xx;white(TI);TI=0;之类的执行语句。
回复

使用道具 举报

ID:213173 发表于 2019-8-29 14:24 | 显示全部楼层
楼主只写了串口初始化程序并且还是错误的,没有写串口发送语句。你这个按键程序会干扰数码管显示和串口,所以都放在中断里了。并把全部错误改正了,串口1秒发送1次数据。有详细注释。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//sbit key1=P3^0;//P3.0、P3.1是串口引脚,不宜重叠使用
//sbit key2=P3^1;
//sbit key3=P3^2;
//sbit key4=P3^3;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,
     0x66,0x6d,0x7d,0x07,
     0x7f,0x6f,0x77,0x7c,
     0x39,0x5e,0x79,0x71};

void delayms(uint);
uchar numt0,num;
bit flag=0;//开/停位变量

void display(uchar numdis)
{
        static bit i=0;
//        uchar shi,ge;
//        shi=numdis/10;
//        ge=numdis%10;
        P0=0x00;//消隐
        dula=1;
        dula=0;
        if(i==1)
        {
                P0=0xfe;
                wela=1;
                wela=0;
       
                P0=table[numdis/10];
                dula=1;
                dula=0;
                i=~i;
        }
        else
        {
                P0=0xfd;
                wela=1;
                wela=0;
       
                P0=table[numdis%10];
                dula=1;         
                dula=0;
                i=~i;
        }
}
void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);  
}
void init()
{
//        TMOD= 0x01;
        TMOD|=0x01;//重复设置TMOD需要加"|"符
        TH0=(65536-4608)/256;//5ms
        TL0=(65536-4608)%256;     
        EA=1;
        ET0=1;
        TR0=1;
}

void UART_init()
{
//        TMOD= 0x20;
        TMOD|=0x20;//重复设置TMOD需要加"|"符
        TH1 = 0xfd;
        TL1 = 0xfd;
        TR1 = 1;
        SM0 = 0;
        SM1 = 1;
        REN = 1;
//        EA  = 1;//重复设置,多余
//        ES  = 1;//只发不收,多余
}

void main()
{  
//        UART_init;//这里少()
        UART_init();
        init();
        while(1)
        {
                if(key1==0)
                {
                        delayms(10);
                        if(key1==0)
                        {
                                numt0=0;
                                num=0;
                                flag=0;
                                while(!key1);
                        }
                }
                if (key2==0)
                {
                        delayms(10);
                        if(key2==0)
                        {
                                flag=~flag;
                                while(!key2);
//                                TR0=~TR0;
                        }
                }         
        }
}
void T0_time() interrupt 1
{
        TH0=(65536-4608)/256;//5ms
        TL0=(65536-4608)%256;      
        if(flag)
        {
                numt0++;
                if(numt0==200)
                {
                        numt0=0;
                        num++;
                        if(num==60)
                                num=0;
                        SBUF=num;        //每隔秒发送一次数据
                        while(!TI);        //等待发送中断请求标志位为1(发送结束)
                        TI=0;                        //发送中断请求标志位清0,为下次发送做准备
                }   
        }
        display(num);//动态显示放在中断里不受按键干扰
}
回复

使用道具 举报

ID:469368 发表于 2019-9-8 12:37 | 显示全部楼层
wulin 发表于 2019-8-29 14:24
楼主只写了串口初始化程序并且还是错误的,没有写串口发送语句。你这个按键程序会干扰数码管显示和串口,所 ...

太谢谢你了
回复

使用道具 举报

ID:469368 发表于 2019-9-8 12:38 | 显示全部楼层
suncat0504 发表于 2019-8-29 11:39
1、UART_init;这样的语句能通过编译?
2、像楼上说的那样,你都没有执行串口的发送语句。比如SBUF=xx;whi ...

谢谢斧正,太谢谢了
回复

使用道具 举报

ID:93224 发表于 2019-9-10 10:00 | 显示全部楼层
你的程序写的逻辑有问题,自己好好缕一缕
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表