|
學(xué)習(xí)《AVR單片機(jī)與傳感器模塊設(shè)計(jì)》(IAR) 教材,ATMega16 的SPI 雙機(jī)通信 編程實(shí)踐
編程通過 但是仿真 無數(shù)據(jù)傳輸 請(qǐng)求指導(dǎo)
1.jpg (121.06 KB, 下載次數(shù): 104)
下載附件
2021-3-3 16:03 上傳
單片機(jī)源程序如下:
- //主機(jī)端:
- #include <ioavr.h>
- #include "delay.h"
- //#include <iom16.h>
- //========================變量類型的宏定義=========================
- #define uchar unsigned char
- #define uint unsigned int
- //=========================SPI宏定義==============================
- #define DDR_SPI DDRB
- #define PORT_SPI PORTB
- #define CSN PORTB_Bit4
- #define MOSI PORTB_Bit5
- #define MISO PORTB_Bit6
- #define SCK PORTB_Bit7
- //=========================晶振宏定義===========================
- #define xtal 8 //8MHz晶振
- uchar vol; //存儲(chǔ)電壓的全局變量
- //=========================端口初始化子程序=======================
- void Port_Init(void)
- {
- DDRA = 0x00; PORTA = 0xFF; //PORTA初始化為懸浮輸入
- DDRB = 0xFF; PORTB = 0xFF;
- DDRC = 0xFF; PORTC = 0xFF;
- DDRD = 0xFF; PORTD = 0xFF;
- }
- //=========================ADC初始化=============================
- void Adc_Init(void)
- {
- ADCSRA = 0xEE; //使能ADC、開始轉(zhuǎn)換、自動(dòng)觸發(fā)、使能中斷、64預(yù)分頻
- ADMUX = 0x40; //使用AVCC做基準(zhǔn)電壓源、數(shù)據(jù)格式為右對(duì)齊、選擇通道0
- }
- //============================A/D轉(zhuǎn)換============================
- unsigned int ADC_Convert(void)
- {
- uint temp1,temp2;
- temp1 = (unsigned int)ADCL; //先讀取低8位數(shù)據(jù)
- temp2 = (unsigned int)ADCH; //再讀取高8位數(shù)據(jù)
- temp2 = (temp2<<8)+temp1; //高8位左移兩位與低8位合并成10位數(shù)據(jù)
- return(temp2); //返回合并后的值
- }
- //===========================數(shù)據(jù)轉(zhuǎn)換=============================
- unsigned int Conv(unsigned int i)
- {
- long x;
- uint y;
- x = (4840*(long)i)/1023; //把變量轉(zhuǎn)化成需要顯示的形式
- y = (unsigned int)x; //把無符號(hào)長(zhǎng)整型變量強(qiáng)制轉(zhuǎn)換成無符號(hào)整型變量
- return y; //返回轉(zhuǎn)換后的值
- }
- //=========================主機(jī)初始化子程序=======================
- void SPI_MasterInit(void) //主機(jī)狀態(tài)下的SPI初始化
- {
- MOSI = 1; //設(shè)置MOSI為輸出
- MISO = 0; //設(shè)置MISO為輸入
- SCK = 1; //設(shè)置SCK為輸出
- CSN = 1; //設(shè)置CSN為輸出
-
- SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); //使能SPI主機(jī)模式,設(shè)置時(shí)鐘速率為fck/16
- }
- //==================主機(jī)發(fā)送一字節(jié)數(shù)據(jù)子程序=======================
- void SPI_MasterTransmit(char cData) //主機(jī)狀態(tài)下的數(shù)據(jù)傳輸
- {
- SPDR = cData; //啟動(dòng)數(shù)據(jù)傳輸
- while(!(SPSR & (1<<SPIF))); //查詢等待傳輸結(jié)束
- }
- //=============================主函數(shù)============================
- void main(void)
- {
- Port_Init(); //端口初始化
- Adc_Init(); //A/D轉(zhuǎn)換初始化
- SPI_MasterInit(); //初始化為主機(jī)
- CSN=0; //選擇從機(jī)
- SREG = 0x80; //打開全局中斷
- while(1)
- {
- SPI_MasterTransmit(vol); //發(fā)送電壓數(shù)據(jù)
- _delay_ms(10);
- }
- }
- //====================中斷函數(shù)(A/D轉(zhuǎn)換結(jié)束中斷)====================
- #pragma vector = ADC_vect
- __interrupt void ADC_Server(void)
- {
- vol = Conv(ADC_Convert()); //獲取A/D轉(zhuǎn)換數(shù)據(jù)
- }
復(fù)制代碼
|
|