找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2232|回复: 5
收起左侧

单片机发送数据给电脑但有些数据没有被再次发送

[复制链接]
回帖奖励 8 黑币 回复本帖可获得 2 黑币奖励! 每人限 1 次
ID:803014 发表于 2020-12-29 15:13 | 显示全部楼层 |阅读模式
我用单片机的ADC测量电压将测得值发送给电脑,00为标志,收到的数据理应是电压高8位,电压低8位,00,然后电压高8位电压低8位,00;这样循环,但实际收到的数据是电压高8位电压低8位,00;电压低8位00;电压低8位00;之后循环,再也没收到电压高8位;有没有大佬帮忙看看程序哪里出了问题。
**********************************************************************
void ADC0_ISR (void) interrupt 10
{
   static unsigned long accumulator = 0;     // accumulator for averaging
   static unsigned int measurements = 2048;  // measurement counter
//static unsigned int measurements = 4095;
   unsigned long result=0;
  // unsigned long mV;                         // measured voltage in mV
unsigned long mVH;
static unsigned int  RH;
   AD0INT = 0;                               // clear ADC0 conv. complete flag
   accumulator += ADC0;
   measurements--;
   if(measurements == 0)
   {
      measurements = 2048;
      result = accumulator / 2048;
      accumulator=0;
      // The 10-bit ADC value is averaged across 2048 measurements.
      // The measured voltage applied to P1.4 is then:
      //
      //                           Vref (mV)
      //   measurement (mV) =   --------------- * result (bits)
      //                       (2^12)-1 (bits)
   //   mV =  result * 2200 / 4095;
   mV =  result * 2200 / 4095;
   mVH=(mV>>8);
//      printf("P1.1 voltage: %ld mV\n",mV);
   RI0=0;
   TI0=0;
   if(unsend)
   
   {
    unsend=0;//低8位发送完成标志清0
    SBUF0=0;//发送数据0
   }
  _nop_();
   send=1;//高8位发送完成标识置1
   SBUF0=mVH;//发送高8位
       n=~n;//指示灯闪烁(后续为了验证上面一句语句有没有走到加上的)
   }
}
void UART0_Interrupt (void) interrupt 4
{
  Delay_ms (2);

if (TI0==!0)
{ if(send)
{
  send=0;//高8位发送完成标识清0
  unsend=1;//低8位发送完成标识置1
  SBUF0=mV;//发送低8位

  
}
TI0=0;
}
else if(RI0==!0)
{

RI0=0;
}
}
******************************************************
程序开始跑后指示灯是有闪烁的,但是电脑串口接收到的数据如上面所描述,没有高8位
回复

使用道具 举报

ID:824490 发表于 2020-12-30 11:12 | 显示全部楼层
if (TI0==!0)这样也可以吗?TI0==0 或TI0!=0,一般我都 是这么写判断的。
回复

使用道具 举报

ID:390416 发表于 2020-12-30 11:42 | 显示全部楼层
#include "all.h"
bit Uart1_Flag=1;
u8 code Uart1_Up_Symbol_Buffer[30]={"\r\n温度:  遥控解码:  超声波:mm"};
u8 xdata Uart1_Up_Num_Buffer[10];
void Uart1_Init()
{
        SM0=0;
        SM1=1;
        REN=1;
        //SCON|=0x50;
        
        PCON&=0x3f;
        AUXR|=0x01;
        AUXR|=0X14;
        T2H=0xfc;
        T2L=0xf3;
        ES=1;
}


