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

📄 chengxu.c

📁 是数字温度传感器DS18B20和凌阳61单片机组成的温度预警系统的原理图和源程序。
💻 C
字号:
//========================================================
// 工程名称: DS18B20
// 功能描述: 温度传感器
// 涉及的库: spca061a.h
// 组成文件: main.c
// 硬件连接: IOA15:DS18B20的DQ脚
//            IOA8:蜂鸣器信号端
//            IOB0-IO7:LEDa-h段位;IOB8-IOB13:位选(个位、十位)
//  标准化:    2007.5.30
//  Done by:   杨晓明 袁魁
//========================================================

#include "spce061a.h"

#define DQ *P_IOA_Data    //定义A口位DS18B20的DQ位

//  全局变量定义
unsigned int temp;
int table[10]={0x00c0, 0x00f9, 0x00a4, 0x00b0, 0x0099, 0x0092, 0x0082, 0x00f8, 0x0080, 0x0090};
unsigned int sone,tens;

//  温度显示函数声明
void showtemp();

//========================================================
// 语法格式: void delay(int t)
// 实现功能: 延时函数
// 参数:  延时时长,t*100微妙
// 返回值: 无
//========================================================
void delay(int t)
{
 unsigned int i;
 while(t--)
 {
  for (i=0;i<=70;i++)        //when t=1     100us
    *P_Watchdog_Clear=0x0001;
 }   
}

//========================================================
// 语法格式: void showdelay()
// 实现功能: 延时显示函数,启动温度转换时用此延时函数,
//              一延时,二在这段时间也显示温度。
// 参数:  无
// 返回值: 无
//========================================================
void showdelay()
{
 int i;
 i=35;                    //延时约1s
 while(i--)
  showtemp();  
}

//========================================================
// 语法格式: void TxReset(void)
// 实现功能:  产生复位脉冲 初始化DS18B20
// 参数:  无
// 返回值: 无
//========================================================
void TxReset(void)
{
 unsigned int i;
 
 *P_IOA_Dir=0xffff;                    //置A为输出端
 
 DQ=0x0000;
 delay(8);                             //拉低约900微秒
 DQ=0x8000;                             
 i=30;                                 //延时30微秒
 while (i--);
}


//========================================================
// 语法格式: void RxWait(void)
// 实现功能:  等待应答脉冲
// 参数:  无
// 返回值: 无
//========================================================
void RxWait(void)
{
 unsigned int i;
 
 *P_IOA_Dir=0x0000;
 
 while((DQ&0x8000)==0x8000);     
 while((DQ&0x8000)==0x0000);       //等待应答脉冲

 i=4;
 while (i--);
}

//========================================================
// 语法格式: unsigned int RbBit(void)
// 实现功能:  读取数据的一位,满足读时时隙要求
// 参数:  无
// 返回值: b:读时隙后读取数据的一位(0或1),0x000b
//========================================================
unsigned int RbBit(void)
{
 unsigned int i,b;
 
 *P_IOA_Dir=0xffff;   //置A口为输出口
 
 DQ=0x0000;
 i++;
 i++;
 i++;
 i++;                //拉低后延时1us,然后释放总线
 DQ=0x8000;
 
 *P_IOA_Dir=0x0000;   //置A口为输入口,接受数据
    
    i=10;               
    while(i--);
    
 b=(DQ&0x8000)>>15;    //15us内读数据 
 
 i=60;
 while (i--);  //延时60us

 return(b);
 
}

//========================================================
// 语法格式: unsigned int RbByte(void)
// 实现功能:  读取数字的两个字节
// 参数:  无
// 返回值: 从暂存器读取16位温度值
//========================================================
unsigned int RbByte(void)
{
 unsigned int i,j,b;
 b=0;
 for (i=1;i<=16;i++)
 {
  j=RbBit();
  b=(j<<15)|(b>>1); 
 }
 return (b);
}

