#include"iom16v.h" //IO口操作头文件
#include<macros.h> //位操作头文件
#define uchar unsigned char
#define uint unsigned int
// 波特率,晶振 (常量声明)
#define BAUD 9600
#define FXTAL 8000000
//串口接收完毕中断触发声明,查看手册USART,Ir结束中断向量入口是12
#pragma interrupt_handler USART_Received_Ir:12
//全局变量定义:接收缓冲变量(用来保存接收到的数据),接收标志位
unsigned char RX_Buffer,RX_Flag=0;
unsigned int ada;
//延时函数
void delay(unsigned ms)
{
unsigned int i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
//AD实行函数
unsigned int AD_Get_Result()
{
unsigned int Result;
ADCSRA|=BIT(ADIF); //清除ADC转换结束位
ADCSRA|=BIT(ADSC); //AD转换开始,连续转换
while(!(ADCSRA&(BIT(ADIF)))); //判断是否转换结束 ADIF位为1跳出循环
ADCSRA&=~BIT(ADSC); //手动关闭“开始转换位”
Result=ADCL; //读取ADC数据寄存器低八位
Result=Result+ADCH*256; //读取ADC数据寄存器高八位和低八位进行整合
return Result; //返回结果
}
//AD初始化函数
void AD_Init()
{
DDRA&=~BIT(PA0); //PA0为输入状态
DDRA&=~BIT(PA1); //PA1为输入状态
PORTA&=~BIT(PA0); //PA0为高阻态输入,不带上拉电阻
PORTA&=~BIT(PA1); //PA1为高阻态输入,不带上拉电阻
ADMUX=0x01; //AREF为基准电压,右端对齐,AD1为输入通道 0000 0001
ADCSRA=0xA8; //ADC功能启动,预分频2(分频越小速度越快) 1010 1000 ADC使能位、ADC自动触发使能、ADC中断使能
SFIOR=0x00; //SFIOR特殊功能寄存器连续转换模式 000
SREG|=BIT(7); //因为用到中断,所以总中断开关打开
}
//串口IO初始化函数
void USART_IO_Init()
{
DDRD|=BIT(PD1); //PD1:TX为输出状态
}
//串口初始化函数
void USART_Init()
{
unsigned int Temp; //超过255定义为无符号整数型
USART_IO_Init(); //串口IO初始化函数调用
UCSRA=0x00; //串口控制器A清零
UCSRB=0x00; //串口控制器B清零 控制和状态寄存器A、B在程序运行时再置位
UCSRC=BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0); //选择UCSRC,异步操作,禁止检验,一位停止位,八位数据位 1000 0110 (UCSRC寄存器与UBRRH寄存器共用相同的I/O地址,写UCSRC时,URSEL应设置为1)
Temp=(FXTAL/BAUD/16)-1;//求出9600波特率的波特率寄存器UBRR赋值
UBRRH=((Temp>>8)&0x00ff);//波特率寄存器高八位赋值 >>8右移8位
UBRRL=(Temp&0x00ff); //波特率寄存器低八位赋值
//UBRRL=71;从手册中直接取得赋值,9600kbps
UCSRB|=BIT(TXEN)|BIT(RXEN)|BIT(RXCIE); //发送使能,接受使能,接受完毕中断使能
SREG|=BIT(7); //全局中断使能
}
//串口发送函数 查询发送,中断接收
void USART_Send(unsigned int ada)
{
while(!(UCSRA&(BIT(UDRE)))); //等待数据寄存器UDRE(是否准备好接收新数据)是否为空,为空则跳出while循环发送数据
UDR=ada; //UDR赋值,发送数据 UDR—USART I/O数据寄存器
while(!(UCSRA&(BIT(TXC)))); //等待数据是否已经发送完毕,发送完毕TXC置位
UCSRA|=BIT(TXC); //清除发送完毕标志位,发送结束中断,写1操作TXC标志位清零
}
//串口接收完毕中断函数 串口接收需要使用中断
void USART_Received_Ir()
{
UCSRB&=~BIT(RXCIE); //关闭接收完毕中断使能
RX_Buffer=UDR; //读取UDR(接收寄存器)的数据
RX_Flag=1; //接收标志位置一
UCSRA|=BIT(TXC); //清除发送完毕标志位
UCSRB|=BIT(RXCIE); //恢复接收完毕中断使能
}
//主函数
void main()
{
USART_IO_Init();
USART_Init();
AD_Init();
while(1)
{
USART_Send(AD_Get_Result()); //将接收到的数据发送回电脑
}
}
|