📄 fantest.c
字号:
/********************start***************************************/
#include <STDIO.h>
#include <STC12C.h>
#include <Intrins.h>
#include <fan.h>
#include <math.h>
/***************************************************************************
函数名称: Delay_Set
函数功能: 以ms为单位延时一定的时间
输入参数: 延时常数
输出参数: 无
***************************************************************************/
void Delay_Set(uint i)
{
uint m, k;
/* 时钟为11.0592MHz, 每个指令周期的执行时间约为1us. */
for(m=0;m<i;m++)
{
k = CN_TIMER; /* 1ms延时设置 */
while(k--); /* 5个指令周期 */
}
}
/***************************************************************************
函数名称: Delay_us
函数功能: 以6us为单位延时一定的时间,每次调用再额外加5us
输入参数: 延时常数
输出参数: 无
***************************************************************************/
void Delay_us(uint i)
{
while (i--);
}
/***************************************************************************
函数名称: main
函数功能: 数码管显示
输入参数: 无
输出参数: 无
***************************************************************************/
/*****************************************************************************************************************/
/*void main()
{
uchar i,j,k,l;
uchar code data_arry [11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; /* 定义"0~9,-"*/
/* while (1)
{
AD_FAN_CONT1=0;
AD_FAN_CONT2=0;
for (i=0;i<=99;i++)
{
j = i%10;
k = i/10;
if (j ==0 && i!=0)
{
AD_SPEAK=0;
Delay_Set(CN_1000ms);
AD_SPEAK=1;
}
LE1=0;LE2=1;
P2 = data_arry[j];
Delay_Set(CN_5ms);
LE1=1;LE2=0;
P2 = data_arry[k];
Delay_Set(CN_5ms);
LE2=1;
Delay_Set(CN_1000ms);
}
AD_TEMP_LED=0;
Delay_Set(CN_2000ms);
AD_TEMP_LED=1;
Delay_Set(CN_2000ms);
AD_OVTEMP_ALM=0;
Delay_Set(CN_2000ms);
AD_OVTEMP_ALM=1;
Delay_Set(CN_2000ms);
AD_SPEAK=0;
Delay_Set(CN_1000ms);
AD_SPEAK=1;
Delay_Set(CN_2000ms);
AD_FAN_ALM =0;
Delay_Set(CN_2000ms);
AD_FAN_ALM =1;
Delay_Set(CN_2000ms);
AD_FAN_CONT1 =1;
for (l=0;l<20;l++)
{
Delay_Set(CN_2000ms);
}
AD_FAN_CONT1= 0;
Delay_Set(CN_2000ms);
AD_FAN_CONT2 =1;
for (l=0;l<20;l++)
{
Delay_Set(CN_2000ms);
}
AD_FAN_CONT2= 0;
Delay_Set(CN_2000ms);
AD_FAN_CONT1 =1; AD_FAN_CONT2 =1;
for (l=0;l<20;l++)
{
Delay_Set(CN_2000ms);
}
AD_FAN_CONT1 =0; AD_FAN_CONT2 =0;
Delay_Set(CN_2000ms);
}
} */
/*********************************************************************************************************/
/************************************************************************************************************/
/*****************************************************************************
函数名称: ADC_Init
函数功能: ADC初始化
输入参数: ADC通道号
输出参数: 无
****************************************************************************/
//void ADC_Init()
// {
// P1M0 = 0x01; /* P1.0为开漏,其余I/O为传统口*/
// P1M1 = 0x01;
// ADC_CONTR = CN_P10_ADC; /* 选第一路ADC,并开启ADC电源,速率为210个时钟周期*/
// Delay_Set(CN_1ms); // /* 开A/D转换电源后要加延时,1ms以内就足够了*/
// }
/***************************************************************************
函数名称: Get_AD_Result
函数功能: 获取A/D值
输入参数: 无
输出参数: 返回获取的10位A/D
***************************************************************************/
//void Get_AD_Result ()
//{
// uint ADC_fan_low; /* AD转换低位寄存器*/
// uint ADC_fan_high; /* AD转换高位寄存器*/
// uint k,i,l,j=0;
// uint min,max;
// uint ADC_buff[10];
// ADC_DATA = 0;
// ADC_LOW2 = 0;
// for (i = 0;i < 10;i++) /*取10次AD值*/
// {
// ADC_Init();
// ADC_CONTR=ADC_CONTR | 0x08; /*启动AD转换*/
// while(!(ADC_CONTR & 0x10)) /*判断AD是否转换结束!!最好在此加一个延时判断,以免进入死循*/
// {
// l++;
// if (l>250)break; /*最好在此加一个延时判断,以免进入死循*/
// }
// l=0;
// ADC_CONTR = ADC_CONTR & 0xef; /*清转换结束标志*/
// ADC_fan_high = ADC_DATA;
// ADC_fan_low = ADC_LOW2;
// k = ADC_fan_high;
// k <<= 2;
// k = k | (ADC_fan_low & 0x0003);
// ADC_buff[i] = k;
// }
// min = max = ADC_buff[0];
// for (i = 0;i <10; i++)
// {
// j += ADC_buff[i];
// if (min > ADC_buff[i])
// min = ADC_buff[i];
// else
// max = ADC_buff[i];
// }
// j = j -(min + max); /* 去掉最大值和最小值*/
// j = j>>3; /* 取平均值*/
// g_ADC_fan = j;
// }
/***************************************************************************
函数名称: Display_handle
函数功能: 根据温度值进行处理,并在数码管显示
输入参数: 无
输出参数: 无
***************************************************************************/
/*void Display_handle()
{
uchar i,j,l;
uchar code data_arry [11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; /* 定义"0~9,-"*/
// Delay_Set(CN_10ms);
// g_temp_getcnt++;
// if(g_temp_getcnt>=200)
// {
// WDG_CONTR = 0x35;
// l=(g_ADC_fan*6)/10;
// i = l%10;
// j = l/10; */
// LE1 = 0; /* 开个位显示*/
// P2 = data_arry[i]; /* 显示个位*/
// Delay_Set(CN_5ms);
// LE1 = 1; LE2 = 0; /* 开十位显示*/
// P2 = data_arry[j]; /* 显示十位*/
// Delay_Set(CN_5ms);
// LE2 = 1;
// }
// } */
/***************************************************************************
函数名称: main
函数功能: 系统AD测试
输入参数: 无
输出参数: 无
***************************************************************************/
/*void main()
{ // uint l;
System_Init();
for(;;)
{
// AD_FAN_CONT1 =1; AD_FAN_CONT2 =1;
Get_AD_Result ();
Display_handle();
//
}
} */
/********************************************************************************************************/
/***************************************************************************
函数名称: DS18B20_Init
函数功能: 数字温度传感器DS18B20初始化
输入参数: 温度传感器号
输出参数: DS18B20复位成功标志(全局变量)
***************************************************************************/
void DS18B20_Init(uchar temp_number)
{
uchar i;
uchar j,k;
i = 0;
if(temp_number==CN_TEMP1)
{
AD_TEMP1 = 1; /* 传感器输入端口1复位 */
Delay_us(CN_45us); /* 延时45us */
AD_TEMP1 = 0;
Delay_us(CN_525us); /* 精确延时大于480us,取525us */
AD_TEMP1 = 1; /* 拉高端口 */
Delay_us(CN_30us);
k=0; /* 滤波计数器 */
for(j=0;j<10;j++)
{
if(!AD_TEMP1) /* 如果检测结果为0则初始化成功,为1则失败. */
{
k++; /* 检测到低电平加1. */
}
}
if(k>3)
gb_18b20init1_ok = TRUE; /* 复位成功. */
else
gb_18b20init1_ok = FALSE;/* 复位失败. 温感开路或温感损坏 */
Delay_us(CN_200us);
k=0;
AD_TEMP1=1; /* 输入允许. */
if(TRUE==gb_18b20init1_ok)
{
for(j=0;j<10;j++)
{
if(AD_TEMP1) /* 如果检测结果为1则初始化成功,为0则失败. */
{
k++; /* 检测到高电平加1 */
}
}
if(k>3)
gb_18b20init1_ok = TRUE; /* 复位成功. */
else
gb_18b20init1_ok = FALSE;/* 复位失败. 温感对地短路 */
}
}
if(temp_number==CN_TEMP2)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -