完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
初学MSP430,怎么用MSP430g2553和HS101实现湿度传感器的设计,把湿度显示在LCD1602上。单片机是如何读取555输入的方波,资料上51单片机的原理能够明白,但是该怎么转换成MSP430的呢?
#include #include #define uchar unsigned char #define uint unsigned int ***it LED_RS=P2^0; ***it LED_RW=P2^1; ***it LED_EN=P2^2; ***it key1=P2^3; ***it 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[i]) } //湿度测量 //软件延时 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); } } } |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
3056个成员聚集在这个小组
加入小组2982 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3709 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2367 浏览 1 评论
4833 浏览 1 评论
2595 浏览 1 评论
1571浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3709浏览 2评论
2982浏览 1评论
1767浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 10:31 , Processed in 1.441679 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号