📄 dac.c
字号:
/*******************************************/
/* 广州天河双龙电子公司 */
/* http://www.sl.com.cn */
/* 用PWM实现的DAC转换演示程序 */
/* 外部中断演示程序 */
/* 作者:ntzwq@wx88.net */
/* 2002年5月11日 */
/* 目标MCU:MEGA8 晶振:内部RC(INT) 8MHZ */
/*******************************************/
//使用内部RC振荡,PB6-G,PB7-DP短路块连接
//使用INT0/INT1按键改变DAC输出电压大小
//可以使用ADC0通道测量DAC的输出电压
//演示了使用PC机对MEGA8开发板进行控制的方法
#include <iom8v.h>
#include <macros.h>
#define Vref 500//参考电压值
#include"uart.h"
#include"adc.h"
#define osc_address 0x1ff0
extern unsigned char read_flash(unsigned int add);
unsigned int adc_old;
//T1初始化程序
void timer1_init(void)
{
TCCR1B = 0; //stop
TCNT1H = 0;
OCR1A=0;
TCCR1A =(1<<WGM11)|(1<<WGM10)|(1<<COM1A1);
TCCR1B =(1<<CS10);//(1<<WGM13)|(1<<WGM12)|(1<<CS10); //0x1A //start Timer
}
//两个中断向量使用同一个中断处理函数,实现对INT0/INT1按键的处理
#pragma interrupt_handler int_isr:iv_INT0 int_isr:iv_INT1
void int_isr(void)
{
unsigned char i;
delay_ms(10);
i=PIND&0x0c;//键盘消抖动
if(i==0x0c)
return;
else
{
if (i==0x08)//INT0键按下
{
if(OCR1A<0x3ef)
OCR1A+=0x10;//递增
else
OCR1A=0x3ff;
}
if (i==0x04)//INT1键按下
{
if(OCR1A>0x10)
OCR1A-=0x10;//递减
else
OCR1A=0;
}
while((PIND&0x0c)!=0x0c)//检查按键释放
;
}
}
//MAIN程序
void main(void)
{
unsigned char i;
unsigned int temp;
DDRB=(1<<PB1);
DDRD=0xf0;
PORTD=0xff;
OSCCAL=read_flash(osc_address);
adc_mux=0;
uart_init();
timer1_init();
adc_init();
GICR = 0xC0;//int0,int1中断使能
SEI();
adc_rel=0;
//puts("广州天河双龙电子公司");
//puts("HTTP://WWW.SL.COM.CN");
//puts("MEGA8开发板DAC测试程序");
while(1)
{
i=getchar();
switch (i)
{
case 'S'://MEGA8 DAC程序ID
{
puts("DAC TEST ver1.0");
break;
}
case 'T'://调节输出电压
{
temp=getchar();
temp=temp<<8;
temp|=getchar();
if (temp<0x400)
OCR1A=temp;
else
OCR1A=0x3ff;
break;
}
case 'O'://读取OCR1A寄存器值
{
temp=OCR1A;
putchar(temp/256);
putchar(temp%256);
break;
}
case 'M'://设置ADC工作通道
{
adc_mux=getchar()&0x03;
break;
}
case 'R'://读取ADC通道及ADC转换结果
{
putchar(adc_mux);
putchar(adc_old/256);
putchar(adc_old%256);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -