金牌会员
- 积分
- 1217
- 威望
- 643
- 贡献
- 412
- 兑换币
- 409
- 注册时间
- 2013-9-28
- 在线时间
- 81 小时
- 毕业学校
- 哈工程
|
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
#define RS PORTB_BIT0 //1602
#define RW PORTB_BIT1
#define E PORTB_BIT2
#define DQ PORTB_BIT7// 18B20
#define DB0 DDRB_BIT0//
#define DB1 DDRB_BIT1//
#define DB2 DDRB_BIT2//
#define DB7 DDRB_BIT7//
#define DA DDRA
#define A PORTA
#define uchar unsigned char
#define uint unsigned int
unsigned char TMPH,TMPL;
//uint num;
uint temp2;
uint t2=0;
uchar k;
uchar tab[]={"07-05"};
uchar tab0[]={"CXRSYSJ"}; //code
#define jump_ROM 0xCC //跳过RAM
#define start 0x44 //温度变换
#define read_EEROM 0xBE //
/********************************************************************
* 名称 : enable(uchar del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void delaya()
{
int i,j;
for(i=0; i<=100; i++)
for(j=0; j<=50; j++)
;
}
void enable(uchar del) //写1602指令函数
{ DA=0XFF;
A = del; //输入模式
RS = 0; //指令 奇存器
RW = 0; //写指令
E = 1;
delaya();
E = 0; // 高电位向低电位跳变,指令执行
delaya();
}
/********************************************************************
* 名称 : write(uchar del)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write(uchar del) //写数据函数
{ DA=0XFF;
A = del;
RS = 1; //数据寄存器
RW = 0; //写数据
E = 1;
delaya();
E = 0;
delaya();
}
//---------------------1602显示数字函数--------------------
void display(uchar temp)
{
switch(temp)
{
case 1:k='1';break;
case 2:k='2';break;
case 3:k='3';break;
case 4:k='4';break;
case 5:k='5';break;
case 6:k='6';break;
case 7:k='7';break;
case 8:k='8';break;
case 9:k='9';break;
case 10:k='0';break;
}
}
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为140US。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay_1()
{
int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=10; j++);
}
/********************************************************************
* 名称 : delay()
* 功能 : 延时函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay(uint N)
{
int i;
for(i=0; i<N; i++)
{
_asm("nop");
}
}
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=1000;x++)
{ _asm("nop");
}
}
/***********************************************************************/
uchar Reset(void) //18b20初始化
{
uchar deceive_ready;
DB7=1; //输出模式
DQ = 0;
delay(250);//29
DQ = 1;
DB7=0;// 接收
delay(40);
deceive_ready = DQ;
delay(200);
return(deceive_ready);
// DB7=0X01;
}
/********************************************************************
* 名称 : read_bit()
* 功能 : 从DS18B20读一个位值
* 输入 : 无
* 输出 : 从DS18B20读出的一个位值
***********************************************************************/
uchar read_bit(void)
{
uchar i;
DB7=1;
DQ = 0;
delay(2);
DQ = 1;
DB7=0;
delay(5);
return(DQ);
DB7=1;
DQ=1;
}
/********************************************************************
* 名称 : write_bit()
* 功能 : 向DS18B20写一位
* 输入 : bitval(要对DS18B20写入的位值)
* 输出 : 无
***********************************************************************/
void write_bit(uchar bitval)
{ DB7=1;
DQ=0;
delay(2);
if(bitval==1) //18b20采样,若是低电平写入位0,若是高电平写入为1
DQ=1; //拉高,使其采样为高电平 为1
delay(40);
DQ=1;
}
/********************************************************************
* 名称 : read_byte()
* 功能 : 从DS18B20读一个字节
* 输入 : 无
* 输出 : 从DS18B20读到的值
***********************************************************************/
uchar read_byte(void)
{
uchar i,m,receive_data;
m = 1;
receive_data = 0; //初始化
for(i=0; i<8; i++)
{
if(read_bit())
{
receive_data = receive_data + (m << i); //每一位读一次 算法记一下
}
delay(3);
}
return(receive_data);
}
/********************************************************************
* 名称 : write_byte()
* 功能 : 向DS18B20写一个字节
* 输入 : val(要对DS18B20写入的命令值)
* 输出 : 无
***********************************************************************/
void write_byte(uchar val)
{
uchar i,temp;
for(i=0; i<8; i++)
{
temp = val >> i; //从右移零位到右移七位 依次将八位写入
temp = temp & 0x01; //最后一位与1与
write_bit(temp);
delay(5);
}
}
/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602初始化,请参考1602的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void L1602_init(void) //1602初始化
{
uchar i,j;
enable(0x01); // 清显示,光标复位
enable(0x38); // 移动显示的文字
enable(0x0c); // 开总显示
// enable(0x06); //
// enable(0xd0); //
enable(0x06); //设置光标状态默认0x06,为读一个字符光标加1
enable(0x80); // 初始显示位置
for(i=0;i<5;i++)
write(tab[i]); //显示
enable(0xc0); //换行显示
for(j=0;j<7;j++)
write(tab0[j]); //显示
}
//1602显示
void displayb(uint temp1)
{
uint a1,b1,c1;
a1=temp1/100 ;
b1= temp1/10%10;
c1= temp1%10;
enable(0x80+7);
write('T');
delay(10);
enable(0x80+8);
write(0x30+a1);
delay(10);
enable(0x80+9);
write(0x30+b1);
delay(10);
enable(0x80+10);
write(0x2e); //.
delay(10);
enable(0x80+11);
write(0x30+c1);
delay(10);
enable(0x80+12);
write(0x43);
}
void wendu(void) //读取温度
{ unsigned char TMPL=0;
unsigned char TMPH=0 ;
uint t=0;
float tt=0;
Reset(); //18b20初始化
write_byte(jump_ROM);
write_byte(start);
Reset();
write_byte(jump_ROM);
write_byte(read_EEROM);
TMPL = read_byte();
TMPH = read_byte();
t=TMPH&0x07;
t<<=8;
t=t|TMPL; //两字节合成一个整型变量。
tt=t*0.0625; //得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度
t2= tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。
//return(t);
// temp1 = TMPL / 16 + TMPH * 16;
//temp1=11;
displayb(t2);
}
void main()
{
DB0=1;
DB1=1;
DB2=1;
L1602_init(); //1602初始化
Reset(); //18b20初始化 */
while(1)
{
wendu();
}
}
|
|