全国电子设计大赛C组程序清单.doc_第1页
全国电子设计大赛C组程序清单.doc_第2页
全国电子设计大赛C组程序清单.doc_第3页
全国电子设计大赛C组程序清单.doc_第4页
全国电子设计大赛C组程序清单.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序清单/*/主程序/*/*-Atmega16主控芯片 晶振频率8MHZ-*/#include#include#includemotor.h#includesensor.h#includewireless.h#includectr.h#includedebug.h#includedef.hvolatile unsigned char SpiRxDatRX_PLOAD_WIDTH;volatile unsigned char UartRxByte;/串口接收字volatile unsigned char UartTxByte;/串口发送控制字节BYTE Mode=0;/模式:默认主车void InitMCU() /初始化串口 UCSRB|=(1RXCIE)|(1RXEN)|(1TXEN);/开接受发送 开接收中断 UBRRL=51;/波特率9600bit/s /初始化中断 GICR|=(1INT2);/开外部中断2 响应nRF24L01接收数据中断默认下降沿触发int main() InitMCU(); init_NRF24L01(); InitSensor(); InitSmg(); while(1) FlushOpState();/刷新光电传感器的状态 AnalySta();/分析小车状态 Ctrl();/输出控制命令 SIGNAL(SIG_INTERRUPT2)/接收到nRF24L01的数据 SetRX_Mode(); nRF24L01_RxPacket(unsigned char*)SpiRxDat);SIGNAL(SIG_UART_RECV)/接收来自M8的数据/*/转弯90度并向前行驶适当距离/*/#includewireless.h#include#include#define KEY1_DOWN !(PIND&(1PD2)#define KEY2_DOWN !(PIND&(1PD3)unsigned char TX_BufTX_PLOAD_WIDTH=0;unsigned char RX_BufTX_PLOAD_WIDTH=0;void UartTxByte(unsigned char byte) while(!(UCSRA&(1UDRE); UDR=byte;void UartTxStr(unsigned char str) unsigned char i=0; while(stri!=0) UartTxByte(stri);i+; DelayMs(2); int main() unsigned char UartIsOk=UartIsOK!; DDRB|=0x03;/LED输出 PORTB|=0x03; MCUCR|=(1ISC11)|(1ISC01); GICR|=(1INT0)|(1INT1)|(1INT2); UCSRB=(1RXEN)|(1TXEN); UBRRL=51; init_NRF24L01(); sei(); UartTxStr(UartIsOk); while(1);SIGNAL(SIG_INTERRUPT0)/按键1 两轮以相同速度前行100脉冲再停下 if(KEY1_DOWN) DelayMs(200);if(KEY1_DOWN) PORTB&=(PB1); TX_Buf0=0x01; nRF24L01_TxPacket(unsigned char *)TX_Buf); TX_Buf0=0x00; PORTB|=0x03; SIGNAL(SIG_INTERRUPT1)/按键2 右轮前进左轮后退以相同速度走50脉冲 if(KEY2_DOWN) DelayMs(200);if(KEY2_DOWN) PORTB&=(PB1); TX_Buf0=0x02; nRF24L01_TxPacket(unsigned char *)TX_Buf); TX_Buf0=0x00; PORTB|=0x03; SIGNAL(SIG_INTERRUPT2)/无线中断 SetRX_Mode(); if(nRF24L01_RxPacket(RX_Buf) PORTB&=(PB0);/接收到数据点亮LED7 UartTxStr(RX_Buf); PORTB|=0x03; /*/无线通讯/*/#includewireless.h#includeunsigned char TX_ADDRESSTX_ADR_WIDTH=0x34,0x43,0x10,0x10,0x01; /发送地址unsigned char RX_ADDRESSRX_ADR_WIDTH=0x34,0x43,0x10,0x10,0x01; /接收地址/-延时函数-/-#define XTAL 8/晶振:8MHZvoid DelayUs(unsigned int us) unsigned int i; for(i=0;ius;i+) _delay_loop_2(XTAL/4);void DelayMs(unsigned int ms) unsigned int i; for(i=0;ims;i+) _delay_loop_2(XTAL*250);/-NRF24L01初始化-/-void init_spi() /SPI端口方向设置 DDRB|=(1PB3)|(1PB4)|(1PB5)|(1PB7); /SPI控制寄存器设置 SPCR=(1SPE)|(1MSTR)|(1SPR1);/使能SPI接口,主机模式,MSB低位在前,模式0,64分频,SPI时钟void init_NRF24L01(void) init_spi(); CE_CLR;/空闲模式 CSN_SET;/SPI关闭 SCK_CLR;/关闭时钟 /-SPI驱动:写的同时读-/-unsigned char SPI_RW(unsigned char dat) SPDR=dat; while(!(SPSR&(1SPIF);/等待发送完成 return SPDR;/-NRF24L01寄存器单字节读写-/-unsigned char SPI_Read(unsigned char reg)/用来读取指定寄存器的状态 unsigned char reg_val; CSN_CLR; SPI_RW(reg); reg_val=SPI_RW(0);/读寄存器指令:0x00 CSN_SET; return (reg_val); unsigned char SPI_RW_Reg(unsigned char reg,unsigned char value)/用来设置工作方式 unsigned char status; CSN_CLR; status=SPI_RW(reg); SPI_RW(value); CSN_SET; return (status);/-NRF24L01寄存器BUFF读写-/-unsigned char SPI_Read_Buf(unsigned char reg,unsigned char *pBuf,unsigned char bytes)/用来读取接收数据包 unsigned char status; unsigned char i; CSN_CLR; status=SPI_RW(reg); for(i=0;ibytes;i+) pBufi=SPI_RW(0); CSN_SET; return (status);unsigned char SPI_Write_Buf(unsigned char reg,unsigned char *pBuf,unsigned char bytes)/用来写发送数据包和收发地址 unsigned char status; unsigned char i; CSN_CLR; status=SPI_RW(reg); for(i=0;ibytes;i+) SPI_RW(*pBuf+); CSN_SET; return (status);/-NRF24L01数据包的收发-/-void SetRX_Mode(void) CE_CLR; SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);/写接收地址 SPI_RW_Reg(WRITE_REG+EN_AA,0x01); /0通道自动应答 SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01); /开启数据通道0 SPI_RW_Reg(WRITE_REG+RF_CH,0); /射频通道 SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); /写通道0接收数据长度 SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07); /0db 1Mbps SPI_RW_Reg(WRITE_REG+CONFIG,0x0f); /接收模式 CE_SET; /开始接收 DelayUs(300);/延时200微妙unsigned char nRF24L01_RxPacket(unsigned char *rx_buf) unsigned char sta,ref=0;/接收中断标志 sta=SPI_Read(STATUS); if(sta&0x40) CE_CLR; SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);ref=1; SPI_RW_Reg(WRITE_REG+STATUS,sta); /接收到数据后RX_DR,TX_DS,MAX_PT都为1,通过写1来清除中断标志 return (ref);void nRF24L01_TxPacket(unsigned char *tx_buf) CE_CLR;/StandBy I模式 SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); / 装载接收端地址 SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); / 装载数据 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); / SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); / SPI_RW_Reg(WRITE_REG + SETU

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论