/***********************************************************
Declaration:CPU is dspic30f6010a,crystal:10Mhz,ccpl:8,speed:20Mhz
Author is Heri Cui
Date is 22/09/07
In order to replace 8xc196mc for inverter
Attention:变量与数组写在一个文件中,直接包含就可以了
***********************************************************/
#include "p30f6010a.h" //这里包含过来就可以直接用了
#include "math.h"
#include "stdio.h"
#include "define.h" //定义部分
#include "initial.h" //初始化
/*************************************************************
延时10us子程序
*************************************************************/
void delay(uint i) //delay(1)最小延时14 us 延时子程序
{
uint i2;
i2=i*8;
while(i2--);
}
/*************************************************************
延时1us子程序
*************************************************************/
void delayy(void) //delay 延时1.7us子程序
{
;
}
unsigned char ReadOneChar(void)
{ //读一个字节
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
TRISE &=~0x0020;//输出
SomeNOP();
LATE &=~0x0020; //给脉冲信号0
SomeNOP();
SomeNOP();
SomeNOP();
dat>>=1;
LATE |=0x0020; // 给脉冲信号1
SomeNOP();
TRISE |=0x0020;//输入
SomeNOP();
if(_RE5) dat|=0x80;
delay(7);
}
return(dat);
}
void WriteOneChar(unsigned char dat)
{ //写一个字节
unsigned char i=0;
TRISE &=~0x0020; //输出
for (i=8; i>0; i--)
{
LATE &=~0x0020; //0
SomeNOP();
SomeNOP();
SomeNOP();
if(dat&0x01)
LATE |= 0x0020; //输入
else
LATE &=~0x0020; // 给脉冲信号
delay(8);
LATE |=0x0020;
SomeNOP();
dat>>=1;
}
}
/*************************************************************
初始化DS18B20温度传感器子程序
*************************************************************/
void Ini_ds18b20(void)
{
uchar yes_ds18b20=1;
TRISE=TRISE&0xffdf;
LATE=LATE|0x0020;
asm("nop");
asm("nop");
asm("nop");
LATE=LATE&0xffdf;
delay(56); //精确延时 大于 14*40=540us
LATE=LATE|0x0020;
delay(7); //14*5us 15到60us,大于60us,肯定是低电平的
//////
TRISE=TRISE|0x0020;
if(_RE5) yes_ds18b20=1;
else yes_ds18b20=0;
delay(25); //这里要大于240us
TRISE=TRISE&0xffdf;
LATE=LATE|0x0020;
delay(25); //delay(5)+delay(18)+delay(18)要超过480us
}
/*************************************************************
从DS18B20写位到CPU子函数
*************************************************************/
void Write_bit(uchar b)
{
TRISE=TRISE&0xffdf;
if(b)
{
LATE=LATE&0xffdf;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
LATE=LATE|0x0020;
delay(7); //14*6=84
}
else //写0
{ /*
LATE=LATE|0x0020;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");*/
LATE=LATE&0xffdf;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
delay(7); //14*6=84
LATE=LATE|0x0020;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
}
/*************************************************************
从DS18B20读位到CPU子函数
*************************************************************/
uint Read_bit()
{
uchar b;
TRISE=TRISE&0xffdf;
/*
LATE=LATE|0x0020;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");*/
asm("nop");
asm("nop");
asm("nop");
LATE=LATE&0xffdf; //读开始
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
LATE=LATE|0x0020;
asm("nop"); //这时才开始读
TRISE=TRISE|0x0020;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
if(LATE&0x0020)
b=1;
else
b=0;
delay(7); //14*6us=84us
TRISE=TRISE&0xffdf;
LATE=LATE|0x0020;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
return b;
}
/*************************************************************
从DS18B20写字节到CPU子函数
*************************************************************/
void Write_ds18b20(uchar dat)
{
uchar i;
uchar k;
for(i=8;i>0;i--)
{
k=dat&0x01;
dat=dat>>1;
Write_bit(k);
}
}
/*************************************************************
从DS18B20读字节到CPU子函数
*************************************************************/
uint Read_ds18b20()
{
uchar i;
uint dat;
uchar k;
dat=0;
for(i=16;i>0;i--)
{
k=Read_bit();
if(k){dat=dat>>1;dat=dat|0x8000;}
else {dat=dat>>1;dat=dat&0x7fff;}
return dat;
}
}
/*************************************************************
读取温度子程序,转换精度在不编程的情况下,是默认的12位方式
精确到0.0625度
*************************************************************/
uint ReadTemperature(void)
{
uchar T,T1;
Ini_ds18b20();
WriteOneChar(0xcc);
WriteOneChar(0x44); //启动温度转换
delay(8000); //750ms 76.8*10=768
delay(8000);
delay(8000);
delay(8000);
delay(8000);
delay(8000);
delay(8000);
delay(8000);
delay(8000);
delay(8000);
delay(8000);
delay(8000);
delay(8000);
delay(8000);
Ini_ds18b20();
WriteOneChar(0xcc);
WriteOneChar(0xbe);
T=ReadOneChar();
T1=ReadOneChar();
T>>=4;
T1<<=4;
T1+=T;
return T1;
}
/*************************************************************
数据送显示程序
*************************************************************/
void send_data(uchar data8)
{
uchar data9= data8;
uchar cont;
for(cont=0;cont<8;cont++)
{
if(data9&0x80)
{
_LATC13=1;
delay(5);
}
else
{
_LATC13=0;
delay(4);
}
_LATD0=0; //时钟的跳变
delay(5);
_LATD0=1;
data9<<=1;
delay(4);
}
}
/*************************************************************
读DS18b20直接得到的温度数据转化成十进制数据
*************************************************************/
void data_deal(uint data4)
{
uint data5=data4;
data_100=(unsigned char)((data5/100)%10);
data_10=(unsigned char)((data5/10)%10);
data_1=(unsigned char)(data5%10);
}
/*************************************************************
主程序
*************************************************************/
int main(void) //主函数
{
_TRISC13=0;
_TRISD0=0;
_TRISD10=0;
_TRISD1=0; //DS18B20数据线
//_RE5=0;
Ini_ds18b20();
while(1)
{
/* delay(1);
_RD10=1;
delay(1);
//asm("nop");
//delay(8000); //750ms 76.8*10=768
_RD10=0;
*/
while(jj1>60000) //这种延时方式不在原地打转,所以不浪费系统时间
{