简易AVR单片机教程.doc_第1页
简易AVR单片机教程.doc_第2页
简易AVR单片机教程.doc_第3页
简易AVR单片机教程.doc_第4页
简易AVR单片机教程.doc_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

简易单片机教程47 / 47ICCAVR的使用参考程序代码1模拟比较器#include#includevoid main() unsigned char mid; DDRC=0xFF; PORTC=0xFF; ACSR=0x00; /启动模拟比较器 参考电压接比较器正端 中断屏蔽 触发定时计数器1的捕获关闭 while(1) mid=ACSR&0x20; /读出模拟比较器的输出值 if(mid=0) PORTC|=BIT(0); /PC0=1 else PORTC&=BIT(0); /PC0=0 2彩灯(软件例子程序)/*-Function:流水灯Author:CWBData:2010-05-05-*/#includevoid delay_ms(int ms) int m,n; for(m=0;m=ms;m+) for(n=0;n=450;n+);void main() int i,j,k; DDRA=0xFF; DDRB=0xFF; DDRC=0xFF; DDRD=0xFF; PORTA=0x00; PORTB=0x00; PORTC=0x00; PORTD=0x00; while(1) j=0x01;for(i=0;i=6;i+) PORTA=j;PORTB=j;PORTD=j;delay_ms(600);j=(j1);for(i=0;i1); 3、定时计数器TC2#include#pragma interrupt_handler MyCounter:20static int iCounter=0;void MyCounter(void) if(iCounter=10) /PORTA=0xFF;/PINA;/0xFF;/iCounter+; /iCounter=0; else iCounter=0;void main(void) DDRA=0xFF; PORTA=0x00; /PORTB=0xFF; DDRB=0xFF; TCCR0=0x1B;/PWM相位可调,T/C0与输出引脚断开,CLK/64分频/00011011 TCNT0=0x00;/从0开始计数 OCR0=0x3E;/达到63时,比较匹配发生 TIMSK=0x02;/中断屏蔽寄存器T/C0输出匹配中断使能 #asm(sei); /总中断开放 SREG|=0x80; while(1) /int i,j; / for(i=0;i1000;i+) / for(j=0;j400;j+); if (iCounter=8) PORTA=0xFF;4、计数器TC0#include#pragma interrupt_handler MyCounter:20static int iCounter=0;void MyCounter(void) if(iCounter=10) /PORTA=0xFF;/PINA;/0xFF;/iCounter+; /iCounter=0; else iCounter=0;void main(void) DDRA=0xFF; PORTA=0x00; /PORTB=0xFF; DDRB=0xFF; TCCR0=0x1B;/PWM相位可调,T/C0与输出引脚断开,CLK/64分频/00011011 TCNT0=0x00;/从0开始计数 OCR0=0x3E;/达到63时,比较匹配发生 TIMSK=0x02;/中断屏蔽寄存器T/C0输出匹配中断使能 #asm(sei) /* /不明原因,C中嵌入汇编不能用 */ SREG|=0x80; /总中断开放 SREG|=0x80; while(1) int i,j; / for(i=0;i1000;i+) / for(j=0;j400;j+); if (iCounter=8) PORTA=0xFF; for(i=0;i1000;i+) for(j=0;j400;j+); ;5、EEPROM/*访问单片机资源EEPROM*/#include#define sei() SREG|=0X80#define cli() SREG&=0X7F/EEPROM控制寄存器位定义#define EERE 0/READ#define EEWE 1/WRITE#define EEMWE 2/总写入#define WWRIE 3/中断/*端口初始化*/void _init(void) DDRA=0XFF; PORTA=0XFF; /*EEPROM读程序*/char EEPROM_R(unsigned int EEAdd) while(EECR&(1EEWE); /写等待 EEAR=EEAdd; /设置读入地址 EECR|=(1EERE); /读命令 return EEDR; /*EEPROM写程序*/char EEPROM_W(unsigned int EEAdd, unsigned char EEData) while(EECR&(1EEWE); /写等待 EEAR=EEAdd; /设置写入地址 EEDR=EEData; /设置写入数据 EECR|=(1EEMWE); /总写入允许 EECR|=(1EEWE); /开始写入 void main() _init(); cli(); /关中断 EEPROM_W(0X100, 0X07); /将数据写入EEPROM中的0x0100单元 PORTA=EEPROM_R(0X0100); /读取0x0100单元的数据,送显 sei(); /开中断/*开中断关中断的作用?*/ while(1);6、计数器测频率#include/*程序还有问题要解决*/void main() DDRB=0x08; PORTB=0x00;/PB3(OC0) CONFIG output TCCR0=0x1B;/64分频 pwm 比较匹配发生oc0触发 TCNT0=0x00; OCR0=0x80;/RECT WAVE ASSR=0x00; /同步方式 /T/C2 目的定时1MS TCCR2=0x0B;/32 fen pin CTC 与输出引脚断开 TCNT2=0x00;/从零开始记数 OCR2=0x7D;/0b0111 1101125 TCCR1A=0x00; TCCR1B=0x06;/时钟 外部T1引酵 下降驱动 一般模式 TCNT1H=0x00; TCNT1L=0x00; /从零开始记数 ICR1H=0x00;/似乎没用到输入捕获寄存器? OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00;/都为0 TCNT1中也为0 比较匹配貌似在这种情况不发生 TIMSK=0x80; SREG|=0x80; /t/c2 比较匹配中断开放 全局中断开放 7、串口中断int/ Target : M16 / Crystal: 8.0000Mhz /AVR单片机atmega16串口中断接收和发送程序。接收到字符后再发送出去 #include #include unsigned char com_in_buf1; void port_init(void) PORTA = 0xFF; DDRA = 0xFF; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; /UART0 initialize / desired baud rate: 9600 / actual: baud rate:9615 (0.2%) / char size: 8 bit / parity: Disabled void uart0_init(void) UCSRB = 0x00; /disable while setting baud rate UCSRA = 0x00; UCSRC = BIT(URSEL) | 0x06; UBRRL = 0x33; /set baud rate lo UBRRH = 0x00; /set baud rate hi UCSRB = 0x98; void send_data(unsigned char back) while( !( UCSRA & (1UDRE) ) ; UDR=back; #pragma interrupt_handler uart0_rx_isr:12 void uart0_rx_isr(void) /uart has received a character in UDR com_in_buf0=UDR; send_data(com_in_buf0); /call this routine to initialize all peripherals void init_devices(void) /stop errant interrupts until set up CLI(); /disable all interrupts port_init(); uart0_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x00; /timer interrupt sources SEI(); /re-enable interrupts /all peripherals are now initialized void main(void) char j; init_devices(); while(1) for(j=1;j100;j+) ; 8、中断#include/#includevoid delay_ms(ms)int i; for(i=0;i=ms;i+) for(i=0;i=10;i+);int x;void main() DDRA=0xFF; PORTA=0xF0;/ GICR=0x40; /INT0中断使能/通用中断控制寄存器 /MCUCR=0x07; /上升沿触发 /MCU控制寄存器 /MCUCSR=0x00;/MCUCSR/MCU控制和状态寄存器 /GIFR=0x40;/通用中断标志寄存器 /SREG|=0x80;/全局使能,状态寄存器 #asm(sei) while(1) PORTA=(PORTA&0x04); delay_ms(50); /#pragma interrupt_handler int0_isr:2/void int0_isr(void)/ /x+;/9、键盘扫描#includevoid delay_ms(ms)int i; for(i=0;i=ms;i+) for(i=0;i=400;i+);char Scan() char tem_key; DDRB=0X0F; PORTB=0B11110000; if(PINB=0XF0) return(0XFF); if(PINB&0X08=0)tem_key=0; else if(PINB&0X10=0)tem_key=1; else if(PINB&0X20=0)tem_key=2; else if(PINB&0X30=0)tem_key=3; DDRB=0B11110000;/反转PORTB=0X0F;delay_ms(5);If(PINB&0X01=0)tem_key=tem_key+0; /获取按下键的行编码 else if(PINB&0X02=0)tem_key=tem_key+4; else if(PINB&0X03=0)tem_key=tem_key+8; else if(PINB&0X04=0)tem_key=tem_key+12; return(tem_key);void main() Scan();10、八端口液晶程序#include#include#define uchar unsigned char#define uint unsigned int/#pragma data:code/?const uchar table=I LIKE AVR!;const uchar table2=I LIKE PIC !;void delay(uint ms) uint i,j; for(i=0;ims;i+) for(j=0;j1141;j+);void writeCom(uchar com) PORTD&=BIT(4);/RS 拉低-为命令选择 PORTD&=BIT(5);/R/W拉低-选择写 PORTB=com;/写入命令 PORTD|=BIT(6);/E高电平-使能 delay(1); PORTD&=BIT(6);/使能关闭void writeData(uchar data) PORTD|=BIT(4);/RS位拉高 为数据选择 PORTD&=BIT(5);/R/W拉低-选择写 PORTB=data;/写入数据 PORTD|=BIT(6);/E高电平-使能 delay(1); PORTD&=BIT(6);/使能关闭void main() uchar i; DDRB=0xFF; DDRD|=BIT(4)|BIT(5)|BIT(6);/456输出 分别为 RS RW E的控制端 PORTD&=BIT(6);/使能关闭 writeCom(0X38);/显示模式设置 16x2显示 5x7点阵 8位数据接口 delay(5); writeCom(0X01);/显示清屏 (数据指针 所有显示) delay(5); writeCom(0X0C);/开显示 光标不显示 不闪烁 delay(5); writeCom(0X06);/读或写一个字符后 地址指针加一,且光标加一 若配置s位 则可以出现移屏效果 delay(5); writeCom(0X80+0x00);/设置数据地址指针 第一行 第一列 delay(5); for(i=0;i12;i+) writeData(tablei); delay(5); writeCom(0x80+0x40);/设置数据地址指针 第二行第一列 delay(5); for(i=0;i13;i+) writeData(table2i); delay(5); 11、SPI_AD5300#include#includedelay(unsigned int temp) int i,j; for(i=0;itemp;i+) for(j=0;j1141;j+);void SPI_Init() DDRB|=0XA0; DDRA|=BIT(PA1); SPCR=0X57;void AD5300(unsigned char DAdata) unsigned char temp1=0,temp2=0,status; temp1|=DAdata4; PORTA&=BIT(PA1); SPSR=0; SPDR=temp2; do status=SPSR; while(!(status&0x80); delay(10); SPSR=0; SPDR=temp1; do status=SPSR; while(!(status&0X80); SPSR=0; delay(10); PORTA|=BIT(PA1); void main() SPI_Init(); AD5300;12、TC0 _ PWM#include#pragma interrupt_handler iFunction:20void iFunction() PORTA=0X11; /* 中断没有进入 程序有问题待解决 */void main() DDRA=0xFF; PORTA=0xFF; DDRB=0xFF; PORTB=0xFF; TCCR0=0x64; /PWM 256分频 正向PWMT/C0向上计数过程中比较匹配时清零OC0,T/C0向下计数过程中比较匹配时置位OC0 /TCNT0/ 的值没有设定=0x00;/ OCR0=0x80; /ASSR异步模式状态寄存器只适用于TC0 且只有第四位起作用,高四位保留 /TIFR中断标志寄存器 未设定/|=0x02; TIMSK=0x02; /t/c0比较匹配中断开放 SREG|=0x80; /全局中断使能 while(1) 13、TC2#include#pragma interrupt_handler myCounter:4void myCounter(void) PORTA=PINA; void main(void) DDRA=0XFF; PORTA=0XFF; DDRD=0xFF; /定义PD口为输出 PORTD=0x00; /比较匹配后oc2触发 计数频率256分频 CTC模式 TCCR2=0x1E;/CTC模式 比较傲匹配发生时触发oc2 110-256分频 ASSR=0x08;/外部时钟 TCNT2=0x00;/写入初值+ OCR2=0x80;/比较匹配值为128 TIMSK=0x80;/比较匹配中断开放 SREG|=0x80; while(1) 14、TWI_AT24C02#include/定义TWI状态/MT 主方发送 MR 主方接受#define START 0X08#define RE_START 0X10#define MT_SLA_ACK 0X18#define MT_SLA_NOACK 0X20#define MT_DATA_ACK 0X28#define MT_DATA_NOACK 0X30#define MR_SLA_ACK 0X40#define MR_SLA_NOACK 0X48#define MR_DATA_ACK 0X50#define MR_DATA_NOACK 0X58#define RD_DEVICE_ADDR 0XA1 /前四位固定 后三位看连线#define WD_DEVICE_ADDR 0XA0/*常用TWI操作(主模式写和读)*/#define Start() (TWCR=(1TWINT)|(1TWSTA)|(1TWEN) /启动TWI#define Stoop() (TWCR=(1TWINT)|(1TWSTO)|(1TWEN) /停止TWI#define Wait() while(!(TWCR&(1TWINT); /等待中断发生#define TestAck() (TWSR&0XF8) /观察返回状态#define SetAck() (TWCR|=(1TWEA) /做出ACK应答#define SetNoAck() (TWCR&=(TWEA) /做出NoAck应答#define Twi() (TWCR=(1TWINT|(1TWEN) /启动I2C#define Write8Bit(x) TWDR=(x);TWCR=(1TWINT)|(1TWEN);/写数据到.delay_ms(unsigned int temp) int i,j; for(i=0;itemp;i+) for(j=0;j1141;j+);unsigned char TWI_Write(unsigned char Wdata,unsigned char RegAddress) Start();/TWI启动 Wait(); if(TestAck()!=START) return 1;/ACK Write8Bit(WD_DEVICE_ADDR); /写TWI从器件地址和写方式 Wait(); if(TestAck()!=MT_SLA_ACK) return 1; /ACK Write8Bit(RegAddress); /写器件相应寄存器地址 Wait(); if(TestAck()!=MT_DATA_ACK) return 1; /ACK Write8Bit(Wdata); /写数据到相应寄存器 Wait(); if(TestAck()!=MT_DATA_ACK) return 1; /ACK Stop(); /TWI停止 delay_ms(10); return 0;unsigned char TWI_Read(unsigned RegAddress) unsigned char temp; Start();/TWI启动 Wait();/ if(TestAck()!=START() return 1; /ACK Write8Bit(WD_DEVICE_ADDR); /写TWI从器件地址和写方式 Wait(); if(TestAck()!=MT_SLA_ACK) return 1; /ACK Write8Bit(RegAddress); /写器件相应寄存器地址 Wait(); / if(TestAck()!=MT_DATA_ACK) return 1; /ACK Write8Bit(Wdata); /写数据到相应寄存器 Wait(); if(TestAck()!=MT_DATA_ACK) return 1; /ACK Write8Bit(Wdata); /写数据到相应寄存器 Wait(); if(TestAck()!=MT_DATA_ACK) return 1; /ACK Write8Bit(Wdata); /写数据到相应寄存器 Wait(); if(TestAck()!=MT_DATA_ACK) return 1; /ACK Write8Bit(Wdata); /写数据到相应寄存器 Wait(); 15、UART#include/*串口以查询方式接受并发送数据*/void Uart_Init() UCSRA=0X02; /倍速 UCSRB=0X18;/允许接受和发送 UCSRC=0X86;/8位数据 UBRRH=0X00;/ UBRRL=12; /9600/*数据发送查询方式*/void Uart_Transmit(unsigned char cData) while(!(UCSRA&(1UDRE);/等待缓冲区为空 UDR=cData;/发送数据unsigned char Uart_Receive() while(!(UCSRA&(1RXC)/等待接受数据 return UDR;/获取并返回数据/*主函数*/void main() unsigned char temp; DDRD=0X02; PORTD=0XFF; Uart_Init(); while(1) temp=Uart_Receive(); Uart_Transmit(temp); 16、看门狗#include/*看门狗定时器的关断,必须遵循下列顺序:(1)在同一个操作中,将WDTOE和WDE置“1”;(2)在随后的4个时钟周期内,清“0”WDE位。*/void main() WDTCR=0x0B; /启动看门狗,并设置溢出时间为120ms 0.13s? while(1) #asm(wdr) /汇编复位看门狗 if(expression) /当条件满足时,禁用看门狗 WDTCR=0x18; /将WDTOE和WDE同时置1WDTCR=0x00; /清0WDE看门狗停止工作/.其他代码 17、阿莫实验板 DS1302时钟实验#include #include #include main.h#include DS1302.h/初始化SPI接口void init_SPI(void) SPCR = (1SPE)|(1MSTR)|(1DORD)|(14;j=cBCD&0x0F;*pstr+=i+0x30;*pstr=j+0x30;/BCD码07转换成汉字一日void decodeWEEK(unsigned char WEEK,unsigned char *pstr)unsigned char i;i=WEEK;i&=0x07;i=i1;*pstr+=sWEEKi+;*pstr=sWEEKi;/读取当前时间并解释void read_date(void)Burst_SPI(CMD_CLOCK_BURST|CMD_READ,7,0,&CURDATE0);/读取当前时间BCDtoASCII(CURDATE6,&sCURDATE2);/年 ,0010BCDtoASCII(CURDATE4,&sCURDATE6);/月 ,0112BCDtoASCII(CURDATE3,&sCURDATE10);/日 ,0131(28/30/31)BCDtoASCII(CURDATE2,&sCURDATE14);/时 ,0023BCDtoASCII(CURDATE1,&sCURDATE18);/分 ,0059BCDtoASCII(CURDATE0,&sCURDATE22);/秒 ,0059decodeWEEK(CURDATE5,&sCURDATE31);/星期 ,17 一日/*-delay_nms:长延时函数(GCC内部延时函数的延时过短) 输入参数: t :延时时间 ms-*/void delay_nms(unsigned int t) while (t-) _delay_ms(1);Ds1302.h#ifndef _DS1302_H_#define _DS1302_H_ 1/读写操作位#define CMD_READ0x01#define CMD_WRITE0x00/时钟 命令#define CMD_SECOND0x80/秒#define CMD_MINUTE0x82/分#define CMD_HOUR0x84/时#define CMD_DAY0x86/日#define CMD_MONTH0x88/月#define CMD_WEEK0x8A/星期 DATE#define CMD_YEAR0x8C/年#define CMD_CONTROL0x8E/控制(写保护)#define CMD_TRICKLE_CHARGE0x90/涓流充电#define CMD_CLOCK_BURST0xBE/连续读取/时钟配置常量#define CFG_CLOCK_HALT0x80/停止时钟控制位 SECONDbit7#define CFG_12_240x80/12/24小时值选择位 HOURbit7 #define CFG_AM_PM0x20/AP/PM位 HOURbit5 #define CFG_PROTECT0x80/写保护控制位 CONTROLbit7 #define CFG_UNPROTECT0x00/写保护控制位 CONTROLbit7 /涓流充电控制常量#define CFG_TC_D1R20xA5/high 1 Diode +2K Resistors #define CFG_TC_D2R80xAB/low 2 Diodes+8K Resistors #define CFG_TC_DISABLED0x00/Disabled(TCS1010 or DS=00 or RS=00)/RAM 命令#define CMD_RAM_BASE0xC0/RAM0RAM301 地址需左移一位 #define CMD_RAM_BURST0xFE/连续读取#endif /* _DS1302_H_ */Main.h#ifndef _main_H_#define _main_H_ 1/

温馨提示

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

评论

0/150

提交评论