该例程是基于MSP430单片机,利用430单片机内部的温度传感器将数据传到连接在单片机的433M无线模块上,然后由无线模块将数据发送出去,发送至连接在PC机上的433M,由C语言程序将433M的信息(包含通信协议)读取并且写入一个txt文件,代替串口调试助手。
附上MSP430的程序
#include <msp430x14x.h>
#include "Config.h" //????????,????IO????
ulong temp;
ulong TemperF; //????
ulong TemperC;
//***********************************************************************
// MSP430IO初始化
//***********************************************************************
uchar i = 0;
//端口的初始化
void Port_init()
{
P6SEL = 0x00;
P6DIR = 0xff; //输出状态
P4SEL = 0x00;
P4DIR = 0xFF; //???????
P5SEL = 0x00;
P5DIR|= BIT5 + BIT6 + BIT7; //??????????
}
void Send_Byte(uchar data)
{
while(!(IFG1&UTXIFG0)); //?????????????
U0TXBUF=data;
}
//*************************************************************************
// MSP430串口的初始化
//*************************************************************************
void UART_Init()
{
U0CTL|=SWRST + CHAR; //??SWRST,8?????
U0TCTL|=SSEL1; //SMCLK?????
U0BR1=baud_h; //BRCLK=8MHZ,Baud=BRCLK/N
U0BR0=baud_l; //N=UBR+(UxMCTL)/8
U0MCTL=0x00; //??????0,???9600bps
ME1|=UTXE0; //UART0????
ME1|=URXE0; //UART0????
U0CTL&=~SWRST;
IE1|=URXIE0;
/* U1CTL|=SWRST + CHAR; //??SWRST,8?????
U1TCTL|=SSEL1; //SMCLK?????
U1BR1=baud_h; //BRCLK=8MHZ,Baud=BRCLK/N
U1BR0=baud_l; //N=UBR+(UxMCTL)/8
U1MCTL=0x00; //??????0,???9600bps
ME2|=UTXE1; //UART0????
ME2|=URXE1; //UART0????
U1CTL&=~SWRST;
IE2|=URXIE1; */
P3SEL|= BIT4 + BIT5; //??IO????????,??UART??
P3DIR|= BIT4; //??TXD0??????
}
//接收中断
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX_ISR(void)
{
uchar data;
data=U0RXBUF;
P6OUT = data;
}
//*************************************************************************
// ADC初始化函数
//*************************************************************************
void ADC_Init()
{
P6SEL|=0x01; //??ADC??
ADC12CTL0|= ADC12ON + SHT0_2 + REF2_5V + REFON; //ADC?????,16?CLK,????2.5V
ADC12CTL1|= ADC12SSEL1 + ADC12SSEL0; //SMCLK????
ADC12MCTL0= SREF0 + INCH_0; //??????????,??????0
ADC12IE|= 0x01; //????
ADC12CTL0|= ENC; //?????
}
//*************************************************************************
// ADC中断程序
//*************************************************************************
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR(void) {
temp = ADC12MEM0; //保存转换结果
}
void Print_Str(uchar *s)
{
while(*s != '\0')
{
Send_Byte(*s++);
}
}
//*************************************************************************
// 主函数
//*************************************************************************
void main(void)
{
WDT_Init(); //看门狗设置
UART_Init();
Clock_Init(); //系统时钟设置
Port_init(); //系统初始化,设置IO口属性
delay_ms(100); //延时100ms
ADC12CTL0 = SHT0_8 + REFON + ADC12ON; //内部1.5V参考电压,打开ADC12模块,设置采样保持定时器
ADC12CTL1 = SHP; //采使用采样定时器
ADC12MCTL0 = SREF_1 + INCH_10; //参考电压和通道选择
ADC12IE = BIT0; //ADC12MEM0
ADC12CTL0 |= ENC; //允许转换
_BIS_SR(GIE); //开启系统中断
while(1)
{
ADC12CTL0 |= ADC12SC; //开始采样并AD转换
//oF = ((x/4096)*1500mV)-923mV)*1/1.97mV = x*761/4096 - 468
//IntDegF = (ADC12MEM0 - 2519)* 761/4096
TemperF = (temp - 2519) * 761;
TemperF = TemperF / 4096; //简化的华氏温度转换公式
//oC = ((x/4096)*1500mV)-986mV)*1/3.55mV = x*423/4096 - 278
//IntDegC = (ADC12MEM0 - 2692)* 423/4096
TemperC = (temp - 2692) * 423;
TemperC = TemperC / 4096; //简化的摄氏温度转换公式
Send_Byte('!'); //编写简单的通信协议,避免不同的433M之间数据接收混乱
Send_Byte('!');
Send_Byte('!');
Send_Byte(TemperC/10+0x30);
Send_Byte(TemperC%10+0x30);
Send_Byte('C');
Send_Byte(' ');
Send_Byte('#'); 结束标志
delay_ms(1500);
_NOP(); //加入断点可用来观察TemperF和TemperC结果
}
}
接着是C语言读取串口的C语言程序:
#include <stdio.h>
#include <windows.h>
FILE * fileFP;
int main(void)
{
FILE *fp;
char temp;
int count = 0, cnt = 0;
//char buf[100];
if((fp=fopen("com3", "r")) == NULL) puts("can't open the com/n");
if((fileFP=fopen("testdata.txt", "w")) == NULL) puts("can't open the file/n");
while(1)
{
temp = 0;
fscanf(fp, "%c", &temp);
if(temp == '!') //判断协议
count++;
if(temp == '#')
{
count = 0;
cnt++; // 接收数据计数
}
if(count == 3&&temp != '!')
{
putchar(temp);
fprintf(fileFP, "%c", temp);
}
else
Sleep(100);
if(cnt >= 5){ //设置每次读取五个数据
break;
}
}
fclose(fp); //关闭文件以及串口
fclose(fileFP);
return 0;
}