知道很多高手讨厌菜鸟直接上传一大段程序,但小弟实在比较菜,怕有任何问题,另外程序很小,所以希望高手指点下
我这里用的是ATMEGA16,输入利用AD转换功能,通过电位器调节电压,读取AD值,并将所得的AD转换值高八位赋值给定时器高八位,同理第八位赋值给定时器第八位,旋转电位器,AD值变化,则定时器初值变化,实现周期和频率的变化。
程序如下:
#include <iom16.h>
#include<intrinsics.h>
#define uchar unsigned char
#define uint unsigned int
uint GAOWEI,DIWEI;
uchar i,status,cnt=0;
/************************************************/
void port_init(void)
{
PORTA = 0xFF;
DDRA = 0xFF;
PORTB = 0xFF;
DDRB = 0xFF;
PORTC = 0xFE;
DDRC = 0xFE;
PORTD = 0xFF;
DDRD = 0xFF;
}
/************************************************/
void adc_init(void)
{
ADCSRA = 0xE3;
ADMUX = 0xc7;
}
//***************************
void timer1_init(void)
{
TCNT1H = 0xCF;
TCNT1L = 0x2C;
TCCR1B = 0x03;
//定时器0的计数预分频取64
}
/***************************************************/
#pragma vector=TIMER1_OVF_vect
__interrupt void timer1_ovf_isr(void)
{
TCNT1H = GAOWEI;
TCNT1L = DIWEI;
do {status=TIFR&0x04;}while(status!=0x04);
TIFR=0x04;
if(cnt>=0) {cnt++;PORTB = ~PORTB;}
if(cnt>=116) {PORTB = 0x00;}
if(cnt>=120) {cnt=0; }
}
/*********************************************/
void init_devices(void) //芯片的初始化子函数
{
port_init();
timer1_init();
adc_init();
TIMSK=0x04;
SREG=0x80;
}
//=========================
uint ADC_Convert11(void)
{uint temp1;
temp1=ADCL;
return(temp1);
}
//=========================
uint ADC_Convert12(void)
{uint temp2;
temp2=ADCH;
return(temp2);
}
/***********************/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<140;j++);
}
}
/***********************/
void main(void)
{
init_devices();
while(1)
{ GAOWEI =ADC_Convert12();
DIWEI =ADC_Convert11();
delay(10); }
} |