微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 初学MSP430,怎么用MSP430g2553和HS101实现湿度传感器的设计?

初学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

没用过430,帮顶

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top