⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad10.c

📁 采用PIC单片机
💻 C
字号:
#include		<pic.h>
__CONFIG (XT&PROTECT&PWRTEN&BOREN&WDTEN);
#define   N 5
#define   uchar    unsigned  char
#define   uint     unsigned  int
static volatile bit	 SDO_595 	@ (unsigned)&PORTC*8+5;  //串行数据输入 
static volatile bit  SCK_595	@ (unsigned)&PORTC*8+3;  //移位时钟脉冲
static volatile bit	 LACK_595 	@ (unsigned)&PORTB*8+5;  //输出锁存器控制脉冲

uchar  table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x84,0x8e,0xaa};


const uint C_table[]={
33,34,36,37,39,41,42,44,46,48,
50,52,54,56,59,61,63,66,68,71,
74,77,79,82,85,88,92,95,98,102,
105,109,113,117,120,124,129,133,137,141, 
146,150,155,160,164,169,174,179,184,190,
192,200,206,211,217,223,228,234,240,246, 
252,258,264,271,277,283,290,296,303,309, 
316,323,329,336,343,349,356,363,370,377, 
384,391,398,404,411,415,425,432,439,446, 
453,460,467,474,480,487,494,501,507,514};
union adres
{
	uint    y1;
    uchar  adre[2];
}adresult;
					           //定义一个共用体,用于存放A/D转换的结果
uchar   temp0=0;

uint    filter_result;
void    IO_initial();  //I/O初始化子程序
void    adinitial();   //A/D转化初始化子程序
void    WR_595(uchar  Xs_result ); //写数据到74HC595函数
void    Out_595(void);               //更新74HC595输出数据函数
void    delay(uint z);
void    delay1(uint z);
uint    get_ad();
uint    filter();                   //软件滤波采用中值滤波法
//主程序
main()
{
//	ucahr i;
	uchar  i1,second=0,minute=0;
	uchar  Ge_sh;
	uchar  Sh_sh;
	adinitial();				//A/D转换初始化
	IO_initial();				//系统各I/O口初始化	
//	ei();					    //总中断允许


  while(1)
  {	 
	  asm("clrwdt");
	  temp0=0;
	  filter_result=filter(); 
//	  filter_result=94;

	  for(i1=0;i1<100;i1++)
	  {
			 if(filter_result<=33)
			   {
				    temp0=0;
				    break;
			    }
			  else
			    {
				     if(filter_result>=C_table[i1+1])
			             temp0++;  
			         else 
			              break;
			     }	        
	   }
	   WR_595(table[15]);
	   WR_595(table[15]);
	   
	   Ge_sh=temp0%10;
	   Sh_sh=temp0/10;   
	   WR_595(table[Ge_sh]);
	   WR_595(table[Sh_sh]);
	   
	   second++;
	   if(second==60)
	   {
	   second=0;
	   minute++;
	   }
	   delay1(490);
	   Ge_sh=second%10;
	   Sh_sh=second/10;
	   WR_595(table[Ge_sh]);
	   WR_595(table[Sh_sh]);
	   
	   if(minute==60)
	   minute=0;
	   Ge_sh=minute%10;
	   Sh_sh=minute/10;
	   WR_595(table[Ge_sh]);
	   WR_595(table[Sh_sh]);
	   Out_595();
   }
}
//I/O初始化子程序
void IO_initial()
{
	TRISC=0X00;			        //C口为输出
	TRISB5=0;
}

//A/D转化初始化子程序
void	adinitial()
{
	ADCON0=0x69;			     //选择A/D通道为AN5(RE0),打开A/D转换器
		     				     //在工作状态,且使A/D转换时钟为8tosc
	ADCON1=0X80;			     //转换结果右移,及ADRESH寄存器的高6位为"0"
	                 		     //且把RA5口设置为模拟量输入方式
// 	PIE1=0X00;
//	ADIE=1;				         //A/D转换中断允许
//	PEIE=1;				         //外围中断允许
	TRISE0=1;				     //设置RA5为输入方式
}


/*中断服务程序
void    interrupt	adint(void)
{
	ADIF=0;				         //清除中断标志
	adresult.adre[0]=ADRESL;
	adresult.adre[1]=ADRESH;	 //读取并存储A/D转换结果,A/D转换的结果通过共
							     //用体的形式放入了变量y1中   
		
	ADGO=1;				         //启动下一次A/D转换
} */ 
//写数据到74HC595函数
 void  WR_595(uchar  Xs_result )
 {
   uchar  count1;
   
   for(count1=0;count1<=7;count1++)
   {
     if((Xs_result&0x80)==0x80)  //最高位为1,则向SDo_595发送1
	    SDO_595=1;  //发出数据的最高位
	 else  
	    SDO_595=0;
	 
	 Xs_result<<=1;      //右移位
	 SCK_595=0;	   
	 asm("nop");
     asm("nop");  
	 SCK_595=1;     //产生上生    
	}  

 }
 //更新74HC595输出数据函数
 void  Out_595(void)
 {
   LACK_595=0;
   asm("nop");
   asm("nop");   
   LACK_595=1;  //上升沿锁存数据
 }

void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=1;y>0;y--);
}
void delay1(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}
uint get_ad()
{
 // delay(1);                      //采样时间延时
  ADGO=1;				        //启动A/D转换
  while(ADGO==1);
  if(ADGO==0)
  adresult.adre[0]=ADRESL;
  adresult.adre[1]=ADRESH;	     //读取并存储A/D转换结果,A/D转换的结果通过共
  return  adresult.y1;						     //用体的形式放入了变量y1中  
	}
//软件滤波采用中值滤波法
uint filter()
{
	uint value_buf[N];
	uint count,i,j,temp;
	for (count=0;count<N;count++)
	{
		delay(1);
		value_buf[count] = get_ad();
		
	}
	for (j=0;j<N-1;j++)
	{
		for (i=0;i<N-j;i++)
		{
			if ( value_buf[i]>value_buf[i+1] )
			{
				temp = value_buf[i];
				value_buf[i] = value_buf[i+1]; 
				value_buf[i+1] = temp;
			}
		}
	}
return value_buf[(N-1)/2];
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -