基于msp430的数据传输程序.docx
《基于msp430的数据传输程序.docx》由会员分享,可在线阅读,更多相关《基于msp430的数据传输程序.docx(16页珍藏版)》请在冰豆网上搜索。
基于msp430的数据传输程序
基于msp430的数据传输程序
发送
#include
#include
#include
/***********dht11***************/
unsignedcharFLAG;
unsignedchartemp,TEMP;
unsignedcharT_data_H,T_data_L,RH_data_H,RH_data_L,checkdata;
unsignedcharT_data_H_temp,T_data_L_temp,RH_data_H_temp,RH_data_L_temp,checkdata_temp;
unsignedcharcomdata;
/*************************/
//unsignedchara,time;
unsignedcharRH_DATA,TH_DATA,ADD,a,data;
unsignedchartable[]={"H:
%T:
c"};
unsignedchartable1[]={"Light:
add:
01"};
voiddelay(intxms)//i=xms即延时约xms毫秒
{
inti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
voiddelay_10us()
{
unsignedchari;
for(i=0;i<40;i++);
}
voidwrite_com(unsignedcharcom)
{//写液晶命令函数
P3DIR=0x03;
P3OUT&=~BIT0;//rs=0
P3OUT&=~BIT1;//lcden=0
P2DIR=0xff;
P2OUT=com;//P0=com
delay(10);
P3OUT|=BIT1;//lcden=1
delay(10);
P3OUT&=~BIT1;//lcden=0
}
voidwrite_date(unsignedchardate)
{//写液晶数据函数
P3DIR=0x03;
P3OUT|=BIT0;//rs=1
P3OUT&=~BIT1;//lcden=0
P2DIR=0xff;
P2OUT=date;//P0=date
delay(10);
P3OUT|=BIT1;//lcden=1
delay(10);
P3OUT&=~BIT1;//lcden=0
}
voidinit_1602()
{//初始化函数
unsignedcharnum;
P3DIR=0x03;
P3OUT&=~BIT1;//lcden=0
P3OUT&=~BIT0;//rs=0
write_com(0x38);//1602液晶初始化
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)//写入液晶固定部分显示
{
write_date(table[num]);
delay(10);
}
write_com(0x80+0x40);
for(num=0;num<15;num++)
{
write_date(table1[num]);
delay(10);
}
}
voidwrite_shuzi(unsignedcharadd,chardate)
{
charshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidwrite_shuzi1(unsignedcharadd,chardate)
{
charshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidint_clk()
{
unsignedchari;
BCSCTL1&=~XT2OFF;//打开xt振荡器
BCSCTL2|=SELM1+SELS;//MCLK为8MHZ,SMCLK为1MHZ
do
{
IFG1&=~OFIFG;//清除震荡错误标志
for(i=0;i<100;i++)
_NOP();//延时
}
while((IFG1&OFIFG)!
=0);//如果标志为1,则继续循环等待
IFG1&=~OFIFG;
}
voidint_usart()
{
U0CTL|=SWRST;//复位串口
U0CTL|=CHAR;//8位数据
U0TCTL|=SSEL1;//时钟设置
U0BR0=0x00;
U0BR1=0x0d;
UMCTL0=0x00;//波特率2400
ME1|=UTXE0+URXE0;//使能接收和发送
U0CTL&=~SWRST;//清除串口复位信号
P3SEL|=BIT4;
P3SEL|=BIT5;//使用扩展功能
P3DIR|=BIT4;
}
sent_byte(unsignedchardata)
{
while((IFG1&UTXIFG0)==0);//判断发送缓存区是否结束
U0TXBUF=data;
}
voidint_pwm()
{
P1SEL|=BIT2;//P1.2作为pwm输出
P1DIR|=BIT2;
TACCR0=26;//pwm频率为10k.8000k/800=10k
TACCR1=13;//占空比1:
1
TACCTL1=OUTMOD0+OUTMOD1+OUTMOD2;//输出模式选择
TACTL|=TASSEL1+MC0;
}
voidCOM(void)//数据01确认
{
unsignedchari;
for(i=0;i<8;i++)
{
FLAG=2;
while((!
(P1IN&BIT7))&&FLAG++);//1bit是否结束
delay_10us();
temp=0;//26us~28us表示为0
if((P1IN&BIT7))
temp=1;//超过28us依然为高电平表示为1
FLAG=2;
while((P1IN&BIT7)&&FLAG++);
if(FLAG==1)
break;//FLAG溢出超时则跳出for循环
//判断数据位是0还是1
//如果高电平高过预定0高电平值则数据位为1
comdata<<=1;
comdata|=temp;
}
}
voidinit_DHT11()
{
P1DIR|=BIT7;
P1OUT|=BIT7;
delay(400);
}
voidRH(void)//-----湿温度读取子程序------------
{
P1DIR|=BIT7;
P1OUT&=~BIT7;
delay(300);//主机拉低高于18ms
P1OUT|=BIT7;//总线由上拉电阻拉高主机延时20us
delay_10us();
P1DIR&=~BIT7;//主机设为输入判断从机响应信号
if(!
(P1IN&BIT7))//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行
{
FLAG=2;
while((!
(P1IN&BIT7))&&FLAG++);//判断从机是否发出80us的低电平响应信号是否结束
FLAG=2;
while((P1IN&BIT7)&&FLAG++);//判断从机是否发出80us的高电平,如发出则进入数据接收状态
COM();//数据接收状态
RH_data_H_temp=comdata;//湿度整数8位
COM();
RH_data_L_temp=comdata;//湿度小数8位
COM();
T_data_H_temp=comdata;//温度整数8位
COM();
T_data_L_temp=comdata;//温度小数8位
COM();
checkdata_temp=comdata;//校验位
P1DIR|=BIT7;
P1OUT|=BIT7;
P1DIR&=~BIT7;
temp=(T_data_H_temp+T_data_L_temp+RH_data_H_temp+RH_data_L_temp);
if(temp==checkdata_temp)//数据校验正确执行
{
RH_data_H=RH_data_H_temp;
RH_data_L=RH_data_L_temp;
T_data_H=T_data_H_temp;
T_data_L=T_data_L_temp;
checkdata=checkdata_temp;
}
}
}
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//关看门狗
int_clk();//初始化时钟
init_1602();
int_usart();
init_DHT11();
int_pwm();
P4DIR&=~BIT0;
while
(1)
{
RH();
delay(1500);
write_shuzi(2,RH_data_H);
delay(50);
write_shuzi(11,T_data_H);
delay(50);
if((P4IN&BIT0)==0)
{a=0;}
if((P4IN&BIT0)==1)
{a=1;}
write_shuzi1(6,a);
RH_DATA=((RH_data_H<<2)|0);//湿度
TH_DATA=((T_data_H<<2)|1);//温度
ADD=((a<<2)|2);//地址
sent_byte(RH_DATA);
delay(1000);
sent_byte(TH_DATA);
delay(1000);
sent_byte(ADD);
delay(1000);
//data=U0RXBUF;
//write_shuzi1(8,data);
}
}
接收:
#include
#include
#include
unsignedintm1,m2,data,data1,data2,data3,add;
unsignedchartable[]={"H:
%T:
c"};
unsignedchartable1[]={"Light:
Add:
"};
/***********dht11***************/
/*************************/
voiddelay(intxms)//i=xms即延时约xms毫秒
{
inti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
voiddelay1ms()
{
unsignedintk;
for(k=0;k<1333;k++)
_NOP();
}
voiddelayms(unsignedintz)
{
unsignedinth;
for(h=z;h>0;h--)
delay1ms();
}
voidwrite_com(unsignedcharcom)
{//写液晶命令函数
P6DIR=0x03;
P6OUT&=~BIT0;//rs=0
P6OUT&=~BIT1;//lcden=0
P2DIR=0xff;
P2OUT=com;//P0=com
delay(15);
P6OUT|=BIT1;//lcden=1
delay(15);
P6OUT&=~BIT1;//lcden=0
}
voidwrite_date(unsignedchardate)
{//写液晶数据函数
P6DIR=0x03;
P6OUT|=BIT0;//rs=1
P6OUT&=~BIT1;//lcden=0
P2DIR=0xff;
P2OUT=date;//P0=date
delay(15);
P6OUT|=BIT1;//lcden=1
delay(15);
P6OUT&=~BIT1;//lcden=0
}
voidinit_1602()
{//初始化函数
unsignedcharnum;
P4DIR=0x03;
P4OUT&=~BIT1;//lcden=0
P4OUT&=~BIT0;//rs=0
write_com(0x38);//1602液晶初始化
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)//写入液晶固定部分显示
{
write_date(table[num]);
delay(15);
}
write_com(0x80+0x40);
for(num=0;num<15;num++)
{
write_date(table1[num]);
delay(15);
}
}
voidwrite_shuzi(unsignedcharadd,chardate)
{
charshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidwrite_shuzi1(unsignedcharadd,chardate)
{
charshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidint_clk()
{
unsignedchari;
BCSCTL1&=~XT2OFF;//打开xt振荡器
BCSCTL2|=SELM1+SELS;//MCLK为8MHZ,SMCLK为1MHZ
do
{
IFG1&=~OFIFG;//清除震荡错误标志
for(i=0;i<100;i++)
_NOP();//延时
}
while((IFG1&OFIFG)!
=0);//如果标志为1,则继续循环等待
IFG1&=~OFIFG;
}
voidint_usart()
{
U0CTL|=SWRST;//复位串口
U0CTL|=CHAR;//8位数据
U0TCTL|=SSEL1;//时钟设置
U0BR0=0x00;
U0BR1=0x0d;
UMCTL0=0x00;//波特率2400
ME1|=UTXE0+URXE0;//使能接收和发送
U0CTL&=~SWRST;//清除串口复位信号
P3SEL|=BIT4;
P3SEL|=BIT5;//使用扩展功能
P3DIR|=BIT4;
}
voidMusic(z)//语音播放函数
{
P3DIR|=BIT2;
P3OUT|=BIT2;//RST=1;
delayms
(2);
P3OUT&=~BIT2;//RST=0;
delayms
(2);
while(z>0)
{
P3DIR|=BIT1;
P3OUT|=BIT1;//SCK=1;
delayms
(1);
P3OUT&=~BIT1;//SCK=0;
delayms
(1);
z--;
}
}
voidinit_yuyin()
{
P3DIR|=BIT0;
P3OUT|=BIT0;//NOW=1;
P3DIR|=BIT2;
P3OUT&=~BIT2;//RST=0;
P3DIR|=BIT1;
P3OUT&=~BIT1;//SCK=0;
P3OUT|=BIT2;//RST=1;
delayms
(2);
P3OUT&=~BIT2;//RST=0;
}
voidadd_yuyin(unsignedchara)
{
Music(a);
delayms(50);
P3DIR&=~BIT0;
while((P3IN&BIT0)==0);
delay(1000);
//P6DIR|=BIT3;
}
voidyuyin_wendu(unsignedchartem)
{
unsignedcharge,shi;
shi=tem/10;
ge=tem%10;
add_yuyin(0);
add_yuyin(23);
add_yuyin(shi+1);
add_yuyin(11);
add_yuyin(ge+1);
add_yuyin(20);
}
voidyuyin_shidu(unsignedcharshidu)
{
unsignedcharge,shi;
shi=shidu/10;
ge=shidu%10;
add_yuyin(0);
add_yuyin(24);
add_yuyin(21);
add_yuyin(shi+1);
add_yuyin(11);
add_yuyin(ge+1);
}
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//关看门狗
int_clk();//初始化时钟
init_1602();
int_usart();
init_yuyin();
write_shuzi1(13,1);
while
(1)
{
data=U0RXBUF;//读取接收到的数据
while((IFG1&URXIFG0)==0);
add=data&0x03;
delay(50);
switch(add)
{
case0:
data1=((data>>2)&0x3f);
write_shuzi(2,data1);
m1++;
if(m1==100)
{
yuyin_shidu(data1);
m1=0;
}
break;
case1:
data2=((data>>2)&0x3f);
write_shuzi(11,data2);
m2++;
if(m2==100)
{
yuyin_wendu(data2);
m2=0;
}
break;
case2:
data3=((data>>2)&0x3f);
write_shuzi1(6,data3);
break;
}
}
}