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

📄 m16adc.c

📁 AVR程序
💻 C
字号:
/*******************************************************************
                      实验七
实验名称: ADC转换实验
实验目的: 学习AVR单片机的ADC功能
实验现象: 串口发送命令开启一次ADC,并将结果通过串口发送到PC,任意字符开始
环	  境: ICCAVR6.31A
设 计 者: shinea8868
说    明: 部分程序原型源自网络,经本人修改调试可用,请尊重知识产权,如
	  	  作商业用途请保留本段文字
完成日期: 2007年4月10日
*******************************************************************/
#include <iom16v.h>
#include <macros.h>
#include "..\ICC_H\SOFTWARE.h"

uchar UcAdcData;                     //ADC转换的结果
uchar AdcConCom = 0;				 //ADC转换完成标志
uchar admuxx = 0x67;   				 //外部参考源,数据存储左对齐方式			 
/*--------------------------------------------------------------------
功    能: ADC转换初始化设定
入口参数: 
返 回 值: 
--------------------------------------------------------------------*/
void AdcInit(void)
{
 ADCSR 	   = 0x00;                          //ADC无效
 ADMUX 	   = admuxx;                        //选择ADC通道7
 /*--REFS1---REFS0---ADLAR---0--------------参考电源选择------对齐方式--------*/
 /*--0000-- 0001-- 0010-- 0011-- 0100-- 0101-- 0110-- 0111-- 1110--- --1111---*/
 /*--通道0--通道1--通道2--通道3--通道4--通道5--通道6-通道7--1.23V(VBG)-0V(GND)*/
 ACSR      = 0x80;                           //模拟比较器控制和状态寄存器 ACSR
                                             //ACD置1,使模拟比较器禁用
 /*--ACD--ACBG--ACO--ACI---ACIE---ACIC---ACIS1---ACIS0------------------------*/
 /*-模拟比较起禁用--模拟比较器的能隙基准源--模拟比较起输出--模拟比较器中断标志*/
 /*-模拟比较器中断使能--模拟比较器输入捕捉使能--模拟比较器中断模式选择--------*/
 ADCSR     = 0x8B;//模拟比较起控制和状态寄存器
 /*-----------ADEN---ADSC---ADFR---ADIF---ADIE---ADPS2---ADPS1---ADPS0--------*/
 //使能模数转换 ADC开始转换 ADC连续转换  ADC中断使能  128分频
}
/*-----------------------ADC转换中断程序--------------------------------------*/
#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
 	UcAdcData = ADCH;          //读ADC转换结果
	AdcConCom = 1;			   //置ADC转换完成标志
}

/*-----------------------------------------------------------------
函数名称: void Uart0Init(void) 
函数功能: 串口初始化
		  波特率 9600 0.2% 字符长度 8bit 无奇偶校验
参    数: 
返 回 值: 无
-----------------------------------------------------------------*/
void Uart0Init(void)
{
 	UCSRB = 0x00; 					//关串口
 	UCSRA = 0x02;					//倍速模式   M16中文P151
 	UCSRC = BIT(URSEL) | 0x06;		//写UCSRC寄存器,设定8个bit
 	UBRR  = 0x000c;	 	  	   		//设定串口波特率为9600
 	UCSRB = 0x98;					//开串口
}
/*-----------------------------------------------------------------
函数名称: void Uart0Init(void) 
函数功能: 串口初始化
		  波特率 9600 0.2% 字符长度 8bit 无奇偶校验
参    数: 
返 回 值: 无
-----------------------------------------------------------------*/
#pragma interrupt_handler UartRecvData:12
void UartRecvData(void)
{
 	uchar temp;
	temp = UDR;
	ADMUX |= 0x07; 
	ADCSR |= 0x40;	   	  			//开启一次ADC转换
}
/*-----------------------------------------------------------------
函数名称: void UartTransmitData(void)
函数功能: 发送字符串
参    数: 
返 回 值: 无
-----------------------------------------------------------------*/
void UartTransmitData(void)
{
  	while(!(UCSRA&0x20));  				//判断数据寄存器是否为空
		UDR = UcAdcData;
}
/*-----------------------------------------------------------------
函数名称: void InitDevices(void) 
函数功能: 初始化各种信息
参    数: 
返 回 值: 无
-----------------------------------------------------------------*/
void InitDevices(void)
{
 	CLI(); 			  					//关全部中断
 	Uart0Init();
	AdcInit();

 	MCUCR = 0x00;
 	SEI();   	 	   					//开全中断
}


void main(void)
{
// 	uchar i;
	InitDevices();
 	while(1)
	{
	 	if( AdcConCom)
		{
		 	AdcConCom = 0;				//清ADC转换完成标志
			UartTransmitData();			//发送转换结果
		}
	}
}

⌨️ 快捷键说明

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