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

📄 dac.c

📁 双龙公司开发版源程序
💻 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 + -