历史上的今天
今天是:2025年01月30日(星期四)
2018年01月30日 | MSP430与DS18B20驱动程序
2018-01-30 来源:eefocus
**文 件 名: ds18b20.c
**描 述: 利用但总线DS18B20测温程序,并在LCD显示,取三位有效小数位。整数部分两位。共5位显示
#include
#define SEGE 0X80
#define SEGH 0X40
#define SEGF 0X20
#define SEGC 0X10
#define SEGG 0X08
#define SEGD 0X04
#define SEGB 0X02
#define SEGA 0X01
const unsigned char digit[10] =
{
SEGA|SEGB|SEGC|SEGD|SEGE|SEGF, /* "0" LCD segments a+b+c+d+e+f */
0x12, /* "1" */
0x8F, /* "2" */
0x1F, /* "3" */
0x3A, /* "4" */
0x3D, /* "5" */
0xBD, /* "6" */
0x13, /* "7" */
0xBF, /* "8" */
0x3F /* "9" */
};
#define DQ1 P4OUT|=BIT4
#define DQ0 P4OUT&=~BIT4
float Temper=0.0;
int temperature=0;
unsigned char Error = 0;
//----------------------------------
//功能:us 级别延时
// n=10,则延时10*5+6=56uS
//----------------------------------
void DelayNus(unsigned int n)
{
while(n--){};
}
//-----------------------------------
//功能:写18B20
//-----------------------------------
void Write_18B20(unsigned char n)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ0;
DelayNus(1);//延时13us 左右
if((n&0X01)==0X01)
DQ1;
else
DQ0;
n=n>>1;
DelayNus(9);//延时50us 以上
DQ1;
}
}
//------------------------------------
//功能:读取18B20
//------------------------------------
unsigned char Read_18B20(void)
{
unsigned char i;
unsigned char temp;
for(i=0;i<8;i++)
{
temp=temp>>1;
DQ0;
_NOP();//延时1us
DQ1;
_NOP();_NOP();//延时5us
_NOP();_NOP();_NOP();
P4DIR&=~BIT4;
if((P4IN&BIT4)==0)
{
temp=temp&0x7F;
}
else
{
temp=temp|0x80;
}
DelayNus(7);//延时40us
P4DIR|=BIT4;
DQ1;
}
return temp;
}
//-----------------------------------
void Init (void)
{
DQ0;
DelayNus(50);//延时500us
DQ1;
DelayNus(17);//延时90us
P4DIR&=~BIT4;
if((P4IN&BIT4)==BIT4) //0001 1111b=1f
{
Error =1; //失败1
P4DIR|=BIT4;
}
else
{
Error = 0;//初始化成功
P4DIR|=BIT4;
DQ1;
}
}
//----------------------------------
void Skip(void)
{
Write_18B20(0xCC);
}
//----------------------------------
void Convert (void)
{
Write_18B20(0x44);
}
//----------------------------------
void ReadDo (void)
{
Write_18B20(0xbe);
}
//----------------------------------
void ReadTemp (void)
{
char low,high; //温度值
low=Read_18B20(); //读低位
high=Read_18B20(); //读高位
temperature=(high&0x0f);
temperature<<=8;
temperature|=low;
Temper=temperature*0.0625;
}
void GetTemp(void)
{
Init();
Skip();
Convert();
DelayNus(60000);
DelayNus(60000);
DelayNus(60000);//延时1s以上
Init();
Skip();
ReadDo();
ReadTemp();
}
void InitLcd(void)
{
LCDCTL = LCDON + LCD4MUX + LCDSG0_1; // LCD on, 4-Mux, segments S0-S15
BTCTL = BT_fLCD_DIV128; // LCD cLOCk freq is ACLK/128
P5SEL = 0xFC; // Select P5.2-7 as Com and Rxx
}
void display_number(unsigned long value, int start, int width)
{
int i;
for (i = 0; i < width; i++)
{
LCDMEM[7 + i - start] = digit[value%10]; // remainder = character in table to display
value /= 10;
}
}
void Lcd_Clr(void)
{
volatile unsigned char i;
for (i=0; i<7; i++)
{
LCDMEM = 0;
}
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 停狗
P4DIR |=BIT4;
DQ1;
InitLcd();
Lcd_Clr();
while(1)
{
GetTemp();
display_number((unsigned long int)(Temper*1000),7,5);
LCDMEM[3] |= SEGH;
}
}
上一篇:MSP430超声波测距
下一篇:三星单片机AD转换程序
史海拾趣
|
需求: 设置一台全方位云台摄像机,带红外(80米以上),语音视频解码传输设备 车载UPS电源(汽车发电机70A),不考虑市电接入根据以上信息,在7月10号上午12点以前,利用现有平台或重新组建 ...… 查看全部问答> |
|
目录: 详细信息: 书籍作者:美:M.V.K.查利 出版社:科学出版社 图书类别:理科、工程技术 出版时间:1985-03 印刷时间:1985-03-01 开本:32开 页数:257 页… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:28 编辑 近年 来 , 随着计算机、通信以及网络等关键技术的迅速发展,人们对多媒体通信的需求也与日俱增,图像(视频)通信作为多媒体通信中的一个基本组成部分,得到了广泛的重视。在许多实际的通信系统中,基 ...… 查看全部问答> |
|
FROM指令和TO指令来执行PLC基本单元与模拟量输入/输出模块之间的数据通信 实际上读写操作都是对模拟量输入或输出模块中的缓冲器BFM进行的。下面以FX2N-4AD-TC模块为例,其缓冲寄存器BFM分配见表17-4。 #30为识别码,FX2N-4AD-TC模块的识别码为K20 ...… 查看全部问答> |
|
如果从工程师和研究生的专业方向来看,电子信息专业的方向大概有1)数字电子线路方向。从事单片机(8位的8051系列、32位的ARM系列等等)、FPGA(CPLD)、数字逻辑电路、微机接口(串口、并口、USB、PCI)的开发,更高的要求会写驱动程序、会 ...… 查看全部问答> |
|
最近在做FPGA的项目,经常有人问我,FPGA的功耗多大,额定电流多少。我在datasheet上没有看到啊。 FPGA的电压不是很多种么,请问有知道的朋友么… 查看全部问答> |
|
设计目标,12V锂电池供电(11.1-12.6V之间波动),获得稳定高亮白光LED 初步确定目标之后选择LED型号,综合考虑颜色、功率、体积之后选择Xlamp XM-L这一款 考虑效率、体积、工作温度等因素,选取了第三款驱动电路 基本概况如下,效率可达79% ...… 查看全部问答> |




