?? hjmcu.c
字號:
/**************************************************************************************************
*** 慧凈電子1天入門、10天學會、1年精通單片機與C語言視頻教程配套程序源碼 ***
*** 實驗目的:HJ-1G 開發板 AVR配套實驗程序 ***
*** MCU: ATmega16 部分C源碼可以直接用于項目開發、歡迎復制共享、功德無量、沒有版權 ***
*** 作者:慧凈免費助學會員
*** 部分源碼網上收集整理、如有傷害到你的利益、請來信,hjmcu@163.com 我們的免費助學會員會定期幫你刪除掉 ***
*** 編譯器:GCC ***
*** 百度交流空間:http://hi.baidu.com/HJMCU WWW.HJMCU.COM ***
*** 論壇交流:http://bbs.hjmcu.com 歡迎來論壇一分錢不要下載配套的仿真電路 ***
*** 配套的硬件學習板網址:http://shop37031453.taobao.com/ ***
*** 日期:2008.8.8 ***
*** 目標:用C語言寫程序就這么簡單、慧爭祝你1天入門、10天學會、1年精通單片機與C語言、找個好工作 ***
***************************************************************************************************/
//慧凈電子大學生課程設計專用實驗板《HJ-1G》、直接支持AT89S52 STC89C52單片機
//加轉接板后支持AVR ATmega16 32 系列單片機、是你學習單片機的得力助手 一板二用,學完51再學AVR
//HJ-1G 學習板加AVR轉接板后,裝上ATMETAM16 單片機實驗
//HJ-1G 學習板AVR單片機實驗,FM報警實驗
//注意要把JTAGEN 仿真熔絲位設置成1 才能完成本實驗,設置成1時不能用仿真口,只能用ISP下載接口下載程序
//本實驗要用到電腦串口,可以用串口線接到電腦串口上,也可以用USB轉串口線接到電腦USB接口上。
//請用配套的串口調試軟件。
//本實驗跟據網上的AVR學習筆記有我們的免費助學會員修改成。
//請用一線連接J5 第二個腳,到開發板上P0口上,可以調節AD電位器,電腦串口上拉機軟件可以顯示出電壓值
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h> //中斷函數頭文件
//常量聲明
#define BAUD 9600 //波特率設置值
//全局變量聲明
unsigned int ADData; //AD轉換獲得的數據
//函數聲明
void Port_Init(void); //端口初始化配置
void Usart_Init(void); //USART寄存器設置
void AD_Init(void); //AD初始化
void Usart_PutChar(unsigned char cTXData); //字節發送函數
void Usart_PutString(unsigned char *pcString); // 字符串發送數據
unsigned int AD_GetData(void); //AD轉換函數
int main(void)
{
unsigned char Delay3s;
Port_Init();
Usart_Init();
AD_Init();
Usart_PutString("AD轉換測試程序");
Usart_PutString("測得ADC0通道的電壓值為:");
sei(); //使能全局中斷
while(1)
{
ADData = (int)((long)AD_GetData() * 5010 / 1024); //將獲得的AD值轉換為電壓值
//單位為mv。
Usart_PutChar(ADData / 1000 + 0x30); //得到電壓值的千位并發送
Usart_PutChar('.'); //發送小數點
Usart_PutChar(ADData % 1000 / 100 + 0x30); //得到電壓值的百位并發送
Usart_PutChar(ADData % 100 / 10 + 0x30); //得到電壓值的十位并發送
Usart_PutChar(ADData % 10 + 0x30); //得到電壓值的個位并發送
Usart_PutChar('V'); //發送電壓符號“V”
Usart_PutChar(0x0d); //
Usart_PutChar(0x0a); // AD值發送結束,回車換行
for(Delay3s = 0;Delay3s < 30;Delay3s++) //延時3S
{
_delay_ms(90);
}
}
}
//端口狀態初始化設置函數
void Port_Init()
{
PORTA = 0X00;
DDRA = 0x00; //ADC通道設置為輸入口,高阻態
}
//USART寄存器配置函數
void Usart_Init()
{
UCSRA = 0X00;
UCSRC |= (1<<URSEL) | (1 << UCSZ1) | (1 << UCSZ0); //異步,數據格式8,N,1
//UCSRC寄存器與UBRRH寄存器共用相同的I/O地址,寫 UCSRC 時, URSEL 應設置為 1。
UBRRL = (F_CPU / BAUD / 16 - 1) % 256; //波特率設置
UBRRH = (F_CPU / BAUD / 16 - 1) / 256;
UCSRB |= (1 << RXCIE) | (1 << RXEN) | (1 << TXEN); //發送使能
}
//字節發送函數
void Usart_PutChar(unsigned char cTXData)
{
while( !(UCSRA & (1 << UDRE)) ); //只有數據寄存器為空時才能發送數據
UDR = cTXData; //發送數據送USART I/O數據寄存器-UDR
}
//接收中斷函數
ISR(USART_RXC_vect )
{
unsigned char Rev;
Rev = UDR; //從USART I/O數據寄存器-UDR中讀出數據
Usart_PutChar(Rev); //將接收到的數據發送
}
void Usart_PutString(unsigned char *pcString)
{
while (*pcString)
{
Usart_PutChar(*pcString++);
}
Usart_PutChar(0x0D);
Usart_PutChar(0x0A); //結尾發送回車換行
}
//AD轉換初始化函數
void AD_Init()
{
ADMUX |= (1 << REFS0); //ADC參考電壓為AVcc,ADC結果右對齊,選擇通道ADC0
ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); //使能AD轉換,ADC時鐘64分頻
}
//AD轉換函數
unsigned int AD_GetData()
{
ADCSRA |= (1 << ADSC); //開始AD轉換
while(!(ADCSRA & (1 << ADIF))); //等待轉換完成
ADCSRA |= (1 << ADIF); //清零ADC中斷標志位
return ADC; //返回ADC值
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -