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

📄 main.c

📁 语音报温度c程序 凌阳单片机 温度传感器 ds18b20
💻 C
字号:

//	文件名称:	main.c
//	功能描述:	语音播报功能的电子钟主函数
//	维护记录:	2003-05-22	(建立)
//				2003-06-16	(添加版本说明及版权声明)
//				2003-07-16	(代码标准化)
//				2005-10-26	(更换新的语音库)
//========================================================

#include "a2000.h"
#include "consist.h"
#ifndef	__DS18B20_h__
#define	__DS18B20_h__
#include "SPCE061A.h"
//	write your header here

void Delay(unsigned int);
void Set_DQ(int);
void Clr_DQ(int);
unsigned int Read_DQ(void);
unsigned int Read_18B20_Byte(void);
void Write_18B20_Byte(unsigned int);
int Init_18B20(void);
unsigned int Read_Temp(void);

#endif

//unsigned int SpeechAdjustTemp=0; //读时间中间变量
unsigned int Key=0; 
unsigned int KeyPressFlag=0;     //有键按下标志
unsigned int TimeCount = 0;      //两分钟计时单元
unsigned int SleepFlag=0;        //睡眠标志
unsigned int TimeChangeCount=0;  //校时状态下按键计时
unsigned int KeyStatus=0;        //校时状态还是报时状态,1-----校时
unsigned int KeyAdjust=0;        //0-YY 1-MM 2-DD 3-hh 4-mm 5-ss 6-exit
unsigned int YearOrTime=0;       //报时  1----year   0----time
unsigned int TimeChangeKey = 0;  //校时状态下加减标志
unsigned int KeyCount=0;		 //按键计数单元
unsigned int SecondAddOne=0;    
unsigned int HourMinTemp=0;      //读时、分


unsigned int gTimeVSShem[16]={0x0800,0x0832,0x0900,0x0932,0x0934,	//作息时间表
                             0x0a05,0x0a0a,0x0b00,0x0b0a,0x0c00,
                             0x0d1e,0x0e14,0x0e1e,0x0f14,0x0f15,
                              0x0f32};                           

//========================================================
//	C格式:		PlayRespond(unsigned int Result);
//	实现功能:	语音播放函数
//	入口参数:	unsigned int Result ——播放序号
//	出口参数:	无
//	破坏寄存器:无
//========================================================
//========================================================
//	文件名称:	DS18B20.c
//	功能描述:	DS18B20的相关操作,通过用户接口函数取得函数值
//	维护记录:	2005-11-22	v1.0
//========================================================

#include "DS18B20.h"
#include "SPCE061A.h"

//========================================================
//	语法格式:	void Delay(unsigned int uiTime)
//	实现功能:	延时,在调用Delay(1)时,延时时间小于1us
//	参数:		uiTime
//	返回值:	无
//========================================================

void Delay(unsigned int uiTime)
{
	while(uiTime > 0)
	{
		uiTime -= 1;
	}
}

//========================================================
//	语法格式:	void Set_DQ(int Dir)
//	实现功能:	改变IOB15口的状态
//	参数:		Dir,1:IOB15输出1;0:IOB15悬浮输入
//	返回值:	无
//========================================================

void Set_DQ(int Dir)
{
	if(Dir > 0)
		*P_IOB_Dir |= 0x8000;
	else
		*P_IOB_Dir &= 0x7fff;
	*P_IOB_Buffer |= 0x8000;
}

//========================================================
//	语法格式:	void Clr_DQ(int Dir)
//	实现功能:	改变IOB15口的状态
//	参数:		Dir,1:IOB15输出0;0:IOB15悬浮输入
//	返回值:	无
//========================================================

void Clr_DQ(int Dir)
{
	if(Dir > 0)
		*P_IOB_Dir |= 0x8000;
	else
		*P_IOB_Dir &= 0x7fff;
	    *P_IOB_Buffer &= 0x7fff;
}

//========================================================
//	语法格式:	unsigned int Read_DQ(void)
//	实现功能:	读取DQ的值
//	参数:		无
//	返回值:	DQ的值
//========================================================

unsigned int Read_DQ(void)
{
	unsigned int uiTemp;
	uiTemp = 0;
	if((*P_IOB_Data & 0x8000) >0)
		uiTemp = 1;
	return(uiTemp);
}

//========================================================
//	语法格式:	unsigned int Read_18B20_Byte(void)
//	实现功能:	读取18B20的值
//	参数:		无
//	返回值:	18B20的值
//========================================================

unsigned int Read_18B20_Byte(void)
{
	int i;
	unsigned int Data;
	Data = 0;
	for(i=0;i<8;i++)
	{
		Set_DQ(1);
		Delay(1);
		Clr_DQ(1);
		Delay(2);
		Set_DQ(0);			//切为输入
		Data = Data >> 1;
		if(Read_DQ()>0)
			Data |= 0x0080;
		Delay(31);
	}
	return(Data);
}

//========================================================
//	语法格式:	void Write_18B20_Byte(unsigned int Data)
//	实现功能:	写18B20
//	参数:		要写的字节
//	返回值:	无
//========================================================