void Uart1_Up_Data_Drive()
{
        static u8 xdata count=0;
        if(Uart1_Flag)
        {
                Uart1_Flag=0;
                count++;
                switch(count)
                {
                        case 1 : SBUF=Uart1_Up_Symbol_Buffer[0];break;
                        case 2 : SBUF=Uart1_Up_Symbol_Buffer[1];break;
                        case 3 : SBUF=Uart1_Up_Symbol_Buffer[2];break;
                        case 4 : SBUF=Uart1_Up_Symbol_Buffer[3];break;
                        case 5 : SBUF=Uart1_Up_Symbol_Buffer[4];break;
                        case 6 : SBUF=Uart1_Up_Symbol_Buffer[5];break;
                        case 7 : SBUF=Uart1_Up_Symbol_Buffer[6];break;
                        case 8 : SBUF=Uart1_Up_Num_Buffer[0];break;
                        case 9 : SBUF=Uart1_Up_Num_Buffer[1];break;
                        case 10 :SBUF=Uart1_Up_Num_Buffer[2];break;
                        case 11 :SBUF=Uart1_Up_Num_Buffer[3];break;
                        
                        case 12 : SBUF=Uart1_Up_Symbol_Buffer[7];break;
                        case 13 : SBUF=Uart1_Up_Symbol_Buffer[8];break;
                        case 14 : SBUF=Uart1_Up_Symbol_Buffer[9];break;
                        case 15 : SBUF=Uart1_Up_Symbol_Buffer[10];break;
                        case 16 : SBUF=Uart1_Up_Symbol_Buffer[11];break;
                        case 17 : SBUF=Uart1_Up_Symbol_Buffer[12];break;
                        case 18 : SBUF=Uart1_Up_Symbol_Buffer[13];break;
                        case 19 : SBUF=Uart1_Up_Symbol_Buffer[14];break;
                        case 20 : SBUF=Uart1_Up_Symbol_Buffer[15];break;
                        case 21 : SBUF=Uart1_Up_Symbol_Buffer[16];break;
                        case 22 : SBUF=Uart1_Up_Symbol_Buffer[17];break;
                        case 23 : SBUF=Uart1_Up_Num_Buffer[5];break;
                        case 24 : SBUF=Uart1_Up_Num_Buffer[6];break;
                        
                        case 25 : SBUF=Uart1_Up_Symbol_Buffer[18];break;
                        case 26 : SBUF=Uart1_Up_Symbol_Buffer[19];break;
                        case 27 : SBUF=Uart1_Up_Symbol_Buffer[20];break;
                        case 28 : SBUF=Uart1_Up_Symbol_Buffer[21];break;
                        case 29 : SBUF=Uart1_Up_Symbol_Buffer[22];break;
                        case 30 : SBUF=Uart1_Up_Symbol_Buffer[23];break;
                        case 31 : SBUF=Uart1_Up_Symbol_Buffer[24];break;
                        case 32 : SBUF=Uart1_Up_Symbol_Buffer[25];break;
                        case 33 : SBUF=Uart1_Up_Symbol_Buffer[26];break;
                        case 34 : SBUF=Uart1_Up_Num_Buffer[7];break;
                        case 35 : SBUF=Uart1_Up_Num_Buffer[8];break;
                        case 36 : SBUF=Uart1_Up_Num_Buffer[9];break;
                        case 37 : SBUF=Uart1_Up_Symbol_Buffer[27];break;
                        case 38 : SBUF=Uart1_Up_Symbol_Buffer[28];break;
                        case 39 :count=0;break;
                }
        }
}

void Uart1_Routine() interrupt 4
{
        static char Uart1_ser_n=0;
        if(RI)
        {
                RI=0;
                Uart1_Flag=1;
                if(SBUF==0x7f)//9600波特率
                {
                        Uart1_ser_n++;
                        if(Uart1_ser_n>=10)
                        {
                                Uart1_ser_n=0;
                                IAP_CONTR|=0xe0;
                        }
                }
        }
        if(TI)
        {
                TI=0;
                Uart1_Flag=1;
                Uart1_Up_Data_Drive();
        }
}

一、以上代码是STC15W的,可能需要修改定时器参数。
二、主函数while大循环前面初始化IO口和Uart1_Init();
三、主函数每间隔大约500ms 执行一次Uart1_Up_Data_Drive();这个函数,确保数据能够发送。
四、串口通信,电脑发送一个字节。才能让单片机发送。
五、接收端波特率要正确,文本模式接收才能显示汉字。
六、以上代码由《人人学会单片机》视频教程原创,也就是我本人原创,引用请备注代码出处。
回复

使用道具 举报

ID:803014 发表于 2020-12-30 15:30 | 显示全部楼层
名字不是重点 发表于 2020-12-30 11:12
if (TI0==!0)这样也可以吗?TI0==0 或TI0!=0,一般我都 是这么写判断的。

这个判断应该是没有问题的,因为能做到数据传输,如果判断语句不起作用那么低8位不会传输,但实际结果是高8位自第一次传输后再也没有传输,低8位正常输出。
回复

使用道具 举报

ID:803014 发表于 2020-12-30 15:31 | 显示全部楼层
人人学会单片机 发表于 2020-12-30 11:42
#include "all.h"
bit Uart1_Flag=1;
u8 code Uart1_Up_Symbol_Buffer[30]={"\r\n温度:  遥控解码:  超声 ...

谢谢回复,用case语句来选择好像是个好办法,我试一下
回复

使用道具 举报

ID:803014 发表于 2020-12-30 15:52 | 显示全部楼层
人人学会单片机 发表于 2020-12-30 11:42
#include "all.h"
bit Uart1_Flag=1;
u8 code Uart1_Up_Symbol_Buffer[30]={"\r\n温度:  遥控解码:  超声 ...

虽然还是不知道为什么之前那个出问题,但是现在换成case语句后解决了我的问题,而且感觉按顺序输出多少数据都不是问题。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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