📄 acus.c
字号:
/*********************************************************
*名称:watchdog()
*功能:喂狗函数
*入口参数:no
*出口参数:无
*********************************************************/
void watchdog(void)
{
EA=0;
WFEED1=0xA5; //执行清零第一部份
WFEED2=0x5A; //执行清零第二部分
EA=1;
}
/*********************************************************
*名称:WriteDisp()
*功能:显示函数
*入口参数:disp显示的数据,led显示位置
*出口参数:无
*********************************************************/
void WriteDisp(uchar led,uchar disp)
{
switch (disp)
{case 0 :
dispbuff[led]=LED0;
break;
case 1 :
dispbuff[led]=LED1;
break;
case 2 :
dispbuff[led]=LED2;
break;
case 3 :
dispbuff[led]=LED3;
break;
case 4 :
dispbuff[led]=LED4;
break;
case 5 :
dispbuff[led]=LED5;
break;
case 6 :
dispbuff[led]=LED6;
break;
case 7 :
dispbuff[led]=LED7;
break;
case 8 :
dispbuff[led]=LED8;
break;
case 9 :
dispbuff[led]=LED9;
break;
default : dispbuff[led]=LEDE; break;
}
}
/*********************************************************
*名称:Disp()
*功能:显示函数
*入口参数:no
*出口参数:无
*********************************************************/
void Disp(uchar *i)
{ uchar j=0;
while(j<=3)
{ switch (j)
{ case 0:
{
P2=*(i);
P10=1;
P11=0;
P04=0;
P05=0;
os_wait(K_TMO,1,0);
watchdog();
j++;
break;
}
case 1:
{
P2=*(i+1);
P10=0;
P11=1;
P04=0;
P05=0;
os_wait(K_TMO,1,0);
watchdog();
j++;
break;
}
case 2:
{ P2=*(i+2);
P10=0;
P11=0;
P04=1;
P05=0;
os_wait(K_TMO,1,0);
watchdog();
j++;
break;
}
case 3:
{P2=*(i+3);
P10=0;
P11=0;
P04=0;
P05=1;
os_wait(K_TMO,1,0);
watchdog();
j=0;
break;
}
default:
{j&=4;
break;
}
}
}
}
/*********************************************************
*名称:ADinit()
*功能:A/D转换器初始化
*入口参数:no
*出口参数:无
*********************************************************/
void AD_init(void)
{ P0M1=0x0b; //P00,P01,设置为仅为输入状态,P02,设置为双向
//P06,P07,P03,P04,P05,设置为推挽。
P0M2=0xf0;
//------------------------
ADINS=0x52; //0101 0010, 选择ad0l和 ad10 ad12
ADMODA=0x11; //0001 0001, 选择转换工作模式:固定通道单次转换模式
ADMODB=0x00; //500Khz < ADC CLK < 3.3Mhz,,
//------------------------
p = id_buff;
ReadID(); //读18B20ID
Config18b20(); //18b20初始化 */
}
/*********************************************************
*名称:MeilanFilter()
*功能:中值滤波
*入口参数:channel 通道选择
*出口参数:result 转换结果
*********************************************************/
/*uchar MeilanFilter(uchar channel)
{uchar i,j,k,addata;
uchar xdata temp[5];
for(k=0;k<=5;k++)
{ addata=AD_start(channel);
for(j=0;j<=5;j++)
{if(addata>temp[j])
{for(i=5;i>j;i--)
temp[i]=temp[i-1] ;
temp[j]=addata;
watchdog();
break;
}
else{}
}
}
return(temp[3]);
}
/*********************************************************
*名称:ADstart()
*功能:A/D转换器启动
*入口参数:channel 通道选择
*出口参数:result 转换结果
*********************************************************/
uchar AD_start(uchar channel)
{ uchar result;
switch (channel )
{case 0x01 :
{ADCON0=0x05; //ad01温度设定采样
//选择转换触发模式;并立即启动
result=AD0DAT1; //将AD转换获得的数据存入result
ADCON0&=0xF7; //清除中断完成标志
break;
}
case 0x02 :
{ADCON1=0x05; //ad10温度传感器采样
//选择转换触发模式;并立即启动
result=AD1DAT0; //将AD转换获得的数据存入result
ADCON0&=0xF7; //清除中断完成标志
break;
}
case 0x03 :
{ADCON1=0x05; //ad12温度传感器采样
//选择转换触发模式;并立即启动
result=AD1DAT2; //将AD转换获得的数据存入result
ADCON1&=0xF7; //清除中断完成标志
break;
}
}
return result ;
}
/*********************************************************
*名称:CCU_init(void)
*功能:CCU初始化
*入口参数:无
*出口参数:无
*********************************************************/
void CCU_init(void)
{
OCB=1; // 设置P1.6为PWM输出
TPCR2H=0x00; // 设置 CCU 预分频控制器:
TPCR2L=0x63; // divide by 100 (99+1)
TCR21=0x07; // Prescaler for Phase Locked Loop:
// Input frequency must be in range of 0.5-1Mhz
// InpFrq=PCLK/(PLLDIV+1)=(CCLK/2)/(PLLDIV+1)
// using the internal RC oscillator: CCLK=7.373MHz
// PLLDiv=6, 6+1=7 => 0.526 MHz
// using Crystal 11.0592 MHz => 0.789 MHz
CCCRB=0x01; // non-inverted PWM output on channel B B通道非反相输出PWM
TCR20|=0x80; // Start PLL, OutputMode: stop
OCB=1; // wait a machine cycle
while(PLLEN ==0);// wait until PLL locked
TOR2H=0xff; // Reload Value 0x00FF=255 装载映像寄存器
TOR2L=0x7f; // -> PWM period PWM周期
TCR21|=0x80; // update reload value 使映像寄存器在下次CCU溢出时自动更新
OCRBH=0x00; // initialize Duty-Cycle channel A 0x0100 => 50%
OCRBL=0x3f;
TCR21|=0x80; // update duty cycle
TCR20=0x86; // Set output mode: asymmetrical PWM非对称模式
HLTEN=1;
HLTRN=1;
}
/*********************************************************
*名称:PWM_start(void)
*功能:脉冲控制开始
*入口参数:无
*出口参数:无
*********************************************************/
void PWM_start(uint freq,uchar mod)
{
TOR2H= HIGH(freq) ; // Reload Value 0x00FF=255 装载映像寄存器
TOR2L= LOW(freq) ; // -> PWM period PWM周期
OCRBH= HIGH(freq)/mod ;
OCRBL= LOW(freq)/mod; //占空比为50%
TCR21|=0x80; // update reload value 使映像寄存器在下次CCU溢出时自动更新
watchdog();
}
/*********************************************************
*名称:CPU_init(void)
*功能:CPU初始化
*入口参数:无
*出口参数:无
*********************************************************/
void CPU_init(void)
{ uchar deca,first;
P1M1 = 0x1c; // P12,P13,P14,P15,输入P10,P11,P16,P17输出
P1M2 = 0xc3;
P2M1 = 0x00; //全为输出
P2M2 = 0xFF;
ALAME=0;
timeled=0;
templed=0;
CCU_init();
AD_init();
ACC=WDCON;
ACC|=0x04;
WDL=0x08; //装入8位倒计数的新值
EA=0;
WDCON=ACC; //设置WD_RUN=1
WFEED1=0xA5; //执行清零第一部份
WFEED2=0x5A; //执行清零第二部分
TRIM|=0xc0;
EA=1;
TimeLimit= EEPROMread(TIMEADDR);
if(TimeLimit>0&&TimeLimit<=60)
{ end.hour=TimeLimit/60+ctime.hour; //记录结束时间
end.min= TimeLimit%60+ctime.min;
end.sec= 0;
deca =TimeLimit/10;
first=TimeLimit%10;
WriteDisp(0,deca);
WriteDisp(1,first);
os_create_task (TIMECON);
if(P13==0)
{TempLimit=EEPROMread(TEMPADDR);
if(TempLimit>0)
os_create_task(TEMPCON);
else TempLimit=0;
}
} //开始诊病任务
else TimeLimit=0;}
/**************************************************
*原型:void PushNews(void)
*功能:将消息压入堆栈
*说明:但是没有将其置为有效
*参数:无
*返回:无
**************************************************/
void PushNews(void) {
uchar ch,i;
ch=NewsStr[0];
ch++;
i=(P1|0xf3);
NewsStr[ch]=_cror_ (i,2);
}
/**************************************************
*原型:uchar PopNews(void)
*功能:弹出最老消息
*说明:采用依次前移,如果队列大应采用有效算法
*参数:无
*返回:无
**************************************************/
uchar PopNews(void) {
uchar ch,i;
ch=NewsStr[1];
for(i=1;i<2;i++) {
NewsStr[i]=NewsStr[i+1];
}
NewsStr[3]=0;
NewsStr[0]--;
return ch;
}
/**************************************************
*原型:void DealNews(void)
*功能:对按键的处理模块
*说明:无
*参数:无
*返回:无
**************************************************/
uchar DealNews(void) {
uchar NewsBuff;
if(NewsStr[0])
{
NewsBuff=PopNews();
}
else{
NewsBuff=0x00;
}
return NewsBuff;
}
/**************************************************
*原型:uchar kb_hit(void)
*功能:确定有键按下
*说明:无
*参数:无
*返回:有键按下返回1,否则返回0
**************************************************/
uchar kb_hit(void)
{
//P1&=0xf3;
if((P1|0xfb)==0xfb) return(0);
return(1);
}
/**************************************************
*原型:void ScanKey(void)
*功能:扫描键盘模块
*说明:采用任务模式进行扫描,不循环等待,有效按键压入键盘队列,
*参数:无
*返回:无
**************************************************/
void ScanKey(void)
{
watchdog();
if(kb_hit())
{ os_wait(K_TMO,2,0);
if(kb_hit())
{KeyOk=1;
PushNews(); //有键按下
}
}
if(!kb_hit()&&KeyOk) //是否松开
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -