/******************************************************************
* 哈尔滨同翔电子
* 430单片机学习板
* EMAIL:ming_2100@163.com
* QQ: 306136554
* http://shop33987716.taobao.com
*******************************************************************/
/******************************************************************
*CPU: MSP430F135
*晶振:7.3728MHZ
*编译环境:IAR 3.2
*******************************************************************/
#include "msp430x13x.h"
#include "intrinsics.h"
#include "18B20.h"
#include "uart.h"
unsigned char printbuf[20];
const unsigned char a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char one,two,three,four;
unsigned int led_count=0;
/*******************************************************
*函数名称:Led7_Display
*函数功能:分时给7段数码管送数,每一位送数时间大约为50ms
*作 者:同翔电子
*******************************************************/
void Led7_Display(void)
{
P4OUT=a[one];
P5OUT=0x08;
delay_100us(5);
P5OUT=0x00;
P4OUT=a[two];
P5OUT=0x04;
delay_100us(5);
P5OUT=0x00;
P4OUT=a[three];
P5OUT=0x02;
delay_100us(5);
P5OUT=0x00;
P4OUT=a[four];
P5OUT=0x01;
delay_100us(5);
P5OUT=0x00;
}
/*******************************************************
*函数名称:Led7_Analyze
*函数功能:为4位7段数码管提供每一位应该显示的数字
*作 者:同翔电子
*******************************************************/
void Led7_Analyze(unsigned int l)
{
//l=l%10000;
one=l/1000;
two=(l/100)%10;
three=(l%100)/10;
four=(l%100)%10;
}
/*******************************************************
*函数名称:Led7
*函数功能:通沟调用函数Led7_Analyze和Led7_Display来实现
* 4位7段数码管的显示功能
*作 者:同翔电子
*******************************************************/
void Led7(void)
{
unsigned char a;
for(a=0;a<100;a++)
{
Led7_Display();
}
//Led7_Display();
led_count++;
Led7_Analyze(led_count);
if(led_count>9999)
{
led_count=0;
}
}
/******************************************************************************
** 函数名:void Get_Temp(void)
** 输 入:无
** 输 出: Ddata;
** 功能描述:读取18B20 内部温度值,并把温度数据分别送到三
**全局变量中;
** 全局变量:Tmep_DataL = 个位温度值;
Tmep_DataH = 十位温度值;
Tmep_Data = 十六进制温度值;
** 调用模块:---------------------------------------------------------------
** delay_100us(5);延时函数;
** Rst_1820(); 18B20 复位函数;
** Write_Byte(0xcc);写18B20 函数;
** Read_Byte();读18B20 函数;
*******************************************************************************/
void Get_Temp(void)
{
unsigned char Tmep_DataL,Tmep_DataH,Tmep_Data;
Rst_1820(); //Display(10);
Write_Byte(0xcc); //Display(10);
Write_Byte(0x44); //Display(10);
Rst_1820(); //Display(10);
Write_Byte(0xcc); //Display(10);
Write_Byte(0xbe); //Display(10);
Tmep_DataL=Read_Byte();//Display(10);
Tmep_DataH=Read_Byte();//Display(10);
Tmep_Data=(Tmep_DataH<<4)|(Tmep_DataL>>4);
three=Tmep_Data/10;
four=Tmep_Data%10;
printf("current tempration:\r\n");
printchar(three);
printchar(four);
printf("\r\n");
}
/******************************************************************************
** 函数名:void Write_Byte(unsigned char Ddata)
** 输 入:Ddata
** 输 出: 无
** 功能描述:把输入的CHAR 型数据串行输出到18B20 内部;
** 全局变量:无
** 调用模块:delay_100us(5);延时函数;
** 作 者:wangjin
** 日 期:2007.08.28
** 修 改:
** 日 期:
** 版本 :V1.0
*******************************************************************************/
void Write_Byte(unsigned char Ddata)
{
unsigned char i;
for(i=0;i<8;i++)
{
//Dq=0;
DS18B20_OUT_SET;
DS18B20_OUT_0;
delay_5us();
delay_10us();
//Dq=Ddata&0x01;
if(Ddata&0x01==1)
{
DS18B20_OUT_1;
}
else
{
DS18B20_OUT_0;
}
delay_10us();
delay_10us();
delay_10us();
delay_10us();
delay_10us();
//Dq=1;
DS18B20_OUT_1;
Ddata=Ddata/2;
}
}
/******************************************************************************
** 函数名:unsigned char Read_Byte(void)
** 输 入:无
** 输 出: Ddata;
** 功能描述:读18B20 内部的数据,并把串行的转为并行并返回;
** 全局变量:无
** 调用模块:delay_100us(5);延时函数;
*******************************************************************************/
unsigned char Read_Byte(void)
{
unsigned char i;
unsigned char Ddata;
for(i=0;i<8;i++)
{
//Dq=0;
DS18B20_OUT_SET;
DS18B20_OUT_0;
delay_5us();
delay_10us();
Ddata>>=1;
//Dq=1;
DS18B20_OUT_1;
//if(Dq)
DS18B20_IN_SET;
if(DS18B20_Check)
{
Ddata|=0x80;
}
delay_10us();
delay_10us();
delay_10us();
delay_10us();
}
return(Ddata);
}
/******************************************************************************
** 函数名:void Rst_1820()
** 输 入:无
** 输 出: Tmep_int;为复位成功后的数据.为1 则复位成功;
** 功能描述:帮助18B20 复位;
** 全局变量:Tmep_int 为全局变量;
** 调用模块:delay_100us(5);延时函数;
*******************************************************************************/
unsigned char Rst_1820(void)
{
unsigned char Tmep_int;
//Dq=1;
DS18B20_OUT_SET;
DS18B20_OUT_1;
_NOP();
//Dq=0;
DS18B20_OUT_0;
delay_100us(7);
//Dq=1;
DS18B20_OUT_1;
delay_10us();
delay_10us();
delay_10us();
//Tmep_int = DS18B20_Check;
DS18B20_IN_SET;
Tmep_int =DS18B20_Check;
delay_100us(2);
return Tmep_int;
}
/*******************************************************
*函数名称:delay_10us
*函数功能:延时程序 46个时钟
*作 者:同翔电子
*******************************************************/
void delay_10us(void)
{
unsigned char i=3;
while(i--)
{
_NOP();
_NOP();
_NOP();
_NOP();
}
}
void delay_5us(void)
{
unsigned char i=1;
while(i--)
{
_NOP();
_NOP();
_NOP();
_NOP();
}
}
/*******************************************************
*函数名称:delay_100us
*函数功能:延时程序
*作 者:同翔电子
*******************************************************/
void delay_100us(unsigned char i)
{
unsigned char temp1;
while(i--)
{
temp1=8;
while(temp1--)
{
delay_10us();
}
}
}
/*******************************************************
*函数名称:delay_ms
*函数功能:延时程序
*作 者:丫丫工作室
*******************************************************/
void delay_ms(unsigned char i)
{
unsigned char temp1;
while(i--)
{
temp1=85;
while(temp1--)
{
delay_10us();
}
}
}