您好,欢迎访问三七文档
#includereg52.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedintuinttt;uchartemp;//sbitAD_Out=P3^3;//TLC549输出端//sbitCS=P3^1;//TLC549片选信号//sbitAD_In=P3^2;sbitCS=P3^0;//将CS位定义为P3.0引脚sbitCLK=P3^6;//将CLK位定义为P3.6引脚sbitDIO=P3^7;//将DIO位定义为P3.7引脚sbitE=P2^2;//1602使能引脚sbitRW=P2^1;//1602读写引脚sbitRS=P2^0;//1602数据/命令选择引脚sbitlv=P1^2;sbitjdq=P1^4;sbitSWITCH=P1^1;sbitBEEP=P1^3;/*voiddelay(){inti,j;for(i=0;i=10;i++)for(j=0;j=2;j++);}*/voidDelay2(unsignedinti)//延时程序,i是形式参数,i为1时延时约1MS{unsignedintj;for(;i0;i--)//变量i由实际参数传入一个值,因此i不能赋初值for(j=0;j125;j++){;}}////////////////////////////////////////////////////////////////////////voidDelayst(unsignedinti)//延时程序,i是形式参数,i为1时延时约250US{unsignedintj;for(;i0;i--)//变量i由实际参数传入一个值,因此i不能赋初值for(j=0;j31;j++)//此数值为125时大约延时1MS由此计算出为1时延时大约8US31X8=248US≈250US{;}}/////////////////////////////////////////////////////////////////////////////////voidBEEP0(){while(1){unsignedintj;{for(j=1000;j0;j--)//蜂鸣器响大约500MS{BEEP=~BEEP;Delayst(2000);//延时500US发出大约1KHZ频率的响声}BEEP=0;//蜂鸣器不响Delay2(500);//将实际参数500传递给形式参数i,延时500ms也就是0.5S//lv=0;//jdq=1;}}}/*********************************************************************名称:Delay()*功能:延时,延时时间为1ms*del*输入:del*输出:无***********************************************************************/voidDelay(uintdel){uchari,j;for(i=0;idel;i++)for(j=0;j=148;j++);}ucharAD_Change(){unsignedchari;CS=1;//一个转换周期开始CLK=0;//为第一个脉冲作准备CS=0;//CS置0,片选有效DIO=1;//DIO置1,规定的起始信号CLK=1;//第一个脉冲CLK=0;//第一个脉冲的下降沿,此前DIO必须是高电平DIO=1;//DIO置1,通道选择信号CLK=1;//第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0CLK=0;//第二个脉冲下降沿DIO=0;//DI置0,选择通道0CLK=1;//第三个脉冲CLK=0;//第三个脉冲下降沿DIO=1;//第三个脉冲下沉之后,输入端DIO失去作用,应置1CLK=1;//第四个脉冲{for(i=0;i8;i++)//高位在前{CLK=1;//第四个脉冲CLK=0;temp=1;//将下面储存的低位数据向右移temp|=DIO;//将输出数据DIO通过或运算储存在dat最低位}}CS=1;//片选无效returntemp;//返回读出数据}/************************************************************************名称:Average()*功能:中位值平均滤波法,取一共三十个数据,最大和最小的五个数据不要对中间的二十个数据求平均值*输入:三十个待处理的值*输出:得到一个中位的平均值***********************************************************************/uintAverage(uintbuffer[30]){uchari,j;uinttemp;for(i=1;i30;i++)//先对整个数组的三十个值进行从小到大的排列for(j=29;j=i;--j){if(buffer[j-1]buffer[j]){temp=buffer[j-1];buffer[j-1]=buffer[j];buffer[j]=temp;}}//对数组进行处理,去掉一个最大值和一个最小值,中间的二十个值再来求平均值temp=0;for(i=5;i25;i++){temp+=buffer[i];}temp=(uint)(((float)temp)/20+0.5);return(temp);}/************************************************************************名称:AD_Filter()*功能:进行AD采集30次,并进行滤波处理*输入:三十次AD采集值*输出:经过处理后的AD值***********************************************************************/uintAD_Filter(){uintDate_Buffer[30]={0},temp;uchari;for(i=0;i30;i++){Date_Buffer[i]=AD_Change();Delay(1);//延时1毫秒采集一次。这里可以根据工作需要调整时间。}temp=Average(Date_Buffer);return(temp);}/*********************************************************************名称:delay()*功能:延时,延时时间大概为140US。*输入:无*输出:无***********************************************************************/voiddelay1(){inti,j;for(i=0;i=100;i++)for(j=0;j=20;j++);}/*********************************************************************名称:enable(uchardel)*功能:1602命令函数*输入:输入的命令值*输出:无***********************************************************************/voidenable(uchardel){P0=del;RS=0;RW=0;E=0;delay1();E=1;delay1();}/*********************************************************************名称:write(uchardel)*功能:1602写数据函数*输入:需要写入1602的数据*输出:无***********************************************************************/voidwrite(uchardel){P0=del;RS=1;RW=0;E=0;delay1();E=1;delay1();}/*********************************************************************名称:L1602_init()*功能:1602初始化,请参考1602的资料*输入:无*输出:无***********************************************************************/voidL1602_init(void){enable(0x01);enable(0x38);enable(0x0c);enable(0x06);enable(0xd0);}/*********************************************************************名称:L1602_char(ucharhang,ucharlie,charsign)*功能:改变液晶中某位的值,如果要让第一行,第五个字符显示b,调用该函数如下L1602_char(1,5,'b')*输入:行,列,需要输入1602的数据*输出:无***********************************************************************/voidL1602_char(ucharhang,ucharlie,charsign){uchara;if(hang==1)a=0x80;if(hang==2)a=0xc0;a=a+lie-1;enable(a);write(sign);}/*********************************************************************名称:L1602_string(ucharhang,ucharlie,uchar*p)*功能:改变液晶中某位的值,如果要让第一行,第五个字符开始显示abcdef,调用该函数如下L1602_string(1,5,abcdef;)*输入:行,列,需要输入1602的数据*输出:无***********************************************************************/voidL1602_string(ucharhang,ucharlie,uchar*p){uchara;if(hang==1)a=0x80;if(hang==2)a=0xc0;a=a+lie-1;enable(a);while(1){if(*p=='\0')break;write(*p);p++;}}/*********************************************************************名称:Main()*功能:主函数*输入:无*输出:无***********************************************************************/voidMain(){longtemp;uintj;TMOD=0x01;TH0=(65536-20)/256;TL0=(65536-20)%256;EA=1;ET0=1;TR0=1;while(1){if(tt==1){//temp=AD_Change();temp=AD_Filter();j=temp;//这里取的是一个大概的值。真实电压应为temp*5/256,得出的数为x.xx。L1602_init();L1602_char(2,1,j/100+48);L1602_char(2,2,j/10%10+48);L1602_char(2,3,j%10+48)
本文标题:烟雾报警器程序
链接地址:https://www.777doc.com/doc-4384601 .html