AVR ATMega16 步进电机驱动程序

合集下载

廿四、ATmega16驱动12864液晶(LGM12641或AMPIRE128X64,KS0108驱动芯片)

廿四、ATmega16驱动12864液晶(LGM12641或AMPIRE128X64,KS0108驱动芯片)

/*********hanzi2b.h ******************************************************* 宋体,常规,小四,纵向取模,字节倒序 *************************************************************************/ //宋体,常规,小四,纵向取模,字节倒序 unsigned char hang1[]={ /*-- 文字: 中 --*/ /*-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 --*/ 0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00, 0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00, /*-- 文字: 国 --*/ /*-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 --*/ 0x00,0xFE,0x02,0x0A,0x8A,0x8A,0x8A,0xFA,0x8A,0x8A,0x8A,0x0A,0x02,0xFE,0x00,0x00, 0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F,0x48,0x49,0x4E,0x48,0x40,0xFF,0x00,0x00, /*-- 文字: 重 --*/ /*-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 --*/ 0x08,0x08,0x0A,0xEA,0xAA,0xAA,0xAA,0xFF,0xA9,0xA9,0xA9,0xE9,0x08,0x08,0x08,0x00,

atmega16驱动1602(4位数据线)

atmega16驱动1602(4位数据线)
while(1)
{
zhiling(0x83); /////0x83地址开始写入
shuju(zhongwen[0]);
shuju(zhongwen[1]);
shuju(' ');
shuju(' ');
shuju(zhongwen[2]);
shuju(zhongwen[3]);
#define RS_1 PORTD|=BIT(rs)
#define RW_0 PORTD&=~BIT(rw)
#define RW_1 PORTD|=BIT(rw)
#define E_0 PORTD&=~BIT(e)
#define E_1 PORTD|=BIT(e)
uchar zhongwen[]="我叫吴越辉以后请多多指教";
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define rs PD0
#define rw PD1
#define e PD2
#define RS_0 PORTD&=~BIT(rs)
zhiling(0x0c); //开显示指令
qingping(); //清屏
zhiling(0x02); //游标回归原点
}
void main()
{
int i;
init(); //调用初始化函数进行初始化操作
// while(1);
}

ATmega16串口程序-值得参考

ATmega16串口程序-值得参考

// USART Transmitter buffer
#define TX_BUFFER_SIZE 16
volatile char tx_buffer[TX_BUFFER_SIZE];
volatile unsigned char tx_wr_index,tx_rd_index,tx_counter;
if (++rx_wr_index == RX_BUFFER_SIZE) //写指针指向下一个单元,并判断是否到了队列的尾部,(不表示接受缓冲区是否满!)
rx_wr_index=0; //到了尾部,则指向头部(构成环状)
if (++rx_counter == RX_BUFFER_SIZE) //队列中收到字符加1,并判断是否队列已满
{
rx_counter=0; // 队列满了,队列中收到字符个数为0,表示队列中所有以前的数据作废,因为最后的数据已经把最前边的数据覆盖了
rx_buffer_overflow=1; //置缓冲区溢出标志。在主程序中必要的地方需要判断该标志,以证明读到数据的完整性
put_s("Hello!");
put_s("这是一个简单的高速的串口驱动程序");
put_s("请你输入任意的字符,单片机将返回你输入的字符");
while (1)
{
put_c(get_c());
}
}
//Makefile,主要的几项,只是针对我这里的程序,要灵活运用哦
//usart.h
//常量定义
#define BAUDRATE 9600 //波特率
//#define F_CPU 4000000 //晶振频率4.0MHz

Atmega16单片机实用程序

Atmega16单片机实用程序
{ for(y_address=y1;y_address
#define uint unsigned int #define SET_1(a,b) a|=bit(b) //將寄存器 a 的第 b 位置 1 #define CLR_0(a,b) a&=~bit(b) //將寄存器 a 的第 b 位清 0 #program date code:
const date[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0 X80,//共陽數據;
Atmega16 单片机实用程序
/************************************************ *********************
MCU: ATmega16 外部晶振: 8MHz 程序功能: 4*4 鍵盤識別,LED 七段數碼管顯示,密 碼功能模塊,直流電機正反轉控制
void delayms(int ms) { int i,j;
for(i=ms;i>0;i--) { for(j=1722;j>0;j 1722; }
/************************************************ ******************* 名稱:us 延時子程序 功能:延時指定的 us ************************************************* *******************/ void delayus(uchar us)
//interrupt process program void process()
{ int adcode=0; ADCSRA&=~BIT(ADIE); adcode=ADCL; adcode=(ADCH>3; y_address=y;

AVR单片机(ATmega16)驱动LCD12864显示中文实例

AVR单片机(ATmega16)驱动LCD12864显示中文实例

AVR单片机驱动LCD12864显示中文字符实例JCS居士,2019年09月21日一、说明:总的来说,Proteus软件中能够仿真的图形LCD驱动器分成三类。

1.Toshiba T6963C Controller,主要有以下型号: LM3228、LM3229、LM3267、LM3283、LM3287、LM4228、LM4265、LM4267、LM4283、LM4287、PG12864F、PG24064F、PG128128A、PG160128A。

2.Sharp SED1520 Controller,主要有以下型号:AGM1232G、EW12A03GLY、HDM32GS12-B、HDM32GS12Y-B。

3.Sharp SED1565Controller,主要有以下型号:HDG12864F-1、HDS12864F-3、HDG12864L-4、HDG12864L-6、NOKIA7110、TG126410GFSB、TG13650FEY4.Samsung KS0108Controller,主要有以下型号:AMPIRE128x64、LGM12641BS1R。

注意:大家比较关心的ST7920驱动器Proteus里面是没有的,不要再费尽心思下载什么带中文字库的LCD模型,导入Proteus,费时费力不讨好!采用LM3328是一款内置T6963C驱动器的图形液晶显示器,显示范围为128*64,单色。

采用Atmega16单片机,用C语言实现中文显示,是一件特别简单的事情,全部C语言代码仅30余行。

接线及Proteus仿真图、程序均在下文中给出。

二、Proteu软件仿真截图:三、C语言程序代码:/*Chip type : ATmega16Program type : ApplicationAVR Core Clock frequency: 8.000000 MHzMemory model : SmallExternal RAM size : 0Data Stack size : 256*/#include <mega16.h>// Graphic Display functions#include <glcd.h>extern flash unsigned char HZ16X16[]; extern flash unsigned char EN8X16[];// Font used for displaying text// on the graphic display#include <font5x7.h>unsigned char i=0;void main(void){// Variable used to store graphic display// controller initialization dataGLCDINIT_t glcd_init_data;// Graphic Display Controller initialization // The T6963 connections are specified in the// Project|Configure|C Compiler|Libraries|Graphic Display menu: // DB0 - PORTA Bit 0// DB1 - PORTA Bit 1// DB2 - PORTA Bit 2// DB3 - PORTA Bit 3// DB4 - PORTA Bit 4// DB5 - PORTA Bit 5// DB6 - PORTA Bit 6// DB7 - PORTA Bit 7// C /D - PORTB Bit 0// /CE - PORTB Bit 1// /RD - PORTB Bit 2// /WR - PORTB Bit 3// /RESET - PORTB Bit 4// Specify the current font for displaying textglcd_init_data.font=font5x7;// No function is used for reading// image data from external memoryglcd_init_data.readxmem=NULL;// No function is used for writing// image data to external memoryglcd_init_data.writexmem=NULL;glcd_init(&glcd_init_data);glcd_settextjustify(0,0);while(1){glcd_setfont(HZ16X16);glcd_moveto(8,0);for(i=128;i<128+7;i++)glcd_putchar(i);glcd_moveto(8,16);for(i=128+7;i<128+14;i++) glcd_putchar(i);glcd_moveto(8,32);for(i=128+14;i<128+21;i++) glcd_putchar(i);glcd_moveto(8,48);for(i=128+21;i<128+28;i++) glcd_putchar(i);glcd_setfont(EN8X16);glcd_putcharxy(0, 0,'A');glcd_putcharxy(0,16,'b'); glcd_putcharxy(0,32,'C'); glcd_putcharxy(0,48,'d'); glcd_putcharxy(120, 0,'1'); glcd_putcharxy(120,16,'2'); glcd_putcharxy(120,32,'3'); glcd_putcharxy(120,48,'4'); }}。

AVR教程系列一(6):ATmega16 简介(一)

AVR教程系列一(6):ATmega16 简介(一)

ATmega16 简介ATmega16是基于增强的AVR RISC结构的低功耗8 位CMOS微控制器。

由于其先进的指令集以及单时钟周期指令执行时间,ATmega16 的数据吞吐率高达1 MIPS/MHz,从而可以缓减系统在功耗和处理速度之间的矛盾。

ATmega16 AVR 内核具有丰富的指令集和32 个通用工作寄存器。

所有的寄存器都直接与算逻单元(ALU) 相连接,使得一条指令可以在一个时钟周期内同时访问两个独立的寄存器。

这种结构大大提高了代码效率,并且具有比普通的CISC 微控制器最高至10 倍的数据吞吐率。

ATmega16 有如下特点:16K字节的系统内可编程Flash(具有同时读写的能力,即RWW),512 字节EEPROM,1K 字节SRAM,32 个通用I/O 口线,32 个通用工作寄存器,用于边界扫描的JTAG 接口,支持片内调试与编程,三个具有比较模式的灵活的定时器/ 计数器(T/C),片内/外中断,可编程串行USART,有起始条件检测器的通用串行接口,8路10位具有可选差分输入级可编程增益(TQFP 封装) 的ADC ,具有片内振荡器的可编程看门狗定时器,一个SPI 串行端口,以及六个可以通过软件进行选择的省电模式。

工作于空闲模式时CPU 停止工作,而USART、两线接口、A/D 转换器、SRAM、T/C、SPI 端口以及中断系统继续工作;掉电模式时晶体振荡器停止振荡,所有功能除了中断和硬件复位之外都停止工作;在省电模式下,异步定时器继续运行,允许用户保持一个时间基准,而其余功能模块处于休眠状态; ADC 噪声抑制模式时终止CPU 和除了异步定时器与ADC 以外所有I/O 模块的工作,以降低ADC 转换时的开关噪声; Standby 模式下只有晶体或谐振振荡器运行,其余功能模块处于休眠状态,使得器件只消耗极少的电流,同时具有快速启动能力;扩展Standby 模式下则允许振荡器和异步定时器继续工作。

cc2500驱动程序(Atmega16)

cc2500驱动程序(Atmega16)

cc2500驱动程序(Atmega16)头文件:cc2500.h#ifndef _CC2500_H#define _CC2500_H// CC2500 管脚#define CC2500_CSn RF_IO0 // PB4#define CC2500_GDO0 RF_IO1 // PD2#define CC2500_GDO2 RF_IO2 // PD3// 定义数据包#define CC2500_PKT_LEN 80typedef struct {u8_t buf[CC2500_PKT_LEN];u8_t len;} packet_2500_t;extern packet_2500_t tx_pkt_2500;extern packet_2500_t rx_pkt_2500;extern u8_t rx_state_2500;extern u8_t rx_flag_2500;// PATABLE (1 dBm output power)extern u8_t paTable[];extern u8_t paTableLen;void cc_wait(u16_t cycles);void cc_spi_setup(void);void cc_spi_write_reg(u8_t addr, u8_t value);void cc_spi_write_burst_reg(u8_t addr, u8_t *buffer, u8_t count); u8_t cc_spi_read_reg(u8_t addr);void cc_spi_read_burst_reg(u8_t addr, u8_t *buffer, u8_t count); u8_t cc_spi_read_status(u8_t addr);void cc_spi_strobe(u8_t strobe);void cc_powerup_reset(void);void cc_write_settings(void);void cc_send_packet(u8_t *tx_buf, u8_t size);u8_t cc_receive_packet(u8_t *rx_buf, u8_t *length);// test functionvoid cc_test(void);#endif实现代码:cc2500.c#include <avr/io.h>#include <avr/interrupt.h>#include <stdlib.h>#include "common.h"#include "ccxxx0_reg.h"#include "cc2500.h"#include "key.h"// 数据包packet_2500_t tx_pkt_2500;packet_2500_t rx_pkt_2500;u8_t rx_state_2500;u8_t rx_flag_2500;void cc_wait(u16_t cycles){while (cycles > 6)cycles -= 6;}// cc2500 外部管脚配置void cc_spi_setup(void){DDRB |= CC2500_CSn;PORTB |= CC2500_CSn;PORTD |= CC2500_GDO0; // 使能上拉// 配置SPI总线//SPSR |= (1<<SPI2X); // 设置SPI时钟倍速SPCR |= (1<<SPE)|(1<<MSTR); // 使能SPI接口,主机模式 cli(); // 清所有中断MCUCR |= 0x02; // INT0下降沿触发GICR |= 0x40; // 使能INT0}void cc_spi_write_reg(u8_t addr, u8_t value){// CS enablePORTB &= ~CC2500_CSn;// wait for CCxxxx readywhile (PINB&SPI_MISO);// Clear flagSPSR = 0x00;// Send addressSPDR = addr;// Wait for TX to finishwhile (!(SPSR & (1<<SPIF))) ;cc_wait(75);// Clear flagSPSR = 0x00;// Load data for TX after addrSPDR = value;// Wait for end of addr TXwhile (!(SPSR & (1<<SPIF))) ;cc_wait(75);// CS disablePORTB |= CC2500_CSn;}void cc_spi_write_burst_reg(u8_t addr, u8_t *buffer, u8_t count) {u8_t i;// CS enablePORTB &= ~CC2500_CSn;// Wait for CCxxxx readywhile (PINB&SPI_MISO) ;// Clear flagSPSR = 0x00;// Send addressSPDR = addr|TI_CCxxx0_WRITE_BURST;// Wait for TX to finishwhile (!(SPSR & (1<<SPIF))) ;for (i=0; i<count; i++) {// Clear flagSPSR = 0x00;SPDR = buffer[i];while (!(SPSR & (1<<SPIF))) ;cc_wait(30);cc_wait(30);}// Clear flagSPSR = 0x00;// CS disablePORTB |= CC2500_CSn;}u8_t cc_spi_read_reg(u8_t addr){u8_t x;// CS enablePORTB &= ~CC2500_CSn;// Wait for CCxxxx ready,while (PINB&SPI_MISO) ;// Clear flag set during addr TXSPSR = 0x00;// Send AddressSPDR = addr|TI_CCxxx0_READ_SINGLE;// Wait for TXBUF readywhile (!(SPSR & (1<<SPIF))) ;cc_wait(75);// Clear flag set during addr TXSPSR = 0x00;// Load dummy byte for TX after addrSPDR = 0;// Wait for end of dymmy byte TXwhile (!(SPSR & (1<<SPIF))) ;cc_wait(75);// Read datax = SPDR;cc_wait(45);cc_wait(45);// CS disablePORTB |= CC2500_CSn;return x;}void cc_spi_read_burst_reg(u8_t addr, u8_t *buffer, u8_t count) {u8_t i;// CS enablePORTB &= ~CC2500_CSn;// Wait for CCxxxx readywhile (PINB&SPI_MISO) ;// clear flagSPSR = 0x00;// Send addressSPDR = addr|TI_CCxxx0_READ_BURST;// Wait for txbuf readywhile (!(SPSR & (1<<SPIF))) ;cc_wait(60);for (i=0; i<count; i++) {SPSR = 0x00; // Clear flag// Initiate next data RX, meanwhileSPDR = 0;// wair for end of 1st data byte TXwhile (!(SPSR & (1<<SPIF))) ;cc_wait(30);buffer[i] = SPDR;}// Clear flagSPSR = 0x00;// CS diablePORTB |= CC2500_CSn;}u8_t cc_spi_read_status(u8_t addr){u8_t x;// CS enablePORTB &= ~CC2500_CSn;// Wait for CCxxxx readywhile (PINB&SPI_MISO) ;// Clear flag set during last writeSPSR = 0x00;// Send addressSPDR = addr|TI_CCxxx0_READ_BURST;// Wait for TX to finishwhile (!(SPSR & (1<<SPIF))) ;// Clear flag set during last writeSPSR = 0x00;// Dummy write so we can read dataSPDR = 0;// Wait for RX to finishwhile (!(SPSR & (1<<SPIF))) ;cc_wait(45);cc_wait(45);// Read datax = SPDR;// CS disablePORTB |= CC2500_CSn;return x;}void cc_spi_strobe(u8_t strobe){// CS enablePORTB &= ~CC2500_CSn;// Wait for CCxxxx readywhile (PINB&SPI_MISO) ;// Clear flag set during last write SPSR = 0x00;// Send strobeSPDR = strobe;// Wait for TX to finishwhile (!(SPSR & (1<<SPIF))) ;// CS disablePORTB |= CC2500_CSn;}void cc_powerup_reset(void){// CS disablePORTB |= CC2500_CSn;cc_wait(30);// CS enablePORTB &= ~CC2500_CSn;cc_wait(30);// CS disablePORTB |= CC2500_CSn;cc_wait(45);// CS enablePORTB &= ~CC2500_CSn;// Wait for CCxxxx readywhile (PINB&SPI_MISO) ;// clear flagSPSR = 0x00;// reset CCxxxx chipSPDR = TI_CCxxx0_SRES;// Wait for end of addr TXwhile (!(SPSR & (1<<SPIF))) ;cc_wait(45);cc_wait(45);cc_wait(45);// CS disablePORTB |= CC2500_CSn;}// CC2500// Product = CC2500// Crystal accuracy = 40 ppm// X-tal frequency = 26 MHz// RF output power = 0 dBm// RX filterbandwidth = 540.000000 kHz// Deviation = 0.000000// Return state: Return to RX state upon leaving either TX or RX// Datarate = 250.000000 kbps// Modulation = (7) MSK// Manchester enable = (0) Manchester disabled// RF Frequency = 2433.000000 MHz// Channel spacing = 199.950000 kHz// Channel number = 0// Optimization = Sensitivity// Sync mode = (3) 30/32 sync word bits detected// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX // CRC operation = (1) CRC calculation in TX and CRC check in RX en abled// Forward Error Correction = (0) FEC disabled// Length configuration = (1) Variable length packets, packet length config ured by the first received byte after sync word.// Packetlength = 255// Preamble count = (2) 4 bytes// Append status = 1// Address check = (0) No address check// FIFO autoflush = 0// Device address = 0// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at the end of the packet// GDO2 signal selection = (11) Serial Clockvoid cc_write_settings(void){#if 0// Write register settingscc_spi_write_reg(TI_CCxxx0_IOCFG2, 0x0B); // GDO2 output pin con fig.//cc_spi_write_reg(TI_CCxxx0_IOCFG2, 0x3A); // GDO2 output pin confi g.cc_spi_write_reg(TI_CCxxx0_IOCFG0, 0x06); // GDO0 output pin con fig.cc_spi_write_reg(TI_CCxxx0_PKTLEN, 0xFF); // Packet length.cc_spi_write_reg(TI_CCxxx0_PKTCTRL1, 0x05); // Packet automation control.cc_spi_write_reg(TI_CCxxx0_PKTCTRL0, 0x05); // Packet automation control.cc_spi_write_reg(TI_CCxxx0_ADDR, 0x01); // Device address.cc_spi_write_reg(TI_CCxxx0_CHANNR, 0x00); // Channel number.cc_spi_write_reg(TI_CCxxx0_FSCTRL1, 0x07); // Freq synthesizer cont rol.cc_spi_write_reg(TI_CCxxx0_FSCTRL0, 0x00); // Freq synthesizer cont rol.#if 0cc_spi_write_reg(TI_CCxxx0_FREQ2, 0x5D); // Freq control word, hig h bytecc_spi_write_reg(TI_CCxxx0_FREQ1, 0x93); // Freq control word, mid byte.cc_spi_write_reg(TI_CCxxx0_FREQ0, 0xB1); // Freq control word, low byte.#endifcc_spi_write_reg(TI_CCxxx0_FREQ2, 0x5c); // Freq control word, hig h bytecc_spi_write_reg(TI_CCxxx0_FREQ1, 0x80); // Freq control word, mid byte.cc_spi_write_reg(TI_CCxxx0_FREQ0, 0x00); // Freq control word, low byte.cc_spi_write_reg(TI_CCxxx0_MDMCFG4, 0x2D); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_MDMCFG3, 0x3B); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_MDMCFG2, 0x73); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_MDMCFG1, 0x22); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_MDMCFG0, 0xF8); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_DEVIATN, 0x00); // Modem dev (when F SK mod en)cc_spi_write_reg(TI_CCxxx0_MCSM1 , 0x3F); //MainRadio Cntrl State Machinecc_spi_write_reg(TI_CCxxx0_MCSM0 , 0x18); //MainRadio Cntrl State Machinecc_spi_write_reg(TI_CCxxx0_FOCCFG, 0x1D); // Freq Offset Compen s. Configcc_spi_write_reg(TI_CCxxx0_BSCFG, 0x1C); // Bit synchronization c onfig.cc_spi_write_reg(TI_CCxxx0_AGCCTRL2, 0xC7); // AGC control.cc_spi_write_reg(TI_CCxxx0_AGCCTRL1, 0x00); // AGC control.cc_spi_write_reg(TI_CCxxx0_AGCCTRL0, 0xB2); // AGC control.cc_spi_write_reg(TI_CCxxx0_FREND1, 0xB6); // Front end RX configu ration.cc_spi_write_reg(TI_CCxxx0_FREND0, 0x10); // Front end RX configu ration.cc_spi_write_reg(TI_CCxxx0_FSCAL3, 0xEA); // Frequency synthesize r cal.cc_spi_write_reg(TI_CCxxx0_FSCAL2, 0x0A); // Frequency synthesizer cal.cc_spi_write_reg(TI_CCxxx0_FSCAL1, 0x00); // Frequency synthesizercal.cc_spi_write_reg(TI_CCxxx0_FSCAL0, 0x11); // Frequency synthesizer cal.cc_spi_write_reg(TI_CCxxx0_FSTEST, 0x59); // Frequency synthesizer cal.cc_spi_write_reg(TI_CCxxx0_TEST2, 0x88); // Various test settings.cc_spi_write_reg(TI_CCxxx0_TEST1, 0x31); // Various test settings.cc_spi_write_reg(TI_CCxxx0_TEST0, 0x0B); // Various test settings.#endif#if 0// Write register settingscc_spi_write_reg(TI_CCxxx0_IOCFG2, 0x0B); // GDO2 output pin config. cc_spi_write_reg(TI_CCxxx0_IOCFG0, 0x06); // GDO0 output pin config. cc_spi_write_reg(TI_CCxxx0_PKTLEN, 0xFF); // Packet length.cc_spi_write_reg(TI_CCxxx0_PKTCTRL1, 0x05); // Packet automation con trol.cc_spi_write_reg(TI_CCxxx0_PKTCTRL0, 0x22); // Packet automation con trol.cc_spi_write_reg(TI_CCxxx0_ADDR, 0x01); // Device address.cc_spi_write_reg(TI_CCxxx0_CHANNR, 0x00); // Channel number.cc_spi_write_reg(TI_CCxxx0_FSCTRL1, 0x12); // Freq synthesizer control. cc_spi_write_reg(TI_CCxxx0_FSCTRL0, 0x00); // Freq synthesizer control. cc_spi_write_reg(TI_CCxxx0_FREQ2, 0x5c); // Freq control word, high bytecc_spi_write_reg(TI_CCxxx0_FREQ1, 0x80); // Freq control word, mid b yte.cc_spi_write_reg(TI_CCxxx0_FREQ0, 0x00); // Freq control word, low b yte.cc_spi_write_reg(TI_CCxxx0_MDMCFG4, 0x2D); // Modem configuration. cc_spi_write_reg(TI_CCxxx0_MDMCFG3, 0x3B); // Modem configuration. cc_spi_write_reg(TI_CCxxx0_MDMCFG2, 0xF3); // Modem configuration. cc_spi_write_reg(TI_CCxxx0_MDMCFG1, 0x22); // Modem configuration. cc_spi_write_reg(TI_CCxxx0_MDMCFG0, 0xF8); // Modem configuration. cc_spi_write_reg(TI_CCxxx0_DEVIATN, 0x00); // Modem dev (when FSK mod en)cc_spi_write_reg(TI_CCxxx0_MCSM1 , 0x3F); // MainRadio Cntrl State Machinecc_spi_write_reg(TI_CCxxx0_MCSM0 , 0x18); // MainRadio Cntrl Statecc_spi_write_reg(TI_CCxxx0_FOCCFG, 0x1D); // Freq Offset Compens. Configcc_spi_write_reg(TI_CCxxx0_BSCFG, 0x1C); // Bit synchronization confi g.cc_spi_write_reg(TI_CCxxx0_AGCCTRL2, 0xC7); // AGC control.cc_spi_write_reg(TI_CCxxx0_AGCCTRL1, 0x00); // AGC control.cc_spi_write_reg(TI_CCxxx0_AGCCTRL0, 0xB0); // AGC control.cc_spi_write_reg(TI_CCxxx0_FREND1, 0xB6); // Front end RX configura tion.cc_spi_write_reg(TI_CCxxx0_FREND0, 0x10); // Front end RX configurat ion.cc_spi_write_reg(TI_CCxxx0_FSCAL3, 0xEA); // Frequency synthesizer c al.cc_spi_write_reg(TI_CCxxx0_FSCAL2, 0x0A); // Frequency synthesizer c al.cc_spi_write_reg(TI_CCxxx0_FSCAL1, 0x00); // Frequency synthesizer c al.cc_spi_write_reg(TI_CCxxx0_FSCAL0, 0x11); // Frequency synthesizer c al.cc_spi_write_reg(TI_CCxxx0_FSTEST, 0x59); // Frequency synthesizer c al.cc_spi_write_reg(TI_CCxxx0_TEST2, 0x88); // Various test settings.cc_spi_write_reg(TI_CCxxx0_TEST1, 0x31); // Various test settings.cc_spi_write_reg(TI_CCxxx0_TEST0, 0x0B); // Various test settings.#endif#if 1// Write register settingscc_spi_write_reg(TI_CCxxx0_IOCFG2, 0x0B); // GDO2 output pin con fig.//cc_spi_write_reg(TI_CCxxx0_IOCFG2, 0x3A); // GDO2 output pin confi g.cc_spi_write_reg(TI_CCxxx0_IOCFG0, 0x06); // GDO0 output pin con fig.cc_spi_write_reg(TI_CCxxx0_PKTLEN, 0xFF); // Packet length.cc_spi_write_reg(TI_CCxxx0_PKTCTRL1, 0x05); // Packet automation control.cc_spi_write_reg(TI_CCxxx0_PKTCTRL0, 0x05); // Packet automationcc_spi_write_reg(TI_CCxxx0_ADDR, 0x01); // Device address.cc_spi_write_reg(TI_CCxxx0_CHANNR, 0x00); // Channel number.cc_spi_write_reg(TI_CCxxx0_FSCTRL1, 0x06); // Freq synthesizer cont rol.cc_spi_write_reg(TI_CCxxx0_FSCTRL0, 0x00); // Freq synthesizer cont rol.cc_spi_write_reg(TI_CCxxx0_FREQ2, 0x5c); // Freq control word, hig h bytecc_spi_write_reg(TI_CCxxx0_FREQ1, 0x80); // Freq control word, mid byte.cc_spi_write_reg(TI_CCxxx0_FREQ0, 0x00); // Freq control word, low byte.cc_spi_write_reg(TI_CCxxx0_MDMCFG4, 0x78); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_MDMCFG3, 0x93); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_MDMCFG2, 0x03); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_MDMCFG1, 0x22); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_MDMCFG0, 0xF8); // Modem configuratio n.cc_spi_write_reg(TI_CCxxx0_DEVIATN, 0x44); // Modem dev (when F SK mod en)cc_spi_write_reg(TI_CCxxx0_MCSM1 , 0x3F); //MainRadio Cntrl State Machinecc_spi_write_reg(TI_CCxxx0_MCSM0 , 0x18); //MainRadio Cntrl State Machinecc_spi_write_reg(TI_CCxxx0_FOCCFG, 0x16); // Freq Offset Compens. Configcc_spi_write_reg(TI_CCxxx0_BSCFG, 0x6C); // Bit synchronization c onfig.cc_spi_write_reg(TI_CCxxx0_AGCCTRL2, 0x43); // AGC control.cc_spi_write_reg(TI_CCxxx0_AGCCTRL1, 0x40); // AGC control.cc_spi_write_reg(TI_CCxxx0_AGCCTRL0, 0x91); // AGC control.cc_spi_write_reg(TI_CCxxx0_FREND1, 0x56); // Front end RX configu ration.cc_spi_write_reg(TI_CCxxx0_FREND0, 0x10); // Front end RX configu ration.cc_spi_write_reg(TI_CCxxx0_FSCAL3, 0xA9); // Frequency synthesizer cal.cc_spi_write_reg(TI_CCxxx0_FSCAL2, 0x0A); // Frequency synthesizer cal.cc_spi_write_reg(TI_CCxxx0_FSCAL1, 0x00); // Frequency synthesizer cal.cc_spi_write_reg(TI_CCxxx0_FSCAL0, 0x11); // Frequency synthesizer cal.cc_spi_write_reg(TI_CCxxx0_FSTEST, 0x59); // Frequency synthesizer cal.cc_spi_write_reg(TI_CCxxx0_TEST2, 0x88); // Various test settings.cc_spi_write_reg(TI_CCxxx0_TEST1, 0x31); // Various test settings.cc_spi_write_reg(TI_CCxxx0_TEST0, 0x0B); // Various test settings. #endif}// PATABLE (0 dBm output power)//u8_t paTable[] = {0xFB};u8_t paTable[] = {0xFF};u8_t paTableLen = 1;// 发送数据包void cc_send_packet(u8_t *tx_buf, u8_t size){// 先进空闲,防止锁死cc_spi_strobe(TI_CCxxx0_SIDLE);cc_spi_write_burst_reg(TI_CCxxx0_TXFIFO, tx_buf, size); // Write TX d atacc_wait(30);//cc_spi_write_reg(TI_CCxxx0_FREND0, 0x10); // POWER = 10dbm //cc_wait(30);cli();cc_spi_strobe(TI_CCxxx0_STX); // STX="0x35" enable TX.while ((PIND&CC2500_GDO0) == 0) ; // wait for GDO0 hi, sync TX'ed while ((PIND&CC2500_GDO0) != 0) ; // wait for GDO0 lo, end of pkt sei();}//u8_t cc_receive_packet(u8_t *rx_buf, u8_t *length){u8_t status[2];u8_t pktlen;if ((cc_spi_read_status(TI_CCxxx0_RXBYTES) & TI_CCxxx0_NUM_RXB YTES)) {pktlen = cc_spi_read_reg(TI_CCxxx0_RXFIFO); // read length byte if (pktlen <= *length) { // if pktlen size <= rx_bufcc_spi_read_burst_reg(TI_CCxxx0_RXFIFO, rx_buf, pktlen); // Pull data*length = pktlen; // return the actual sizecc_spi_read_burst_reg(TI_CCxxx0_RXFIFO, status, 2); // read app ended status bytereturn (u8_t)(status[TI_CCxxx0_LQI_RX]&TI_CCxxx0_CRC_OK); // return CRC_OK bit} else {*length = pktlen;cc_spi_strobe(TI_CCxxx0_SFRX); // Flush RXFIFOreturn 0; // error}} else {return 0; // error}}// 接收中断函数SIGNAL(SIG_INTERRUPT0){rx_pkt_2500.len = 32;rx_state_2500 = cc_receive_packet(rx_pkt_2500.buf, &(rx_pkt_2500.len)); if (rx_state_2500 != 0)rx_flag_2500 = 1;cc_spi_strobe(TI_CCxxx0_SRX); // 返回接收}。

AVR通过串口给芯片烧录程序(ATMega16)

AVR通过串口给芯片烧录程序(ATMega16)

AVR通过串口给芯片烧录程序(ATMega16)AVR通过串口给芯片烧录程序(ATMega16)相信大家都用过STC系列的51单片机,STC系列的单片机烧录程序都很简单,只需要通过串口就可以实现程序的烧录。

于是就想让avr 的芯片也能实现通过串口就能下载的功能,这样就可以省去购买usbasp下载线或者高压编程器的费用了。

仔细研究avr的芯片手册,发现都是带有bootloader功能,同时这个bootloader功能可以读写芯片的整个flash存储区,并且包括bootloader区,而且还有另外一个特点:如果bootloader功能开启以后,每次复位都会从bootloader启动。

接下来再来研究一下STC芯片的烧录功能:当在烧录软件中按下“下载”按钮以后,烧录软件会通过传给给STC芯片不停的发送一串数据,此时给STC芯片下电,然后上电,芯片上电以后,首先检测是否有烧录的请求,如果有就开始烧录程序,如果没有就开始执行芯片flash中的程序。

于是就有一个大概的思路了,可以给avr的芯片写一个bootloader的串口通信的程序,首先检测是否有烧录请求,如果有就更新flash中的程序,如果没有烧录请求,则执行flash中原有的程序。

经过几天的努力这个通过串口给atmega16烧录程序的固件和上位机终于完成了,为了方便大家这里共享处原理图和固件程序。

其实这种功能应该有人已经实现了,至少国外的开源硬件arduino就是通过这种方式给atmega8烧录程序的,但是atmega16我没有找到现成的,于是就自己实现了一个。

烧录软件使用winavr中的avrdude程序。

这也是一个开源项目,avrdude是一个控制台程序,操作不是很方便,于是写了一个应用程序封装了一下。

原理图:原理图实际上就是一个带有串口的avr最小系统。

烧录bootloader程序:下载ATMega16串口下载.rar 安装包,解压到本地目录,使用usbasp把“bootloader" 文件夹下的固件烧录到atmega16里,然后修改熔丝位:验证烧录程序:把自制的板子通过串口和电脑相连,运行“AvrSelfProgram.exe” 程序:在软件中选择正确的串口,并浏览打开要烧录的hex固件,此时按下板子上的复位按钮,然后点击“写FLASH”按钮。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

AVR ATMega16 步进电机驱动程序
这两天做步进电机的驱动成功,现将程序共享,愿起到抛砖引玉的作用。

此程序可驱动五引线步进电机,通过按键可控制步进电机的转速、方向、三种驱动方式,三种驱动方式分别为:单四拍驱动、双四拍驱动、单双八拍驱动,其中以单双八拍驱动转
速最慢。

具体联接方式在程序中有说明。

/************************************
* 步进电机的M16驱动程序*
* 功能:用M16驱动步进电机*
* 实现三种驱动方式*
* 单四拍驱动、双四拍驱动 *
* 单双八拍驱动*
* 驱动芯片:ULN2803 *
* 联接方式:PC0-3分别通过2803接A-D *
* 步进电机公共端接+5V电源 *
* 建立日期:2008年04月05日*
* 作者:铜河*
* 版本:V1.0 *
* 修改日期:2008年04月06日*
* 主控芯片:M16 *
* 时钟频率:外部晶体 7.3728MHZ *
* 编译器:ICCAVR 6.31A *
************************************/
#include <iom16v.h>
#include <macros.h>
#include "delay.h"
#define RD_KEY() ((~(PINC|0x0F))>>4)//四按键接于PC4-PC7
unsigned char i=0; //转动计数
unsigned char m=1; //驱动方式参数
unsigned char n=0; //转动方向参数
unsigned int zhuansu=61500; //转速数据
/****************************
* 端口配置函数*
****************************/
void port_init(void)
{
PORTA = 0x40;
DDRA = 0x40;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0xF0;
DDRC = 0x0F;
PORTD = 0x00;
DDRD = 0x00;
}
/****************************
* 正转操作函数*
* 入口:a 三种工作方式 *
****************************/
void bj_fs(unsigned char a)
{
switch(a)
{
case 1: //单四拍方式驱动
PORTC |= 1<<i; //A、B、C、D驱动
i++;
if(i>=4)i=0;
break;
case 2: //双四拍方式驱动
if(i!=4) //AB、BC、CD、DA驱动
PORTC |= (1<<i)|(1<<(i-1));
else
PORTC |= (1<<(i-1))|1;
i++;
if(i>=5)i=1;
break;
case 3: //单双八拍方式驱动
if(i%2) //A、AB、B、BC、C、CD、D、DA驱动
{
if(i!=7)
PORTC |= (1<<(i/2))|(1<<(i/2+1));
else
PORTC |= (1<<(i/2))|1;
}
else
{
PORTC |= 1<<(i/2);
}
i++;
if(i>=8)i=0;
break;
default:break;
}
}
/****************************
* 反转操作函数*
* 入口:a 三种工作方式 *
****************************/
void bj_fsf(unsigned char a)
{
switch(a)
{
case 1: //单四拍方式驱动PORTC |= 1<<(3-i); //D、C、B、A驱动
i++;
if(i>=4)i=0;
break;
case 2: //双四拍方式驱动if(i!=4) //AD、CD、BC、AB驱动
PORTC |= (1<<(3-i))|(1<<(4-i));
else
PORTC |= (1<<(i-1))|1;
i++;
if(i>=5)i=1;
break;
case 3: //单双八拍方式驱动if(i%2) //DA、D、CD、C、BC、B、AB、
A驱动
{
PORTC |= 1<<(3-i/2);
}
else
{
if(i)
PORTC |= (1<<(3-i/2))|(1<<(4-i/2));
else
PORTC |= (1<<(3-i/2))|1;
}
i++;
if(i>=8)i=0;
break;
case 4:
default:break;
}
}
/****************************
* 定时器1配置函数*
* 工作模式:普通模式*
* 工作方式:溢出中断*
* 预分频:64 *
* 时钟频率:外部7.3728MHZ *
****************************/
void timer1_init(void)
{
TCCR1B = 0x00;
TCNT1H = zhuansu>>8;
TCNT1L = zhuansu&0xFF;
TCCR1A = 0x00;
TCCR1B = 0x02;
}
/****************************
* 定时器1中断函数* ****************************/
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
TCNT1H = zhuansu>>8;
TCNT1L = zhuansu&0xFF;
PORTC &= 0xF0;
if(n)
bj_fsf(m); //反转
else
bj_fs(m); //正转
}
/**************************** * 器件初始化函数* ****************************/
void init_devices(void)
{
CLI();
port_init();
timer1_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x04;
SEI();
}
/****************************
* 主函数* ****************************/
void main(void)
{
unsigned char key,key1;
init_devices();
while(1)
{
key=RD_KEY(); //按键扫描
if(key)
{
delay_ms(20);
key1=RD_KEY();
if(key==key1)
{
switch(key) //按键有效,相应处理
{
case 0x01: //S1键处理:转速增加
zhuansu += 100;
if(zhuansu>62000)zhuansu=62000;
break;
case 0x02: //S2键处理:转速降低
zhuansu -= 100;
if(zhuansu<5000)zhuansu=5000;
break;
case 0x04: //S3键处理:转换驱动方式
m++;
if(m>=4)m=1;
break;
case 0x08: //S4键处理:正反转控制
if(n)
n=0;
else
n=1;
break;
default:break;
}
}
while(key) //等待按键释放
{
delay_ms(10);
key=RD_KEY();
}
}
}
}。

相关文档
最新文档