mc9s12xep100板串口发送实时温度问题,请教大家。没分了,请大家不吝赐教,小弟不胜感激!

2019-07-15 17:22发布

tica, SimSun, sans-serif">单独的串口中断发送字符串和温度采集都没问题,发送实时变量data4就不行?

VECTOR ADDRESS 0xFFD4 send_string

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include "18B20.h"      

#define CONT1 PORTK_PK3
#define CONT2 PORTK_PK2
#define CONT3 PORTK_PK1
#define CONT4 PORTK_PK0
#define CONT1_dir DDRK_DDRK3
#define CONT2_dir DDRK_DDRK2
#define CONT3_dir DDRK_DDRK1
#define CONT4_dir DDRK_DDRK0
#define DATA PTP
#define DATA_dir DDRP

#define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4
#define  BUS_CLOCK                   32000000           //总线频率
#define  OSC_CLOCK                   16000000           //晶振频率
#define BAUD 9600

unsigned int wendu;
unsigned int zhengshu,xiaoshu;
byte data1 = 0;
byte data2 = 10;
byte data3 = 0;
byte data4 = 0x00;
byte single = 1;
byte shuma[20]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,       //0~9对应的段码
                0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};      //0~9后加小数点对应的段码

unsigned char putstring[]="http:/|shop62148944.taobao.com ";
unsigned char *send;

/*************************************************************/
/*                      初始化锁相环                         */
/*************************************************************/
void INIT_PLL(void)
{
    CLKSEL &= 0x7f;       //set OSCCLK as sysclk
    PLLCTL &= 0x8F;       //Disable PLL circuit
    CRGINT &= 0xDF;

    #if(BUS_CLOCK == 40000000)
      SYNR = 0x44;
    #elif(BUS_CLOCK == 32000000)
      SYNR = 0x43;     
    #elif(BUS_CLOCK == 24000000)
      SYNR = 0x42;
    #endif

    REFDV = 0x81;         //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M
    PLLCTL =PLLCTL|0x70;  //Enable PLL circuit
    asm NOP;
    asm NOP;
    while(!(CRGFLG&0x08)); //PLLCLK is Locked already
    CLKSEL |= 0x80;        //set PLLCLK as sysclk
}

/************************************************************/
/*                    初始化ECT模块                         */
/************************************************************/
void initialize_ect(void){
  ECT_TSCR1_TFFCA = 1;  // 定时器标志位快速清除
  ECT_TSCR1_TEN = 1;    // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
  ECT_TIOS  = 0xff;      //指定所有通道为输出比较方式
  ECT_TCTL1 = 0x00;            // 后四个通道设置为定时器与输出引脚断开
  ECT_TCTL2 = 0x00;     // 前四个通道设置为定时器与输出引脚断开
  ECT_DLYCT = 0x00;            // 延迟控制功能禁止
  ECT_ICOVW = 0x00;            // 对应的寄存器允许被覆盖;  NOVWx = 1, 对应的寄存器不允许覆盖
  ECT_ICSYS = 0x00;            // 禁止IC及PAC的保持寄存器
  ECT_TIE   = 0x01;     // 允许通道0定时中断
  ECT_TSCR2 = 0x07;            // 预分频系数pr2-pr0:111,,时钟周期为4us,
  ECT_TFLG1 = 0xff;            // 清除各IC/OC中断标志位
  ECT_TFLG2 = 0xff;     // 清除自由定时器中断标志位
}

/*************************************************************/
/*                         延时函数2                         */
/*************************************************************/
void delay1ms(unsigned int n)
{
    unsigned int i;
    for(i=0;i<n;i++)
    {
        ECT_TFLG1_C1F = 1;              //清除标志位
        ECT_TC1 = ECT_TCNT + 250;             //设置输出比较时间为1ms
        while(ECT_TFLG1_C1F == 0);      //等待,直到发生输出比较事件
    }
}


/*************************************************************/
/*                      初始化端口                           */
/*************************************************************/
void INIT_port(void)
{
  CONT1_dir = 1;
  CONT2_dir = 1;
  CONT3_dir = 1;
  CONT4_dir = 1;
  CONT1 = 0;
  CONT2 = 0;
  CONT3 = 0;
  CONT4 = 0;
  DATA_dir = 0xff;
  DATA = 0x00;
}


/*************************************************************/
/*                        初始化SCI                          */
/*************************************************************/
void INIT_SCI(void)
{
  SCI1BD = BUS_CLOCK/16/BAUD;   //设置SCI0波特率为9600
  SCI1CR1 = 0x00;        //设置SCI0为正常模式,八位数据位,无奇偶校验
  SCI1CR2 = 0x88;        //允许发送数据,允许发送中断功能
}

