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

📄 mcu1__.c

📁 用atmega128单片机做的示波器
💻 C
字号:

#include <mega8.h>   
#include <delay.h>  
#include <stdio.h> 
#include <math.h>
#define k0 PORTB.0
#define k1 PORTB.1
#define k2 PORTC.0
#define k3 PORTC.1
#define dat PORTB.3
#define clk PORTB.5
#define ss PORTB.2
bit	time_1ms_ok;
unsigned long int time0_old,time0_new,freq_time;
unsigned long int freq;
unsigned char eep,z,i,p[9]={0,0,1,2,3,4,5,6,7},w[9]={0,1,2,3,4,5,6,7,8},tri=0,hold=0,fr,kr,zhi;
unsigned char e[9]={0b00000011,0b00000001,0b00000101,0b00000010,0b00000000,0b00000100,0b00001010,0b00001000,0b00001100};
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
	time0_new = TCNT1;			// 1ms到,记录当前T/C0的计数值
	time_1ms_ok = 1; 
}
 spi_out(unsigned char j)
{  
  unsigned char u;
  ss=0;
  for(u=0;u<8;u++)
       { 
         if(j&0b10000000)
           {
           dat=1;
           }
          else
           {
           dat=0;
           }
         delay_us(1);
         clk=1;
         delay_us(1);
         clk=0;
         delay_us(1);
         j<<=1;
       } 
       delay_us(1);
   ss=1;

}
 
void freq_to_disbuff()
{            if(fr==0)
            {
            freq=freq*4;
            }      
             eep=freq>>24;//取频率高8位  
             spi_out(eep);
             delay_us(10);
             eep=(freq>>16)&0xff; 
             spi_out(eep);
             delay_us(10);
             eep=(freq>>8)&0xff;
             spi_out(eep); 
             delay_us(10);             
             eep=freq&0xff;//取频率低8位
             spi_out(eep); 
             delay_us(10);
             spi_out(w[i]);
             delay_us(10);           
             spi_out(tri);
             delay_us(10);
             spi_out(hold);
             delay_us(10); 
             spi_out(kr);
             delay_us(10);
             spi_out(zhi);
             delay_us(10);
             } 

 
void time()
{
 if (time_1ms_ok)
    	{	// 累计T/C0的计数值
    		if (time0_new >= time0_old) freq = freq + (time0_new - time0_old);
    		else freq = freq + (65536 - time0_old + time0_new);
    		time0_old = time0_new;
    		if (++freq_time >=125)
    		{
    			freq_time = 0;	
    					// 1000ms到,
    		  	freq_to_disbuff();
    					// 将1000ms内的脉冲计数值送显示
    			freq = 0;
    		} 
        		time_1ms_ok = 0;
    	} 
} 
void main(void)
{
unsigned char q; 
DDRD=0XFF;
DDRB.5=1;
DDRB.3=1;
DDRB.2=1; 
DDRB.0=1;
DDRB.1=1; 
DDRC.0=1;
DDRC.1=1;
DDRC=0X00;
DDRD.5=0;
PORTC.0=1;
PORTC.1=1;
PORTC.2=1;
PORTC.3=1;
PORTC.4=1;
PORTC.5=1; 
TCCR1B=0x06;					// 外部T1脚下降沿触发计数,普通模式
TCNT1=0x00;	                                        // T/C2初始化
TCCR2=0b00001111; 				// 内部时钟,128分频(16M/1024=15.625KHz),CTC模式
TCNT2=0x00;
OCR2=0x7C;					// OCR2 = 0x7C(124),(124+1)/15.625=8ms
TIMSK=0x80;	 				// 允许T/C2比较匹配中断
time0_old = 0; 
#asm("sei")      
k0=0;
k1=0;
k2=0;
k3=0;
while(1)
{  look:
  time();
   zhi=0;
    if(w[i]==7||w[i]==8)
    {
     TCCR2=0b00001111;
     fr=1;
    } 
    else
    {
    TCCR2=0b00001110;
         fr=0;
    }
    if(PINC.5==0)
            {   
                for(q=0;q<100;q++)
                    {
                     delay_us(100);
                    }
                    if(PINC.5==0)
                       { 
                           if(i!=8)
                             { 
                                 i++;
                               PORTD=p[i]; 
                              
                             }
                       }
                  while(PINC.5==0)
                       {
                       }
           }
    if(PINC.4==0)
            {   
                for(q=0;q<100;q++)
                    {
                     delay_us(100);
                    }
                    if(PINC.4==0)
                       { 
                           if(i!=0)
                             { 
                                 i--;
                               PORTD=p[i];
                               z=i+1;
                              
                             }
                       }
                  while(PINC.4==0)
                       {
                       }
           }
    if(PINC.3==0)
            {   
                for(q=0;q<100;q++)
                    {
                     delay_us(100);
                    }
                    if(PINC.3==0) 
                    { 
                      if(tri==0)
                      {
                       tri=1;
                      } 
                      else
                      {
                      tri=0;
                      }
                   
                    }
                          
                  while(PINC.3==0);
           }
 
  /* if(PINC.2==0)
            {   
                for(q=0;q<100;q++)
                    {
                     delay_us(100);
                    }
                    if(PINC.2==0) 
                    { 
                      if(hold==0)
                      {
                       hold=1;
                      } 
                      else
                      {
                      hold=0;
                      }
                   
                    }
                          
                  while(PINC.2==0);
           }      */
           if(PINC.2==0)
           {
            for(q=0;q<100;q++)
                    {
                     delay_us(100);
                    }
                    
                       while(PINC.2==0);
                       zhi=1;
                       while(1)
                       {           
                                    time();
                                   if(PINC.2==0)
                                   {
                                    for(q=0;q<200;q++)
                                                   {
                                                     delay_us(100);
                                                   }
                                         if(PINC.2==0)
                                         {
                                         while(PINC.2==0);
                                         goto look;
                                         }          
                                   }
                       
                       
            
                                   if(PINC.5==0)
                                         {   
                                              for(q=0;q<200;q++)
                                                   {
                                                     delay_us(100);
                                                   }
                                              if(PINC.5==0)
                                                   { 
                                                      if(kr!=8)
                                                   { 
                                                       kr++;
                                                       k0=(e[kr]&0b00000001);
                                                       k1=((e[kr]>>1)&0b00000001); 
                                                       k2=((e[kr]>>2)&0b00000001); 
                                                       k3=((e[kr]>>3)&0b00000001); 
                                                    }
                                                    }
                                              while(PINC.5==0)
                                                    {
                                                    }
                                          }
                                  if(PINC.4==0)
                                          {   
                                               for(q=0;q<200;q++)
                                                    {
                                                      delay_us(100);
                                                    }
                                               if(PINC.4==0)
                                                    { 
                                                       if(kr!=0)
                                                    { 
                                                       kr--;
                                                       k0=(e[kr]&0b00000001);
                                                       k1=((e[kr]>>1)&0b00000001); 
                                                       k2=((e[kr]>>2)&0b00000001); 
                                                       k3=((e[kr]>>3)&0b00000001); 
                              
                                                    }
                                                    }
                                              while(PINC.4==0)
                                                   {
                                                   }
                                }
           
                       }
           }
           
           
           
           
           
           
           
           
           
           
}
}

⌨️ 快捷键说明

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