欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1663|回復(fù): 0
收起左側(cè)

AVR單片機(jī)AD轉(zhuǎn)換+串口通訊程序

[復(fù)制鏈接]
ID:912857 發(fā)表于 2021-4-27 09:47 | 顯示全部樓層 |閱讀模式
#include"iom16v.h" //IO口操作頭文件
#include<macros.h> //位操作頭文件
#define uchar unsigned char
#define uint unsigned int

// 波特率,晶振 (常量聲明)
#define BAUD 9600
#define FXTAL 8000000

//串口接收完畢中斷觸發(fā)聲明,查看手冊(cè)USART,Ir結(jié)束中斷向量入口是12
#pragma interrupt_handler USART_Received_Ir:12

//全局變量定義:接收緩沖變量(用來(lái)保存接收到的數(shù)據(jù)),接收標(biāo)志位
unsigned char RX_Buffer,RX_Flag=0;

unsigned int ada;

//延時(shí)函數(shù)
void delay(unsigned ms)
{
unsigned int i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}



//AD實(shí)行函數(shù)
unsigned int AD_Get_Result()
{
unsigned int Result;

ADCSRA|=BIT(ADIF); //清除ADC轉(zhuǎn)換結(jié)束位
ADCSRA|=BIT(ADSC); //AD轉(zhuǎn)換開始,連續(xù)轉(zhuǎn)換


while(!(ADCSRA&(BIT(ADIF)))); //判斷是否轉(zhuǎn)換結(jié)束 ADIF位為1跳出循環(huán)

ADCSRA&=~BIT(ADSC); //手動(dòng)關(guān)閉“開始轉(zhuǎn)換位”

Result=ADCL; //讀取ADC數(shù)據(jù)寄存器低八位
Result=Result+ADCH*256; //讀取ADC數(shù)據(jù)寄存器高八位和低八位進(jìn)行整合
return Result; //返回結(jié)果
}
//AD初始化函數(shù)
void AD_Init()
{
DDRA&=~BIT(PA0); //PA0為輸入狀態(tài)
DDRA&=~BIT(PA1); //PA1為輸入狀態(tài)
PORTA&=~BIT(PA0); //PA0為高阻態(tài)輸入,不帶上拉電阻
PORTA&=~BIT(PA1); //PA1為高阻態(tài)輸入,不帶上拉電阻
ADMUX=0x01; //AREF為基準(zhǔn)電壓,右端對(duì)齊,AD1為輸入通道 0000 0001
ADCSRA=0xA8; //ADC功能啟動(dòng),預(yù)分頻2(分頻越小速度越快) 1010 1000 ADC使能位、ADC自動(dòng)觸發(fā)使能、ADC中斷使能
SFIOR=0x00; //SFIOR特殊功能寄存器連續(xù)轉(zhuǎn)換模式 000
SREG|=BIT(7); //因?yàn)橛玫街袛啵钥傊袛嚅_關(guān)打開
}

//串口IO初始化函數(shù)
void USART_IO_Init()
{
DDRD|=BIT(PD1); //PD1:TX為輸出狀態(tài)
}

//串口初始化函數(shù)
void USART_Init()
{
unsigned int Temp; //超過(guò)255定義為無(wú)符號(hào)整數(shù)型

USART_IO_Init(); //串口IO初始化函數(shù)調(diào)用

UCSRA=0x00; //串口控制器A清零
UCSRB=0x00; //串口控制器B清零  控制和狀態(tài)寄存器A、B在程序運(yùn)行時(shí)再置位
UCSRC=BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0); //選擇UCSRC,異步操作,禁止檢驗(yàn),一位停止位,八位數(shù)據(jù)位 1000 0110 (UCSRC寄存器與UBRRH寄存器共用相同的I/O地址,寫UCSRC時(shí),URSEL應(yīng)設(shè)置為1)

Temp=(FXTAL/BAUD/16)-1;//求出9600波特率的波特率寄存器UBRR賦值
UBRRH=((Temp>>8)&0x00ff);//波特率寄存器高八位賦值 >>8右移8位
UBRRL=(Temp&0x00ff); //波特率寄存器低八位賦值
//UBRRL=71;從手冊(cè)中直接取得賦值,9600kbps

UCSRB|=BIT(TXEN)|BIT(RXEN)|BIT(RXCIE); //發(fā)送使能,接受使能,接受完畢中斷使能
SREG|=BIT(7); //全局中斷使能
}

//串口發(fā)送函數(shù) 查詢發(fā)送,中斷接收
void USART_Send(unsigned int ada)
{
while(!(UCSRA&(BIT(UDRE)))); //等待數(shù)據(jù)寄存器UDRE(是否準(zhǔn)備好接收新數(shù)據(jù))是否為空,為空則跳出while循環(huán)發(fā)送數(shù)據(jù)
UDR=ada; //UDR賦值,發(fā)送數(shù)據(jù)  UDR—USART I/O數(shù)據(jù)寄存器
while(!(UCSRA&(BIT(TXC)))); //等待數(shù)據(jù)是否已經(jīng)發(fā)送完畢,發(fā)送完畢TXC置位
UCSRA|=BIT(TXC); //清除發(fā)送完畢標(biāo)志位,發(fā)送結(jié)束中斷,寫1操作TXC標(biāo)志位清零
}

//串口接收完畢中斷函數(shù)  串口接收需要使用中斷
void USART_Received_Ir()
{
UCSRB&=~BIT(RXCIE); //關(guān)閉接收完畢中斷使能
RX_Buffer=UDR; //讀取UDR(接收寄存器)的數(shù)據(jù)
RX_Flag=1; //接收標(biāo)志位置一
UCSRA|=BIT(TXC); //清除發(fā)送完畢標(biāo)志位
UCSRB|=BIT(RXCIE); //恢復(fù)接收完畢中斷使能
}

//主函數(shù)
void main()
{
  USART_IO_Init();
  USART_Init();
  AD_Init();
   while(1)
  {
  USART_Send(AD_Get_Result()); //將接收到的數(shù)據(jù)發(fā)送回電腦
  }
}

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表