📄 main.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 + -