//========================================================
// 语法格式: void WrByte(unsigned int b)
// 实现功能:  写数据的一个字节
// 参数:  DS18B20的一字节操作命令
// 返回值: 无
//========================================================
void WrByte(unsigned int b)
{
 unsigned int  i,j,btmp;
 for (j=1;j<=8;j++)
 {
  btmp=b&0x0001;
  b=b>>1;
        *P_IOA_Dir=0xffff;               //置A口为出入口
  if (btmp==0x0001)
  {
   //写1
   DQ=0x0000;                 //拉低15us
   
   i=13;
   while(i--);
   
   DQ=0x8000;                 //15us内必须将总线了拉高
   i=55;
   while (i--);
   i++;
   i++;
  }
  else
  {
    //写0
    DQ=0x0000;
    i=64;
    while (i--);
    DQ=0x8000;
    i++;
    i++;
  }
 }
}

//========================================================
// 语法格式: void convert(void)
// 实现功能:  启动温度转换
// 参数:  无
// 返回值: 无
//========================================================
void convert(void)
{
 TxReset();                   //初始化
 RxWait();                    //应答脉冲
 delay(10);
 WrByte(0x00cc);              //skip rom命令
 WrByte(0x0044);              //温度转换
 *P_Watchdog_Clear=0x0001;
}

//========================================================
// 语法格式: void RdTemp(void)
// 实现功能:  读取温度值,将温度值赋予temp
// 参数:  无
// 返回值: 无
//========================================================
void RdTemp(void)
{
 TxReset();                //初始化
 RxWait();                 //应答脉冲
 delay(10);
 WrByte(0x00cc);           //skip rom命令
 WrByte(0x00be);           //读暂存器温度
 temp=RbByte();
 return(temp);            //读取温度
}

//========================================================
// 语法格式: void showtemp()
// 实现功能:  温度显示函数,通过三位LED
// 参数:  无
// 返回值: 无
//========================================================
void showtemp()
{      
 *P_IOB_Data=table[tens]+0x0100;          //显示十位
 delay(50);
 *P_IOB_Data=table[sone]+0x0200;          //显示个位
 delay(50);
// *P_IOB_Data=0xffff;                    
}

//========================================================
// 语法格式: void main()
// 实现功能:  主函数
// 参数:  无
// 返回值: 无
//========================================================
void main()
{
 unsigned int i;
 
 *P_IOA_Dir=0x0000;      //初始化端口,先定义A口为悬浮式输入端,以后须设置输出口时,只需将Dir改变即可
 *P_IOA_Attrib=0xffff;
 *P_IOA_Data=0x0000;
 *P_IOB_Dir=0xffff;      //B口味带数据缓存的输出端
 *P_IOB_Attrib=0xffff;
 *P_IOB_Data=0x0000;
 
 *P_SystemClock=0x0040;   //设置系统时钟,Focs选择32.768MHz,CPUCLOCK选择Focs
 
 while(1)
 {
  delay(10);
  convert();           //启动温度转换
  showdelay(750);         //延时750ms以上
  RdTemp();            //读取温度值
  
  tens=((temp&0xfff0)>>4)/10;      //取十位
  sone=((temp&0xfff0)>>4)%10;      //取个位
 
 		
  if((tens<=2)&(sone<=6))          //判断是否小于26
  {  
    *P_IOA_Dir=0x0100;             //蜂鸣器报警
 	*P_IOA_Data=0x0100;
 	showdelay(50);
 	*P_IOA_Dir=0x0000;
   }
  
  
  if((tens>=3)&(sone>=3))          //判断是否大于33
  {  
    *P_IOA_Dir=0x0100;              //蜂鸣器报警
	*P_IOA_Data=0x0100;
 	showdelay(50);
 	*P_IOA_Dir=0x0000;
   }
  
  
  showtemp();            //显示温度
  showtemp();
  showtemp();
  showtemp();
  showtemp();
  *P_Watchdog_Clear=0x0001;   //清狗
 }

}

⌨️ 快捷键说明

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