/*************************************************************/
/*                       串口发送函数                        */
/*************************************************************/
void SCI_send(unsigned char data)
{
  while(!SCI1SR1_TDRE);         //等待发送数据寄存器(缓冲器)为空
  SCI1DRL = data;
}

/*************************************************************/
/*                   串口中断发送字符串函数                  */
/*************************************************************/

#pragma CODE_SEG __NEAR_SEG NON_BANKED

interrupt void send_string(void)
{
  if(*send!=0x00)         //判断字符串是否发送完毕
    SCI_send(*send);
  else
    //send = putstring;
    send = &data4;
}
//#pragma CODE_SEG DEFAULT

/*************************************************************/
/*                      中断扫描函数                         */
/*************************************************************/
//#pragma CODE_SEG __NEAR_SEG NON_BANKED
/*
interrupt void scan(void)
{
  if(ECT_TFLG1_C0F == 1)
  {
    ECT_TFLG1_C0F = 1;
    ECT_TC0 = ECT_TCNT + 1250;         //设置输出比较时间为5ms
  }
  switch(single)
  {
    case 1:
      CONT1 = 1;
      CONT2 = 0;
      CONT3 = 0;
      CONT4 = 0;
      if(data1==20)
         DATA=0x40;
      else if(data1==0)
         DATA=0;
      else
         DATA=shuma[data1];
      break;

    case 2:
      CONT1 = 0;
      CONT2 = 1;
      CONT3 = 0;
      CONT4 = 0;
      DATA=shuma[data2];
      break;

    case 3:
      CONT1 = 0;
      CONT2 = 0;
      CONT3 = 1;
      CONT4 = 0;
      DATA=shuma[data3];
      break;

    case 4:
      CONT1 = 0;
      CONT2 = 0;
      CONT3 = 0;
      CONT4 = 1;
      DATA=shuma[data4];
      break;

    default:
      break;
  }

  single +=1;
  if(single == 5) single = 1;

}
*/
#pragma CODE_SEG DEFAULT


/*************************************************************/
/*                    设置中断优先级                         */
/*************************************************************/

void Interrupt_Priorrity_Set(void)
{
  INT_CFADDR=0xE0;
  INT_CFDATA7=0x06;
  INT_CFADDR=0xD0;
  INT_CFDATA2=0x05;

}



/*************************************************************/
/*                         主函数                            */
/*************************************************************/
void main(void) {
  DisableInterrupts;
  INIT_PLL();
  //initialize_ect();

  //Interrupt_Priorrity_Set();

  //INIT_port();
  INIT_SCI();
  LEDCPU_dir=1;
  LEDCPU=0;
  send = &data4;
  //send = putstring;
  EnableInterrupts;

  delay1ms(1000);
  wendu=read_T();               //读取温度值

  for(;;)
  {
     delay1ms(1000);
     wendu=read_T();               //读取温度值
                 //send = &data4;
                 //SCI_send(data4);
                 if(wendu<2001)                //温度为0上的温度
                 {               
        wendu&=0x07ff;
        zhengshu=wendu/16;        //计算温度的整数部分
        xiaoshu=(wendu*25/4)%100; //计算温度的小数部分
        data1=(zhengshu%100)/10;
        data2=zhengshu%10+10;   //显示小数点
        data3=xiaoshu/10;
        data4=xiaoshu%10;
                 }
                 else
                 {                        
                          wendu=~(wendu-1);                                
        zhengshu=wendu/16;             //计算温度的整数部分
                          xiaoshu=(wendu*25/4)%100;      //计算温度的小数部分
        data1=20;
        if(zhengshu/10==0)     //计算温度的各位的值
        {
            data2 = zhengshu%10+10;
            data3 = xiaoshu/10;
            data4 = xiaoshu%10;
        }
        else
        {
            data2=zhengshu/10;            
            data3=zhengshu%10+10;
            data4=xiaoshu/10;
        }
                 }
                 
                 //send = &data4;
                 //send = putstring;
  }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
东东洋
1楼-- · 2019-07-15 19:13
最终想写一个下位机不停的通过串口发实时数据,而上位机也可以发送指令控制下位机的一些开关设备,现在单独的中断发送和中断接收,温度采集等都可以实现了,但是怎么把它们结合起来?困扰好几天了
东东洋
2楼-- · 2019-07-15 23:48
大家可以去我这个号的帖子里回复,有微薄积分可以拿,欢迎大家讨论,最终实现会把代码总结分享出来

一周热门 更多>