mc9s12xep100板串口发送实时温度问题,请教大家。没分了,请大家不吝赐教,小弟不胜感激!
时间:10-02
整理:3721RD
点击:
单独的串口中断发送字符串和温度采集都没问题,发送实时变量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\r\n";
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;
}
}
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\r\n";
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;
}
}
最终想写一个下位机不停的通过串口发实时数据,而上位机也可以发送指令控制下位机的一些开关设备,现在单独的中断发送和中断接收,温度采集等都可以实现了,但是怎么把它们结合起来?困扰好几天了
大家可以去我这个号的帖子里回复,有微薄积分可以拿,欢迎大家讨论,最终实现会把代码总结分享出来