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

📄 pic16f690.c

📁 基于PIC16F690的触摸感应程序
💻 C
字号:
#include  "pic.h"            
__CONFIG(INTIO&MCLRDIS&BORDIS&UNPROTECT&BORDIS&PWRTEN&WDTDIS);
//代码保护关,WRT、BODEN、PWRTE关,看门狗关,MCLR在内部连接到VDD

#define TRISC2OUT    TRISC4
#define C2OUT        RC4
#define TRISC2IN     TRISC0
#define TRISC12IN3   TRISC3
#define TRIST1CKI    TRISA5
#define LED_OUT      RC1
#define TRIST_LED    TRISC1
#define TRIST_SDO    TRISC7
#define SDO          RC7
#define TRIST_SDI    TRISB4
#define TRIST_SCK    TRISB6

long present;
unsigned char i;
unsigned char first;
unsigned char avg_interval;
static char AVG_interval;
static int Frequency_Value;
static int average;


void Initial(void);                
void Capinitial(void);
void CapISR(void);
void RestartTimer(void);
void interrupt isr(void);
void SPI_Initial(void);
void SPI_SendData(char data);

void Initial()
{ 
  i         = 0;
  TRISC2OUT = 0;                    //数据输出
  C2OUT     = 0;
  TRISC2IN  = 1;                    //C2VIN+、C12IN3-为模拟口输入口
  TRISC12IN3= 1;                  
  TRIST1CKI = 1;
  LED_OUT   = 0;
  TRIST_LED = 0;
  Capinitial() ;
  SPI_Initial();
  GIE       = 1;                    //全局中断开
}

void Capinitial()
{
  first   = 60;                     //上电延迟
  avg_interval= 0;
  AVG_interval= 32;                 //随环境改变参数

  OSCCON  = 0X6F;                   //内部时钟4M
  CM1CON0 = 0X97;                   //C1比较器开,反相输出,C1OUT内部输出,C1VIN+连接到C1Vref
  CM2CON0 = 0XA3;                   //C2比较器开,同相输出,C2OUT引脚输出,C2VIN+连接到C2IN+
  CM2CON1 = 0X00;
  SRCON   = 0XF0;                   //SR锁存器开
  VRCON   = 0X8F;                   //C1Vref=2/3*VDD
  ANSEL   = 0X90;                   //C2VIN+、C12IN3-为模拟口
  ANSELH  = 0X00;
  
  OPTION  = 0X85;                   //TMR0预分频1:64
  TMR0    = 0;
  TMR1L   = 0;
  TMR1H   = 0;
  T1CON   = 0X07;                   //TMR1预分频1:1 ,TMR1使能
  INTCON  = 0;                      //清中断寄存器
  T0IE    = 1;                      //TMR0中断使能
}

void CapISR()
{
  Frequency_Value = TMR1L + (unsigned int)(TMR1H << 8);
  if (first > 0)
     {
        first--;
        average = Frequency_Value;
        RestartTimer();
        return;
      }
  
  present = (long)average - (long)Frequency_Value;
  if (present < 0)
      present = 0;
  else
      present = present*1000/average;

  if (present > 10)
      LED_OUT = 1;
  if (present < 5)
      LED_OUT = 0;

  if (avg_interval < AVG_interval)
      avg_interval++;
  else
      avg_interval = 0;
  
  if (avg_interval == AVG_interval)
     {
     	  average = average + ((long)(Frequency_Value) - (long)(average))/16;
     	  i++;
     	  if (i == 2)
     	  	 {
     	  	 	 i = 0;
                 SPI_SendData(TMR1H);
                 SPI_SendData(TMR1L);
     	  	 	}
     	}
  
  RestartTimer();
 } 

void RestartTimer()
{
  T0IF    = 0;
  TMR0    = 0;
  TMR1L   = 0;
  TMR1H   = 0;
  T1CON   = 0X07;                   //TMR1预分频1:1 ,TMR1使能
  T0IE    = 1;                      //TMR0中断使能
}
 
void interrupt isr(void)
{
  if (T0IF == 1 && T0IE == 1)       //TMR0溢出中断
     {
        TMR1ON = 0;                 //TMR1中止
        CapISR();
      }
  if ( T0IF == 1)
     RestartTimer();
}
 
void SPI_Initial()                  //主模式,只发送数据
{
	SSPIE     = 0;                  //禁止SSP中断
	SSPIF     = 0;                  //清SSP中断标志位                    
	TRIST_SDO = 0;                  //SDO为输出
	SDO       = 0;
	TRIST_SDI = 0;                    
    RB4 = 0;
	TRIST_SCK = 0;                  //SCK为输出
	SSPCON    = 0X20;               //SSPEN=1;CKP=0 , FOSC/4 
	SSPSTAT   = 0X80;
}
	
void SPI_SendData(char data)        //SPI发送数据  
{
	SSPBUF = data;			        //启动发送
	do
	  {
      NOP();
	   }while(SSPIF == 0);		    //等待发送完毕
    SSPIF = 0;			            //清除SSPIF标志
}
               
void main()
{
  Initial();
  while(1)
    {
       NOP();
     }
} 







⌨️ 快捷键说明

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