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

📄 dong0.c

📁 可实现双通道ad转换 四位数码管动态扫描
💻 C
字号:

#include<pic.h>              //包含单片机内部资源预定义
 //__CONFIG(0x1832);        
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
 const char dis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83}; 
 //定义常数0-9的数据表格


 unsigned int ADResult[2],Result;
 unsigned char dis_index, dis_buf[5];//缓冲数列

 unsigned char channel,qian,bai,shi,ge,yw,temp,adys,ad_cnt,ad_time,disp_time;

 static bit adflag,adflag1,bUpdateDisplay ;

 #define PORTBIT(adr,bit) ((unsigned)(&adr)*8+(bit))

 static bit PORTB_2@PORTBIT(PORTB,2); 

 
// void ADReadFunc(uchar channel);
 void  DELAY();              //delay函数申明
 void  init();               //I/O口初始化函数申明
 void  display(void);       //显示函数申明
 union ADData {  unsigned int ADTemp; unsigned char ADBuffer[2]; }ADunion;
 unsigned int itime=0,flag=2; /*定时器1中断计数*/
//----------------------------------------------
//延时程序

void delay_us(unsigned int time)
{     
    do{
        time--;
    }while (time > 1);
}

void delay_ms(unsigned int time)
{
    while(time != 0) 
    {
        delay_us(1000); 
        time--;
    }
}	



//------------------------------------------------
//读AD值 
 void ADReadFunc(unsigned char channel)
 {
  
  ADCON0=(channel<<3)|0x41; //fosc/8
  delay_us(2); 
  ADGO=1;
  while(ADGO);

  ADunion.ADBuffer[0]=ADRESL; 
  ADunion.ADBuffer[1]=ADRESH;
  ADResult[channel]=ADunion.ADTemp=ADRESH*256+ADRESL;
  ADResult[channel]=ADResult[channel]+ADunion.ADTemp;
  
  if(++ad_cnt==5) {ad_cnt=0; ADResult[channel]=ADResult[channel]/5;}       //求5次结果的平均值  
 }
//-----------------------------------------------
 void  init_timer1()
 {
  TMR1IF=0;
  TMR1H=0xFC;  //
  TMR1L=0x17;  //  //定时器赋初值(1ms/一周期1us)
  T1CON=0x00;  //开启定时器1,定时模式1分频
  TMR1IE=1;   //开启定时器1中断
  PEIE=1; 
  TMR1ON=1;
  GIE=1;
  
 }
//-----------------------------------------------
//中断函数                                         //修改为1MS
 void interrupt timer1(void)
 {
    TMR1ON=0;
    TMR1IF = 0; //清除TMR1 中断标志

    if(++ad_time==2) {adflag=1;ad_time=0;}  //2ms
    if(++disp_time==3) {bUpdateDisplay=1;disp_time=0;} //3ms
     
    TMR1H=0xFC;
    TMR1L=0x17;
    TMR1ON=1;
  }


  void display(void)
  {
    
    if(++dis_index==5) dis_index=0;
    PORTB=0xFF;                                          //关显示
    PORTD = dis_buf[dis_index]; 
    switch(dis_index)
         {
               case 0:
                 PORTB=0xFE;
                 break;
               case 1:
                 PORTB=0xFD;
                 break;
               case 2:
		 PORTB=0xFB;
                 break;
               case 3:
		 PORTB=0xF7;
                 break;
               case 4:
		 if(++itime<=200) {temp=ADResult[0];dis_buf[3]=dis_code[10];}
       		 else
                  {
         	      if(++itime<=400) {temp=ADResult[1];dis_buf[3]=dis_code[11];}
                      else itime=0;
                  }
              	
    		 bai=temp/0x64;                                        //求显示的百位
    		 shi=(temp%0x64)/0xa;                                  //求显示的十位
    		 ge=(temp%0x64)%0xa;                                   //求显示的个位
    		 dis_buf[0] = dis_code[ge];                            // 个位
    		 dis_buf[1] = dis_code[shi];  //十位
    		 dis_buf[2] = dis_code[bai];  // 百位
		 dis_buf[3] = dis_code[11];
                 dis_buf[4] = 0xff;
         }
  }
//-----------------------------------------------
 //初始化函数
 void  init()               
  {
   PORTA=0XFF; 
   PORTB=0XFF;   
   PORTD=0XFF;               //熄灭所有显示
   TRISA=0X03;                //设置RA0-4为输入,其他为输出  
   TRISB=0XF0;        
   TRISD=0X00;               //设置D口全为输出
   ADCON1=0X89;              //转换结果右移,及ADRESH寄存器的高6位为"0"
   ADResult[0]=0; 
   ADResult[1]=0; 
  
   }


//------------------------------------------------
  //主程序开始
 void  main()               
 {
  init_timer1();
  init();
  
  dis_index = 0;
  yw=0; 
  adys=0;
  while(1)                  //死循环
  { 
   if(adflag)
       {
         adflag=0;
         ADReadFunc(0);  //ra0 ad转换 每隔2ms转换
         ADReadFunc(1);  //ra1 ad转换
       } 
   
  if(bUpdateDisplay)   //3ms
      {
       bUpdateDisplay=0;
       display();       
      }
  }
 }



 
    

⌨️ 快捷键说明

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