展开全部
//********************wendumekuai********************************///////
/**************************************
/
/
输入参数:port通道号 ,进行a/d转换
*************************************/
uint read1543(uchar port)
{
uint ad=0,i;
CLOCK=0;
_CS=0; //初始化
port<<=4; //通道左移四位,把位数置高
for(i=0;i<10;i++) //读取十位
{
if(D_OUT) ad|=0x01; // 读一位数据
D_IN=(bit)(port&0x80); // 获取最高位
CLOCK=1;
delay1();
delay1();
CLOCK=0;
delay1();
delay1();
port<<=1;
ad<<=1;
}
_CS=1;
ad>>=1;
return(ad);
}
//中值滤波, 采集11个数据进行排序,取中值
uint adcmid(uint ch)
{
uint i,j,k,tmp[11];
for(i=0;i<11;i++)
tmp[i]=read1543(ch); //调用a/d转换函数
for(i=0;i<11;i++)
for(j=0;j<11-i;j++) //冒泡排序
if(tmp[j]>tmp[j+1])
{
display();
k=tmp[j];
tmp[j]=tmp[j+1];
tmp[j+1]=k;
}
display();
return tmp[5];
}
//均值滤波,取5个中值滤波的数据,求平均值
uint adcave(uint ch, uint n)
{
uint i,j;
j = 0;
for (i = 0; i < n; i++)
{
j += adcmid(ch); //调用中值滤波函数
display();
}
j = j/n;
return (uint)j;
}
//把采集到得结果,进行数据处理,把各个位数的数据存入数组
void process(uint addata)
{
dis[0]=addata/1000;
temp1=addata%1000;
dis[1]=temp1/100;
temp1%=100;
dis[2]=temp1/10;
dis[3]=temp1%10;
}
//显示温度,上下限的值
void display(void)
{
uchar i;
switch(flag)
{
case 0:for(i=0;i<4;i++) //当flag=0,显示温度
{
P0=tab[dis[i]];
if(i==2) DOT=0;
P2=sel[i];
delay(1);
P2=0xff;
}break;
case 1: // 当flag=1,显示下限
P0=0x8e;
P2=0xfe;
delay(1);
P2=0xff;
P0=tab[a/10];
P2=sel[1];
delay(1);
P2=0xff;
P0=tab[a%10];
P2=sel[2];
delay(1);
P2=0xff;
break;
case 2: //当flag=2,显示上限
P0=0x87;
P2=0xfe;
delay(1);
P2=0xff;
P0=tab[b/10];
P2=sel[1];
delay(1);
P2=0xff;
P0=tab[b%10];
P2=sel[2];
delay(1);
P2=0xff;break;
default:break;
}
}
/*按键扫描程序,低电平有效
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/void keyproc(void)
{
while((P3&0x08)==0)
{
k3=1;
display();
}
while((P3&0x10)==0)
{
k4=1;
display();
}
while((P3&0x20)==0)
{
k5=1;
display();
}
while((P3&0x40)==0)
{
k6=1;
display();
}
while((P3&0x80)==0)
{
k7=1;
display();
}
}
//按键处理程序,以s为标志
void hose(void)
{
s=k3+s;
if(s==1) //s=1,处理下限
{
k3=0;
flag=1;
if(flag==1)
{
display();
keyproc();
if(k4==1)
{
if(a==b) k4=0;
else
a++,k4=0;
}
display();
delay(1);
keyproc();
if(k5==1)
{
if(a==0) k5=0;
else a--,k5=0;
}
delay(1);
display();
delay(1);
}
}
if(s==2) //s=2,处理上限
{
k3=0;
flag=2;
if(flag==2)
{
display();
keyproc();
if(k5==1)
{
if(a==b) k5=0;
else
b-- ,k5=0;
}
display();
keyproc();
delay(1);
if(k4==1)
{
if(b==99) k4=0;
else b++,k4=0;
}
display();
}
}
if(s==3) // s=3,返回温度显示
{
flag=0; //重新置0
k3=0;
s=0;
}
}
//主函数
void main(void)
{
while(1)
{
uint acq,i;
float wen;
for(i=0;i<10;i++)
{
acq=adcave(0x00,5); // 调用中值滤波函数
wen=acq/10.0;
keyproc(); //调用按键扫描函数
hose(); //调用按键处理函数
process(acq); //调用数据处理函数
delay(1);
display(); // 调用温度显示子函数
if(wen<a||wen>b) //判断温度是否超过上限,低于下限,报警
beep=0;
if(wen>=a&&wen<=b)
beep=1;
}
}
}
/**************************************
/
/
输入参数:port通道号 ,进行a/d转换
*************************************/
uint read1543(uchar port)
{
uint ad=0,i;
CLOCK=0;
_CS=0; //初始化
port<<=4; //通道左移四位,把位数置高
for(i=0;i<10;i++) //读取十位
{
if(D_OUT) ad|=0x01; // 读一位数据
D_IN=(bit)(port&0x80); // 获取最高位
CLOCK=1;
delay1();
delay1();
CLOCK=0;
delay1();
delay1();
port<<=1;
ad<<=1;
}
_CS=1;
ad>>=1;
return(ad);
}
//中值滤波, 采集11个数据进行排序,取中值
uint adcmid(uint ch)
{
uint i,j,k,tmp[11];
for(i=0;i<11;i++)
tmp[i]=read1543(ch); //调用a/d转换函数
for(i=0;i<11;i++)
for(j=0;j<11-i;j++) //冒泡排序
if(tmp[j]>tmp[j+1])
{
display();
k=tmp[j];
tmp[j]=tmp[j+1];
tmp[j+1]=k;
}
display();
return tmp[5];
}
//均值滤波,取5个中值滤波的数据,求平均值
uint adcave(uint ch, uint n)
{
uint i,j;
j = 0;
for (i = 0; i < n; i++)
{
j += adcmid(ch); //调用中值滤波函数
display();
}
j = j/n;
return (uint)j;
}
//把采集到得结果,进行数据处理,把各个位数的数据存入数组
void process(uint addata)
{
dis[0]=addata/1000;
temp1=addata%1000;
dis[1]=temp1/100;
temp1%=100;
dis[2]=temp1/10;
dis[3]=temp1%10;
}
//显示温度,上下限的值
void display(void)
{
uchar i;
switch(flag)
{
case 0:for(i=0;i<4;i++) //当flag=0,显示温度
{
P0=tab[dis[i]];
if(i==2) DOT=0;
P2=sel[i];
delay(1);
P2=0xff;
}break;
case 1: // 当flag=1,显示下限
P0=0x8e;
P2=0xfe;
delay(1);
P2=0xff;
P0=tab[a/10];
P2=sel[1];
delay(1);
P2=0xff;
P0=tab[a%10];
P2=sel[2];
delay(1);
P2=0xff;
break;
case 2: //当flag=2,显示上限
P0=0x87;
P2=0xfe;
delay(1);
P2=0xff;
P0=tab[b/10];
P2=sel[1];
delay(1);
P2=0xff;
P0=tab[b%10];
P2=sel[2];
delay(1);
P2=0xff;break;
default:break;
}
}
/*按键扫描程序,低电平有效
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/void keyproc(void)
{
while((P3&0x08)==0)
{
k3=1;
display();
}
while((P3&0x10)==0)
{
k4=1;
display();
}
while((P3&0x20)==0)
{
k5=1;
display();
}
while((P3&0x40)==0)
{
k6=1;
display();
}
while((P3&0x80)==0)
{
k7=1;
display();
}
}
//按键处理程序,以s为标志
void hose(void)
{
s=k3+s;
if(s==1) //s=1,处理下限
{
k3=0;
flag=1;
if(flag==1)
{
display();
keyproc();
if(k4==1)
{
if(a==b) k4=0;
else
a++,k4=0;
}
display();
delay(1);
keyproc();
if(k5==1)
{
if(a==0) k5=0;
else a--,k5=0;
}
delay(1);
display();
delay(1);
}
}
if(s==2) //s=2,处理上限
{
k3=0;
flag=2;
if(flag==2)
{
display();
keyproc();
if(k5==1)
{
if(a==b) k5=0;
else
b-- ,k5=0;
}
display();
keyproc();
delay(1);
if(k4==1)
{
if(b==99) k4=0;
else b++,k4=0;
}
display();
}
}
if(s==3) // s=3,返回温度显示
{
flag=0; //重新置0
k3=0;
s=0;
}
}
//主函数
void main(void)
{
while(1)
{
uint acq,i;
float wen;
for(i=0;i<10;i++)
{
acq=adcave(0x00,5); // 调用中值滤波函数
wen=acq/10.0;
keyproc(); //调用按键扫描函数
hose(); //调用按键处理函数
process(acq); //调用数据处理函数
delay(1);
display(); // 调用温度显示子函数
if(wen<a||wen>b) //判断温度是否超过上限,低于下限,报警
beep=0;
if(wen>=a&&wen<=b)
beep=1;
}
}
}
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
单片机,即单片微控制器,也称为单片微型计算机,是将中央处理器(CPU)、存储器(ROM,RAM)、输入/输出接口和其他功能部件集成在一块 在一个小块的集成电路上,从而实现对整个电路或系统的数字式控制。单片机不是完成某一个逻辑功能的芯片,而是...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
2010-06-18
展开全部
输入参数:port通道号 ,进行a/d转换
*************************************/
uint read1543(uchar port)
{
uint ad=0,i;
CLOCK=0;
_CS=0; //初始化
port<<=4; //通道左移四位,把位数置高
for(i=0;i<10;i++) //读取十位
{
if(D_OUT) ad|=0x01; // 读一位数据
D_IN=(bit)(port&0x80); // 获取最高位
CLOCK=1;
delay1();
delay1();
CLOCK=0;
delay1();
delay1();
port<<=1;
ad<<=1;
}
_CS=1;
ad>>=1;
return(ad);
}
*************************************/
uint read1543(uchar port)
{
uint ad=0,i;
CLOCK=0;
_CS=0; //初始化
port<<=4; //通道左移四位,把位数置高
for(i=0;i<10;i++) //读取十位
{
if(D_OUT) ad|=0x01; // 读一位数据
D_IN=(bit)(port&0x80); // 获取最高位
CLOCK=1;
delay1();
delay1();
CLOCK=0;
delay1();
delay1();
port<<=1;
ad<<=1;
}
_CS=1;
ad>>=1;
return(ad);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询