📄 acus.c
字号:
#include "reg935.h"
#include <rtx51tny.h>
#include <string.h>
#include<intrins.h>
/**********************************************************/
#define INIT 0
#define CLOCK 1
#define LIGHTS 2
#define KEYREAD 3
#define TEMPCON 4
#define TEMPSET 5
#define TIMESET 6
#define TIMECON 7
#define PWMCON 8
#define BLINKING 9
/**********************************************************/
#define uchar unsigned char
#define uint unsigned int
/***********************************************************/
#define HIGH(x) ((x>>8)&0xff)
#define LOW(x) (x&0xff)
#define OPEN 1
#define CLOSE 0
/***********************************************************/
#define CHANNEL1 0x01
#define CHANNEL2 0x02
#define CHANNEL3 0x03
/*******************共字符******************************/
#define LED1 0x06; // 1
#define LED2 0x5b; // 2
#define LED3 0x4f; // 3
#define LED4 0x66; // 4
#define LED5 0x6d; // 5
#define LED6 0x7d; // 6
#define LED7 0x07; //7
#define LED8 0x7f; //8
#define LED9 0x6f; //9
#define LEDA 0x77; //A
#define LED0 0x3f; //0
#define LEDb 0x7c; // b
#define LEDC 0x39; //C
#define LEDd 0x5e; //d
#define LEDE 0x79; //E
#define LEDF 0x71; //F
#define LEDP 0x3e; //P
#define LEDU 0x6e; //U
#define LEDy 0x76; //y
#define LEDH 0x38; //H
#define LEDL 0x00; //L
/*******************共阳字符******************************/
/*#define LED1 0xf9; // 1
#define LED2 0xa4; // 2
#define LED3 0xb0; // 3
#define LED4 0x99; // 4
#define LED5 0x92; // 5
#define LED6 0x82; // 6
#define LED7 0xf8; //7
#define LED8 0x80; //8
#define LED9 0x90; //9
#define LEDA 0x88; //A
#define LED0 0xc0; //0
#define LEDb 0x83; // b
#define LEDC 0xc6; //C
#define LEDd 0xa1; //d
#define LEDE 0x86; //E
#define LEDF 0x8e; //F
#define LEDP 0x8c; //P
#define LEDU 0xc1; //U
#define LEDy 0x91; //y
#define LEDH 0x89; //H
#define LEDL 0xc7; //L*/
static uchar xdata dispbuff[4] ={0x3f,0x3f,0x3f,0x3f}; //显示缓冲
static uchar idata NewsStr[4] ; //分配按键队列,第1字节为有效按键数目,
//static uchar idata KeyTime,KeyTask; //任务时间参数,任务内模块号
/***********************************************************/
#define PWM2HZ 0xffff
#define PWM4HZ 0x7fff
#define PWM8HZ 0x3fff
#define PWM16HZ 0x1fff
#define PWM32HZ 0x0fff
#define PWM64HZ 0x07ff
#define PWM128HZ 0x03ff
#define PWM256HZ 0x01ff
#define PWM512HZ 0x00ff
#define PWM1024HZ 0x007f
#define PWM2048HZ 0x003f
#define PWM4096HZ 0x001f
#define PWM8192HZ 0x000f
/************************************************************/
#define TEMPADDR 15 /*保存设定的温度EEPROM地址*/
#define TIMEADDR 7 /*保存设定的时间EEPROM地址*/
uchar idata TimeCounter=0; /* 时间按键计数器 */
uchar idata TempLimit=0; /*温度设定值*/
uchar idata TimeLimit=0; /*时间设定值*/
uchar idata PWMChang=0; /*PWM脉冲控制*/
bit TaskStart=0; /*任务开始标志*/
bit KeyOk=0; /*按键控制*/
bit TIMECONRUN =0; /*定时任务运行状态*/
bit ALAMECON =0;
/****************************************************************/
struct time { //时间记录结构
uchar hour; //小时
uchar min; //分
uchar sec; //秒
uchar msec; //秒调整
};
/************************************************************/
struct time xdata ctime = {12,0,0,0} ; /*系统时间*/
struct time xdata start ={ 0,0,0,0}; /*起始时间*/
struct time xdata end ={0,0,0,0} ; /*结束时间*/
/************************************************************/
sbit dq = P0^2;
bit flag;
#define NOP _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
uint idata Temperature;
uchar xdata temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节
uchar xdata id_buff[8];
uchar *p;
uchar crc_data;
uchar code CrcTable [256]={
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};
void DelayNS(uchar no);
void watchdog(void) ;
void Disp(uchar *i) ;
void CPU_init(void) ;
/*********************************************************/
void CCU_init(void);
void PWM_start(uint freq,uchar mod);
/*********************************************************/
void AD_init(void) ;
uchar AD_start(uchar channel);
/**********************************************************/
sbit tempkey=P1^3 ;
sbit timekey=P1^2 ;
sbit pwmkey =P1^4;
sbit timeled=P0^6;
sbit templed=P0^7;
sbit ALAME=P1^7;
/************************************************************
*Function:10us延时处理
*parameter:
*Return:
*Modify:
*************************************************************/
void Delay10us (uchar us)
{
while(us--)
{
NOP;NOP;NOP;
}
}
/*********************************************************
*名称:EEPROMwrite(unsigned int adr, unsigned char dat)
*功能:EEPROM写程序
*入口参数:adr dat
*出口参数:数据地址,数据
*********************************************************/
void EEPROMwrite(unsigned int adr, uchar dat)
{
EA=0; // disable Interrupts during write
DEECON=(unsigned char)((adr>>8)&0x01); // mode: write byte, set address
DEEDAT=dat; // set write data
DEEADR=(unsigned char) adr; // start write
EA=1;
while((DEECON&0x80)==0); // wait until write is complete
}
/*********************************************************
*名称:EEPROMread(unsigned int adr)
*功能:EEPROM读程序
*入口参数:无
*出口参数:数据地址
*********************************************************/
unsigned char EEPROMread(unsigned int adr)
{
DEECON=(unsigned char)((adr>>8)&0x01); // mode: read byte, set adress
DEEADR=(unsigned char) adr; // start read
while((DEECON&0x80)==0); // wait until read is complete
return DEEDAT; // return data
}
/************************************************************
*Function:18B20初始化
*parameter:
*Return:
*Modify:
*************************************************************/
bit Init18b20 (void)
{
dq=0;
os_wait(K_TMO,3,0);
//Delay10us(50); //delay 500 uS
dq=1;
Delay10us(9); //delay 90 uS
if(dq==1)
return 0; //detect 1820 success!
else
{os_wait(K_TMO,2,0);
//Delay10us(40);
dq = 1;
}
return 1; //detect 1820 failed!
}
/************************************************************
*Function:向18B20写入一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
void WriteByte (uchar wr) //单字节写入
{
uchar i;
for (i=0;i<8;i++)
{
dq = 0;
Delay10us(1); //delay 13 uS //1
dq=wr&0x01;
wr >>= 1;
Delay10us(5); //delay 50 uS //5
dq=1;
}
}
/************************************************************
*Function:读18B20的一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
uchar ReadByte (void) //读取单字节
{
uchar i,u=0;
for(i=0;i<8;i++)
{ u >>= 1;
dq = 0;
_nop_();_nop_();_nop_(); //delay 1 uS //1
dq = 1;
NOP;NOP; //delay 5 uS //1
if(dq==0)
u=u&0x7f;
else
u |= 0x80;
//os_wait(K_TMO,1,0);
Delay10us(4);
dq = 1;
}
return(u);
}
/************************************************************
*Function:读18B20
*parameter:
*Return:
*Modify:
*************************************************************/
void read_bytes (uchar j)
{
uchar i;
for(i=0;i<j;i++)
{
*p = ReadByte();
p++;
}
}
/************************************************************
*Function:CRC校验
*parameter:
*Return:
*Modify:
*************************************************************/
uchar CRC (uchar j)
{
uchar i,crc_data=0;
for(i=0;i<j;i++) //查表校验
{ crc_data = CrcTable[crc_data^temp_buff[i]];watchdog();}
return (crc_data);
}
/************************************************************
*Function:内部配置
*parameter:
*Return:
*Modify:
*************************************************************/
void Config18b20 (void) //重新配置报警限定值和分辨率
{ if(Init18b20()!=0)
{watchdog();
WriteByte(0xcc); //skip rom
WriteByte(0x4e); //write scratchpad
WriteByte(0x19); //上限
WriteByte(0x1a); //下限
WriteByte(0x7f); //set 11 bit (0.125)
os_wait(K_TMO,2,0);
watchdog();
}
if(Init18b20()!=0);
{WriteByte(0xcc); //skip rom
WriteByte(0x48); //保存设定值
os_wait(K_TMO,2,0);
watchdog();
}
if(Init18b20()!=0);
{
WriteByte(0xcc); //skip rom
WriteByte(0xb8); //回调设定值
os_wait(K_TMO,2,0);
watchdog();
}
}
/************************************************************
*Function:读18B20ID
*parameter:
*Return:
*Modify:
*************************************************************/
void ReadID (void)//读取器件 id
{
Init18b20();
WriteByte(0x33); //read rom
read_bytes(8);
}
/************************************************************
*Function:读取温度
*parameter:
*Return:
*Modify:
*************************************************************/
void GemTemp (void)
{uint TEMP;
read_bytes (9);
if (CRC(9)==0) //校验正确
{
TEMP = temp_buff[1]*0x100 + temp_buff[0];
if(TEMP==0||TEMP==0xff)
{Config18b20();
TEMP=0;}
Temperature=TEMP;
Temperature /= 16;
watchdog();
}
}
/************************************************************
*Function:18B20ID全处理
*parameter:
*Return:
*Modify:
*************************************************************/
void TemperatuerResult(void)
{
if(Init18b20()!=0)
{
WriteByte(0xcc); //skip rom
WriteByte(0x44); //Temperature convert
os_wait(K_TMO,3,0);
watchdog();
os_wait(K_TMO,2,0);
watchdog();
os_wait(K_TMO,2,0);
watchdog();
}
if(Init18b20()!=0)
{WriteByte(0xcc); //skip rom
WriteByte(0xbe); //read Temperature
watchdog();
p = temp_buff;
GemTemp();
watchdog();
}
watchdog();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -