标题:
iar for avr单片机编程 通过 仿真 SPI无数据传输 请求指导
[打印本页]
作者:
by64214
时间:
2021-3-3 17:10
标题:
iar for avr单片机编程 通过 仿真 SPI无数据传输 请求指导
学习《AVR单片机与传感器模块设计》(IAR) 教材,ATMega16 的SPI 双机通信 编程实践
编程通过 但是仿真 无数据传输 请求指导
1.jpg
(121.06 KB, 下载次数: 104)
下载附件
2021-3-3 16:03 上传
单片机源程序如下:
//主机端:
#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; //存储电压的全局变量
//=========================端口初始化子程序=======================
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、开始转换、自动触发、使能中断、64预分频
ADMUX = 0x40; //使用AVCC做基准电压源、数据格式为右对齐、选择通道0
}
//============================A/D转换============================
unsigned int ADC_Convert(void)
{
uint temp1,temp2;
temp1 = (unsigned int)ADCL; //先读取低8位数据
temp2 = (unsigned int)ADCH; //再读取高8位数据
temp2 = (temp2<<8)+temp1; //高8位左移两位与低8位合并成10位数据
return(temp2); //返回合并后的值
}
//===========================数据转换=============================
unsigned int Conv(unsigned int i)
{
long x;
uint y;
x = (4840*(long)i)/1023; //把变量转化成需要显示的形式
y = (unsigned int)x; //把无符号长整型变量强制转换成无符号整型变量
return y; //返回转换后的值
}
//=========================主机初始化子程序=======================
void SPI_MasterInit(void) //主机状态下的SPI初始化
{
MOSI = 1; //设置MOSI为输出
MISO = 0; //设置MISO为输入
SCK = 1; //设置SCK为输出
CSN = 1; //设置CSN为输出
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); //使能SPI主机模式,设置时钟速率为fck/16
}
//==================主机发送一字节数据子程序=======================
void SPI_MasterTransmit(char cData) //主机状态下的数据传输
{
SPDR = cData; //启动数据传输
while(!(SPSR & (1<<SPIF))); //查询等待传输结束
}
//=============================主函数============================
void main(void)
{
Port_Init(); //端口初始化
Adc_Init(); //A/D转换初始化
SPI_MasterInit(); //初始化为主机
CSN=0; //选择从机
SREG = 0x80; //打开全局中断
while(1)
{
SPI_MasterTransmit(vol); //发送电压数据
_delay_ms(10);
}
}
//====================中断函数(A/D转换结束中断)====================
#pragma vector = ADC_vect
__interrupt void ADC_Server(void)
{
vol = Conv(ADC_Convert()); //获取A/D转换数据
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1