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

📄 舵机测试仪__.c

📁 mega8产生的两路PWM信号
💻 C
字号:
#include<main.h>

//A/D转换
interrupt [ADC_INT] void ADC_R(void)
{SREG|=0x80;
if(zz==1){ch1=ADCW;zz=2;}
else if(zz==2){ch2=ADCW;zz=1;}
 } 

//T1溢出 
interrupt [TIM1_OVF] void T1_OVF(void)
{if(fs==1)
 {if(td==1){td=2;OCR1B=ch1*5/31+190;}
 else {td=1;OCR1B=ch2*5/31+190;}
 TCNT1=0;}
 if(fs==4){ch1=js1;ch2=js2;TCNT1=3036;js1=js2=0;}//500ms
 }
 
//T1比较匹配A 
interrupt [TIM1_COMPA] void T1_COMPA(void)
{if(td==1)out1=1;
else out2=1;
 }
 
//T1比较匹配B 
interrupt [TIM1_COMPB] void T1_COMPB(void)
{if(td==1)out1=0;
else out2=0;
 }

//INT0中断
interrupt [EXT_INT0] void INT0(void)
{if(fs==2)
 {if(in0==0){in0=1;TCNT1=0x00;MCUCR&=0xfe;}
 else if(in0==1){in0=0;ch1=TCNT1;MCUCR|=0x01;}}
 if(fs==4)
 {js1=js1+1;}
 }

//INT1中断 
interrupt [EXT_INT1] void INT1(void)
{if(fs==2)
{if(in1==0){in1=1;TCNT1=0x00;MCUCR&=0xfb;}
 else if(in1==1){in1=0;ch2=TCNT1;MCUCR|=0x04;}}
 if(fs==4)
 {js2=js2+1;}
 }
 
//延时
void delay_us(uint i)
{while(i--);
 }

//主函数
void main(void)
{//uchar i=0;
 SREG=0x80;DDRB=0xff;
 while(1)
 {ini_xt();
  display();
  if(1==get_key()){if(fs<4)fs=fs+1;else fs=1;ch1=ch2=0;}
  }    
 }

 
 
 
 
 
 
//------------------------注释-------------------------------------
//   TCNT2      T2计数寄存器          OCR2       T2比较寄存器      
//   TIMSK      Tn中断屏蔽寄存器      TIFR       Tn中断标志寄存器 
//   SFIOR      特殊功能I/O寄存器     TCCR2      T2控制寄存器
//   
//   TCNT1H     T2计数寄存器H         TCNT1L     T2计数寄存器L
//   OCR1AH     T1比较寄存器AH        OCR1AL     T1比较寄存器AL
//   OCR1BH     T1比较寄存器BH        OCR1BL     T1比较寄存器BL
//   ICR1H      输入捕捉寄存器        ICR1L      输入捕捉寄存器L  
//   TCCR1A     T1控制寄存器A         TCCR1B     T1控制寄存器B
//
//   MCUCR    	中断方式控制		  GICR		外部中断使能 
//	 GIFR		外部中断标志
//
//
//
//
#include<main.h>
//定义
uint ch1=80,ch2=80;                      //通道1,通道2,
uchar fs=1,td=1;                   //方式(输入输出),输入通道,ADC结果指针
uchar in0=0,in1=0;			//外部中断0,1登记
uint js1=0,js2=0;							//转速计数
uchar zz=1;                          //AD转换切换
const uchar sz[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
#include<main.h>

//打印显示
void display(void)
{uchar i,j,k;

 switch(fs)
        {case 1:hd=0;ld=1;break;       //红灯亮-双脉宽输出
		 case 2:hd=1;ld=0;break;       //绿灯亮-双脉宽输入
		 case 3:hd=1;ld=1;break;       //红绿灯亮-数字舵机
		 case 4:hd=0;ld=0;break;}      //红绿灯灭-转速测量
 switch(fs){case 1:j=90;break;case 2:j=0;break;case 3:j=0;break;case 4:j=0;break;}
 if(fs==4)k=0;else k=128;
 for(i=0;i<10;i++)                         //扫描数码管
     {dat=sz[(ch1/8+j)/100]+k;x1=0;delay_us(50);x1=1;
	  dat=sz[(ch1/8+j)/10%10];x2=0;delay_us(50);x2=1;
	  dat=sz[(ch1/8+j)%10];x3=0;delay_us(50);x3=1;
	  dat=sz[(ch2/8+j)/100]+k;x4=0;delay_us(50);x4=1;
	  dat=sz[(ch2/8+j)/10%10];x5=0;delay_us(50);x5=1;
	  dat=sz[(ch2/8+j)%10];x6=0;delay_us(50);x6=1;
	  } 

 }
#include<main.h>

//扫描按键
uchar get_key(void)
{uchar key=0;
 DDRC&=0xef;
 PORTC|=0x10;
 if((PINC&0x10)==0x00)
    {key=1;
     while((PINC&0x10)==0x00);
	 }
 else key=0;
 return(key);
}
#include<main.h> 

//准备
void ini_xt(void)
{switch(fs)
        {case 1://红灯亮-双脉宽输出
		        //I/O
		        DDRD=0xff;              //PD全部设为输出
				//ADC            
		        if(zz==1){ADMUX=0x00;}  //外部参考电压,右对齐,通道0
		        else if(zz==2){ADMUX=0x01;}//外部参考电压,右对齐,通道1    //ADC
			ADCSRA=0xc8+6;          //ADC使能中断,开始转换,允许中断,2分频因子		  
				//T1
			OCR1A=0x47;             //T1比较匹配A
    			TIMSK=0x1c;             //使能比较A/B;使能溢出
			TCCR1A=0x03;            //10位快速PWM模式
			TCCR1B=0x0b;            //10位快速PWM模式;8分频
				//外部中断
			GICR=0x00;	        //INT0-INT1禁止中断
				//其他
				
				break;
		 case 2://绿灯亮-双脉宽输入
		        //I/O
			DDRD.2=DDRD.3=0;        //中断引脚配置为输入
				//ADC
			ch1=ch2=0;	
				//T1
			TIMSK=0x00;             //屏蔽T1所有
			TCCR1B=0x01;            //无分频(系统时钟)
				//外部中断
			MCUCR|=0x0f;            //INT0-INT1上升沿触发
			GICR=0xc0;	        //INT0-INT1使能中断
				//其他
				
		        break;
		 case 3://红绿灯亮-数字舵机
		        //I/O
			DDRD=0xff;              //PD全部设为输出
				//ADC
				
				//T1
				
				//外部中断
				
				//其他
				
		        break;
		 case 4://红绿灯灭-转速测量
		        //I/O
				DDRD=DDRD&0xf3;	   //中断引脚配置为输入
				//ADC
				
				//T1
				TIMSK=0x04;        //使能T1中断
				TCCR1B=0x03;       //系统时钟64分频
				//外部中断
				MCUCR=MCUCR|0x0f;  //INT0-INT1上升沿触发
				GICR=0xc0;	   	   //INT0-INT1使能中断
				//其他
				
		        break;
		 }
 }

⌨️ 快捷键说明

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