⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c.bak

📁 cw环境下例子程! DS18B20实验 用户成功安装好CW6.0后
💻 BAK
字号:
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
/*=======================读写DS18B20实验======================
硬件环境:1)PTGD4引脚作为MCU与DS18B20通信的数据线
          2)总线频率4.19M
实验现象:1)示波器可测量MCLK测试点频率,该测试点频率为总线频率的二分之一
*/

#define ds18b20_dq PTGD_PTGD4//MCU的PTGD4引脚作为通信引脚
#define ds18b20_dir PTGDD_PTGDD4//PTGD4引脚方向控制-1:输出引脚;0:输入引脚

byte ds18b20_state;//ds18b20状态
byte ds18b20_h;//温度高字节
byte ds18b20_l;//温度低字节
byte fg;//正负温标志
byte zhengshu;//整数,转换后的温度整数部分
byte xiaoshu1;//小数第一位,转换后的温度小数部分
byte xiaoshu2;//小数第二位,转换后的温度小数部分
//==============================================================
//函数名:Init_mclk
//作者:KLY
//日期:2007-11-8 10:34    
//功能:MCU的MCLK引脚输出时钟信号,该信号频率为系统总线频率的一半    
//输入参数:无
//返回值:无
//修改记录:无
//===============================================================
void Init_mclk(void)
{
	SMCLK_MPE=1;
	SMCLK_MCSEL=1;
}
//===============================================================
//函数名:Init_ICS_FEE
//作者:KLY
//日期:2007-11-8 10:34    
//功能:FLL使能,外部参考时钟模式。外部晶振32.768k,总线倍频到4.19M    
//输入参数:无
//返回值:无
//修改记录:无
//================================================================
void Init_ICS_FEE(void)
{
	ICGC1=0x38;
	ICGC2=0x00;
}
//============================
//函数名:Init_io初始化I/O
//作用:初始化I/O
//输入参数:无
//返回参数:无
//=============================
void Init_io(void)
{
	PTGD_PTGD4=0;
	ds18b20_dir=1;//输出,上拉未使能
	PTGDS_PTGDS4=1;
}
//===============================================================
//函数名:delay
//作者:KLY
//日期:2007-11-8 10:34    
//功能:固定延时函数,该函数主要运行DBNZ语句,需6个总线周期;i*6/4.19(us)    
//输入参数:无
//返回值:无
//修改记录:无
//===============================================================
void delay(byte nums_30us)
{
	byte i;
	while(nums_30us)
	{
		i=18;
		while(i) 
		{
		 i--; 
		}
		nums_30us--;
  }
}
//====================================
//函数名:delay_2us
//功能:延时2us
//输入参数:无
//返回值:无
//=====================================
void delay_2us(void)
{
	asm(nop);//1个NOP耗时1/4.19
	asm(nop);
	asm(nop);
	asm(nop);
	asm(nop);
	asm(nop);
	asm(nop);
	asm(nop);
	asm(nop);
}
//============================
//函数名:Init_18b20
//作用:复位18B20
//输入参数:无
//返回参数:18b20响应信号
//=============================
byte Init_18b20(void)
{
 unsigned char x=0;
 
 ds18b20_dir=1;//输出状态
 ds18b20_dq = 1;//DQ复位
 delay(1);  //延时30us
 
 ds18b20_dq = 0;//单片机将DQ拉低
 delay(16); //精确延时 大于 480us
 
 ds18b20_dq = 1;    //拉高总线
 ds18b20_dir=0;//改为输入状态
 delay(1);//延时30us
 
 x=ds18b20_dq;//稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 
 delay(14);//再延时450us以完成整个时序
 return(x);
}
//===============================
//函数名:write_bit
//作用:写一位数据
//输入参数:要写的值(0或1)
//返回值:无
//===============================
void write_bit(byte bitval)
{
	ds18b20_dir=1;//输出状态
	ds18b20_dq = 0;
	if(bitval==1)
		ds18b20_dq=1;
	delay(2);//延时60us供DS18B20采样
	ds18b20_dq=1;//释放总线,拉高
}
//===============================
//函数名:write_one_data
//作用:对DS18B20写入数据
//输入参数:要写的值(8位,低位在前)
//返回值:无
//===============================
void write_one_data(unsigned char val)
{
 unsigned char i=0;
 unsigned char temp;
 for (i=0; i<8; i++)
 {
  temp=val>>i;//移位操作,将本次要写的位移到最低位
  temp &= 0x01;
  write_bit(temp);
  }
}
//===============================
//函数名:read_bit
//作用:读一位数据
//输入参数:无
//输出参数:引脚电平值
//===============================
byte read_bit(void)
{
	byte i;
	ds18b20_dir=1;//输出状态
	ds18b20_dq = 0;//将总线拉低开始读时序
	delay_2us();
	//ds18b20_dq=1;
	ds18b20_dir=0;
	delay_2us();
	delay_2us();
	i=ds18b20_dq;
	return(i);
}
//==================================
//函数名:read_one_data
//作用:读一字节数据
//输入参数:无
//输出参数:返回读取到的1个字节数据
//=================================
byte read_one_data(void)
{
unsigned char i=0;
unsigned char value = 0;

for (i=0;i<8;i++)
 {
 	 if(read_bit())
 	 	value |= 0x01 << i;
 	 delay(2);//延时60us以完成此次读时序,之后再读下一位数据
 }
 return(value);
}
//==================================
//函数名:read_ds18b20
//作用:读取DS18B20测量温度
//输入参数:无
//输出参数:无
//=================================
void read_ds18b20()
{
	ds18b20_state=Init_18b20();
	write_one_data(0xCC); // 跳过读序号列号的操作
	write_one_data(0x44); // 启动温度转换

	ds18b20_dir=0;
	while(ds18b20_dq==0);//等待温度转换完成

	ds18b20_state=Init_18b20();
	write_one_data(0xCC); //跳过读序号列号的操作
	write_one_data(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

	ds18b20_l=read_one_data();   //读取温度值低位
	ds18b20_h=read_one_data();   //读取温度值高位
	
 if(ds18b20_h > 0x7f)      //最高位为1时温度是负
 {
   ds18b20_l = ds18b20_l;     //补码转换,取反加一
   ds18b20_h = ds18b20_h + 1;       
   fg=1;      //读取温度为负时fg=1
  }
 zhengshu =  ds18b20_l/16+ds18b20_h*16; //整数部分
 xiaoshu1 = (ds18b20_l&0x0f)*10/16; //小数第一位
 xiaoshu2 = (ds18b20_l&0x0f)*100/16%10;//小数第二位

}
//=============================================主函数===================================================
void main(void) {
  Init_io();
  Init_mclk();
  EnableInterrupts; /* enable interrupts */
  /* include your code here */
  for(;;) {
  	read_ds18b20();//读取温度值,可查看ds18b20_l,ds18b20_h值,室温对应的数字量为0x0191
  	asm(nop);//该处可设置一个断点,观测运行情况
    __RESET_WATCHDOG(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}
//==============================================================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -