初学MSP430,怎么用MSP430g2553和HS101实现湿度传感器的设计?
时间:10-02
整理:3721RD
点击:
初学MSP430,怎么用MSP430g2553和HS101实现湿度传感器的设计,把湿度显示在LCD1602上。单片机是如何读取555输入的方波,资料上51单片机的原理能够明白,但是该怎么转换成MSP430的呢?
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED_RS=P2^0;
sbit LED_RW=P2^1;
sbit LED_EN=P2^2;
sbit key1=P2^3;
sbit key2=P2^4;
uchar code cdis3[]={"shidujishiyan"}
uchar code cdis4[]={"shidu: %"}
uchar code cdis5[]={"the system of "}
uchar code cdis6[]={" hum "}
unsigned char data display[5]= {0x00,0x00,0x00,0x00,0x00}
unsigned char code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,,
0x05,0x06,0x06,0x07,0x08,0x08,0x09}
unsigned char code mytab[8]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00}
bit int_flag; //定时器0 1s 到标志位
unsigned char volatile int_count; //定时器0中断次数
unsigned char volatile T1count; //定时器1中断次数
unsigned long sum=0; //1S内脉冲个数
unsigned long wet=0;
unsigned char le[6]; //LED显示缓存
#define delayNOP() {_nop_()_nop_()_nop_()_nop_()}
void delay1(int ms)
{
unsigned char y
while(ms--)
{
for(y=0;y<250;y++)
{
_nop_()
_nop_()
_nop_()
_nop_()
}
}
}
//检查LED忙状态
bit lcd_busy()
{
bit result
LCD_RS=0
LCD_RW=1
LCD_EN=1
delayNOP()
result=(bit)(P0&0x80)
LCD_EN=0
return(result)
}
//写数据到LCD
void lcd_wcmd(uchar cmd)
{
while(lcd_busy())
LCD_RS=0
LCD_RW=0
LCD_EN=0
_nop_()
_nop_()
P0=cmd
delayNOP()
LCD_EN=1
delayNOP()
LCD_EN=0
}
void lcd_wdat(uchar dat)
{
while(lcd_busy())
LCD_RS=1
LCD_RW=0
LCD_EN=0
P0=dat
delayNOP()
LCD_EN=1
delayNOP()
LCD_EN=0
}
void lcd_init()
{
delay1(15)
lcd_wcmd(0x01)
lcd_wcmd(0x38)
delay1(5)
lcd_wcmd(0x38)
delay1(5)
lcd_wcmd(0x38)
delay1(5)
lcd_wcmd(0x0c)
delay1(5)
lcd_wcmd(0x06)
delay1(5)
lcd_wcmd(0x01)
delay1(5)
}
//设定显示位置
void lcd_pos(uchar pos)
{
lcd_wcmd(pos|0x80) //数据指针=80+地址变量
}
//自定义字符写入CGRAM
void writetab()
{
unsigned char i
lcd_wcmd(0x40)
for(i=0;i<8;i++)
lcd_wdat(mytab)
}
//湿度测量
//软件延时
void delays(unsigned int cnt)
{
while(--cnt);
}
//定时器初始化
void inti_t0(void)
{
TMOD=((TMOD&0xF0)|0x01); //定时器0工作于方式1
//TH0=(65536-50000)/256;
//TL0=(65535-50000)%256;
TH0=0x3C;
TL0=0xB0;
}
//定时器1初始化
void inti_t1(void)
{
TMOD=((TMOD&0x0F)|0x50);
TH1=0x00;
TL1=0x00;
}
//定时器0中断服务程序 定时1s
void time_t0(void) interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
int_count++;
if(int_count==20) //20*50000=1s
{
TR1=0;
int_flag=1;
int_count=0;
}
}
//定时器1中断服务程序 计数
void time_t1(void)interrupt 3
{
T1count++;
}
//湿度显示函数
void disp(void)
{
int_flag=0;
sum=TL1+TH1*256+T1count*65536;//计算1秒内脉冲的个数
//以下将数据格式化,转成LED可显示的BCD码
wet=100-(sum-4000)/50; //湿度计算公式
le[0]=wet%10;
wet=wet/10;
le[1]=wet%10;
wet=wet/10;
le[2]=wet%10;
wet=wet/10;
int_count=0;
T1count=0;
lcd_pos(0x4a)
lcd_wdat(le[2]+48);
lcd_pos(0x4b)
lcd_wdat(le[1]+48);
lcd_pos(0x4c)
lcd_wdat(le[0]+48);
delays(100);
TH1=0x00;
TL1=0x00;
TR1=1; //T1重新开始计数
}
//湿度显示菜单
void shidu_Menu()
{
uchar m
lcd_pos(0x00)
m=0
while(m<16)
{
lcd_wdat(cdis3[m])
m++
}
lcd_pos(0x40)
m=0
while(m<16)
{
lcd_wdat(cdis4[m])
m++
}
writetab()
delay1(5)
lcd_pos(0x4d)
lcd_wdat(0x00)
}
//主函数
void main()
{
EA=1;
inti_t0();
inti_t1();
ET0=1;
ET1=1;
TR0=1;
TR1=1;
lcd_inti() //初始化LCD
//T0中断发生时重新计数50ms,若满20次(1s),则显示标志位置位,停止计数
//T1溢出就T1count加1,并且初始值为0
while(1)
{
shidu_Menu();
if(int_flag==1)
{
disp();
delay1(2500);
}
}
}
www.moteeoeo.com
www.snsmote.com
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED_RS=P2^0;
sbit LED_RW=P2^1;
sbit LED_EN=P2^2;
sbit key1=P2^3;
sbit key2=P2^4;
uchar code cdis3[]={"shidujishiyan"}
uchar code cdis4[]={"shidu: %"}
uchar code cdis5[]={"the system of "}
uchar code cdis6[]={" hum "}
unsigned char data display[5]= {0x00,0x00,0x00,0x00,0x00}
unsigned char code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,,
0x05,0x06,0x06,0x07,0x08,0x08,0x09}
unsigned char code mytab[8]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00}
bit int_flag; //定时器0 1s 到标志位
unsigned char volatile int_count; //定时器0中断次数
unsigned char volatile T1count; //定时器1中断次数
unsigned long sum=0; //1S内脉冲个数
unsigned long wet=0;
unsigned char le[6]; //LED显示缓存
#define delayNOP() {_nop_()_nop_()_nop_()_nop_()}
void delay1(int ms)
{
unsigned char y
while(ms--)
{
for(y=0;y<250;y++)
{
_nop_()
_nop_()
_nop_()
_nop_()
}
}
}
//检查LED忙状态
bit lcd_busy()
{
bit result
LCD_RS=0
LCD_RW=1
LCD_EN=1
delayNOP()
result=(bit)(P0&0x80)
LCD_EN=0
return(result)
}
//写数据到LCD
void lcd_wcmd(uchar cmd)
{
while(lcd_busy())
LCD_RS=0
LCD_RW=0
LCD_EN=0
_nop_()
_nop_()
P0=cmd
delayNOP()
LCD_EN=1
delayNOP()
LCD_EN=0
}
void lcd_wdat(uchar dat)
{
while(lcd_busy())
LCD_RS=1
LCD_RW=0
LCD_EN=0
P0=dat
delayNOP()
LCD_EN=1
delayNOP()
LCD_EN=0
}
void lcd_init()
{
delay1(15)
lcd_wcmd(0x01)
lcd_wcmd(0x38)
delay1(5)
lcd_wcmd(0x38)
delay1(5)
lcd_wcmd(0x38)
delay1(5)
lcd_wcmd(0x0c)
delay1(5)
lcd_wcmd(0x06)
delay1(5)
lcd_wcmd(0x01)
delay1(5)
}
//设定显示位置
void lcd_pos(uchar pos)
{
lcd_wcmd(pos|0x80) //数据指针=80+地址变量
}
//自定义字符写入CGRAM
void writetab()
{
unsigned char i
lcd_wcmd(0x40)
for(i=0;i<8;i++)
lcd_wdat(mytab)
}
//湿度测量
//软件延时
void delays(unsigned int cnt)
{
while(--cnt);
}
//定时器初始化
void inti_t0(void)
{
TMOD=((TMOD&0xF0)|0x01); //定时器0工作于方式1
//TH0=(65536-50000)/256;
//TL0=(65535-50000)%256;
TH0=0x3C;
TL0=0xB0;
}
//定时器1初始化
void inti_t1(void)
{
TMOD=((TMOD&0x0F)|0x50);
TH1=0x00;
TL1=0x00;
}
//定时器0中断服务程序 定时1s
void time_t0(void) interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
int_count++;
if(int_count==20) //20*50000=1s
{
TR1=0;
int_flag=1;
int_count=0;
}
}
//定时器1中断服务程序 计数
void time_t1(void)interrupt 3
{
T1count++;
}
//湿度显示函数
void disp(void)
{
int_flag=0;
sum=TL1+TH1*256+T1count*65536;//计算1秒内脉冲的个数
//以下将数据格式化,转成LED可显示的BCD码
wet=100-(sum-4000)/50; //湿度计算公式
le[0]=wet%10;
wet=wet/10;
le[1]=wet%10;
wet=wet/10;
le[2]=wet%10;
wet=wet/10;
int_count=0;
T1count=0;
lcd_pos(0x4a)
lcd_wdat(le[2]+48);
lcd_pos(0x4b)
lcd_wdat(le[1]+48);
lcd_pos(0x4c)
lcd_wdat(le[0]+48);
delays(100);
TH1=0x00;
TL1=0x00;
TR1=1; //T1重新开始计数
}
//湿度显示菜单
void shidu_Menu()
{
uchar m
lcd_pos(0x00)
m=0
while(m<16)
{
lcd_wdat(cdis3[m])
m++
}
lcd_pos(0x40)
m=0
while(m<16)
{
lcd_wdat(cdis4[m])
m++
}
writetab()
delay1(5)
lcd_pos(0x4d)
lcd_wdat(0x00)
}
//主函数
void main()
{
EA=1;
inti_t0();
inti_t1();
ET0=1;
ET1=1;
TR0=1;
TR1=1;
lcd_inti() //初始化LCD
//T0中断发生时重新计数50ms,若满20次(1s),则显示标志位置位,停止计数
//T1溢出就T1count加1,并且初始值为0
while(1)
{
shidu_Menu();
if(int_flag==1)
{
disp();
delay1(2500);
}
}
}
www.moteeoeo.com
www.snsmote.com
没用过430,帮顶