void Write_18B20_Byte(unsigned int Data)
{
	int i;
	Set_DQ(1);
	Delay(1);
	for(i=0;i<8;i++)
	{
		Clr_DQ(1);
		Delay(1);
		if((Data&0x0001)>0)
			Set_DQ(1);
		Data = Data >> 1;
		Delay(31);
		Set_DQ(1);
		Delay(1);	
	}
}

//========================================================
//	语法格式:	int Init_18B20(void)
//	实现功能:	初始化18B20
//	参数:		要写的字节
//	返回值:	无
//========================================================

int Init_18B20(void)
{
	int flag;
	Set_DQ(1);
	Delay(1);
	Clr_DQ(1);
	Delay(250);
	Set_DQ(0);
	Delay(31);
	if(Read_DQ()>0)
		flag = 1;
	else
	{
		flag = 0;
		Delay(220);
	}
	Set_DQ(1);
	return(flag);
}

//========================================================
//	语法格式:	unsigned int Read_Temp(void)
//	实现功能:	读取温度
//	参数:		无
//	返回值:	温度值
//========================================================

unsigned int Read_Temp(void)
{
	int i;
	unsigned int uiT;
	unsigned int Data[10];
	 
	Set_DQ(1);
	while(Init_18B20()>0)
	*P_Watchdog_Clear = 0x0001;
	Delay(40);         	
	Write_18B20_Byte(0xcc);
	Write_18B20_Byte(0x44);
 	for(i=0;i<26;i++)	//长时间延时
		Delay(15000);
 	while(Init_18B20()>0)                   
		*P_Watchdog_Clear = 0x0001;           
	Write_18B20_Byte(0xcc);               
	Write_18B20_Byte(0xbe);            
	for(i=0;i<8;i++)					//数据读取
		Data[i] = Read_18B20_Byte();        
	i = Data[1];		 					//温度的高字节
	i = i << 8;    
	uiT = Data[0];						//温度的低字节
	uiT |= i;							//高低字节组和,有效位数11位

	Init_18B20();
	
	return uiT;
}
//=========================================================================================================


void PlayRespond(unsigned int Result)      
{  SACM_A2000_Initial(1);
   SACM_A2000_Play(Result,3,3);
   while((SACM_A2000_Status()&0x0001) != 0)
    { Clear_WatchDog();
	  SACM_A2000_ServiceLoop(); 
    }
   SACM_A2000_Stop();
}




void main ()
{  

unsigned int uiData;                    //温度读数
unsigned int uiInteger;					//数据的整数部分
unsigned int uiDecimal;					//数据的小数部分
unsigned int uiBai;						//显示温度的百位	
unsigned int uiShi;						//显示温度的十位
unsigned int uiGe;						//显示温度的个位
unsigned int uiShi_d;					//显示温度的十分位
unsigned int uiBai_d;					//显示温度的百分位
unsigned int uiQian_d;					//显示温度的千分位
unsigned int uiResidue;					//数据的余数,作除法
*P_SystemClock = 0x0018;			//初始化,调整系统时钟24.576MHz/1,强振模式
*P_IOB_Attrib = 0xffff;				//初始化IOB同相低电平输出口
*P_IOB_Dir = 0xffff;
*P_IOB_Data = 0x0000;
	uiInteger = 0;
	uiDecimal = 0;
	uiData =Read_Temp();
	
	if(uiData & 0x0400)
		uiInteger += 64;					//转换为整数部分
	if(uiData & 0x0200)
		uiInteger += 32;
	if(uiData & 0x0100)
		uiInteger += 16;
	if(uiData & 0x0080)
		uiInteger += 8;
	if(uiData & 0x0040)
		uiInteger += 4;
	if(uiData & 0x0020)
		uiInteger += 2;
	if(uiData & 0x0010)
		uiInteger += 1;
	
	if(uiData & 0x0008)
		uiDecimal += 5000;					//转换为小数部分
	if(uiData & 0x0004)
		uiDecimal += 2500;
	if(uiData & 0x0002)
		uiDecimal += 1250;
	if(uiData & 0x0001)
		uiDecimal += 625;
	
	uiBai = uiInteger/100;					//小数点前面部分
	uiResidue = uiInteger%100;
	uiInteger = uiResidue;
	uiShi = uiInteger/10;
	uiResidue = uiInteger%10;
	uiGe = uiResidue;
	
	uiShi_d = uiDecimal/1000;				//小数点后面部分
	uiResidue = uiDecimal%1000;
	uiDecimal = uiResidue;
	uiBai_d = uiDecimal/100;
	uiResidue = uiDecimal%100;
	uiDecimal = uiResidue;
	uiQian_d = uiDecimal/10;
	uiResidue = uiDecimal%10;			   	//万分位

    
if (uiShi>0)	           
  {	PlayRespond(uiShi+C_T00);                
	PlayRespond(C_T10); }
	PlayRespond(uiGe+C_T00);
	PlayRespond(C_DIAN);
	PlayRespond(uiShi_d+C_T00);
	PlayRespond(uiBai_d+C_T00);
	PlayRespond(C_DU);

	while (1)
	   {	
		*P_Watchdog_Clear = 0x0001;
		 }	

}



				

⌨️ 快捷键说明

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