当前位置:文档之家› AVR学习笔记

AVR学习笔记

PC = progammer counter //程序计数器ACC = accumulate //累加器PSW = progammer status word //程序状态字SP = stack point //堆栈指针DPTR = data point register //数据指针寄存器IP = interrupt priority //中断优先级IE = interrupt enable // 中断使能TMOD = timer mode //定时器方式 (定时器/计数器控制寄存器)ALE = alter (变更,可能是)PSEN = progammer saving enable //程序存储器使能(选择外部程序存储器的意思) EA = enable all(允许所有中断)完整应该是 enable all interruptPROG = progamme (程序)SFR = special funtion register //特殊功能寄存器TCON = timer control //定时器控制PCON = power control //电源控制MSB = most significant bit//最高有效位LSB = last significant bit//最低有效位CY = carry //进位(标志)AC = assistant carry //辅助进位OV = overflow //溢出ORG = originally //起始来源DB = define byte //字节定义EQU = equal //等于DW = define word //字定义E = enable //使能OE = output enable //输出使能RD = read //读WR = write //写中断部分:INT0 = interrupt 0 //中断0INT1 = interrupt 1//中断1T0 = timer 0 //定时器0T1 = timer 1 //定时器1TF1 = timer1 flag //定时器1 标志 (其实是定时器1中断标志位)IE1 = interrupt exterior //(外部中断请求,可能是)IT1 = interrupt touch //(外部中断触发方式,可能是)ES = enable serial //串行使能ET = enable timer //定时器使能EX = enable exterior //外部使能(中断)PX = priority exterior //外部中断优先级PT = priority timer //定时器优先级PS = priority serial //串口优先级第一部分二极管发光的条件是正负极相差达1V以上。

AVR单片机控制负极更好。

用单片机的IO口去控制二极管的负极从而控制二极管。

IO复位后全部为输入工作方式内部上拉电阻无效,IO是三态高阻的状态IO工作时读取外部引脚的电平一定要用PINXN这个才是反应真正的电平AVR工作电源是5V灯泡的DDRA=0XFF PORTA=0X00LED灯管的DDRB=0XFF PORTB=0X00的时候量的开关的时候是DDRB=0X00 PORTB=0XFF 打开不闭合不导通当PORTB=0的时候导通让LED亮#include <avr/io.h>int main (void){DDRA=0xFF;DDRB=0xFF;PORTA=0xC0;PORTB=0xf7;while (1){}}#include<avr/io.h>#include<avr/delay.h>unsigned char digit[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};按键开关int main(void){DDRA=0xff;PORTA=0x00;DDRB=0xff;DDRD=0x00;PORTD=0xff;while (1){if((PIND^0xff)==4) {PORTA=0xF9; _delay_ms(1000);}elseif ((PIND^0xff)==8){ PORTA=0xA4; _delay_ms(1000);}elseif((PIND^0xff)==0x10) { PORTA=0xb0; _delay_ms(1000);}elseif((PIND^0xff)==0x20) {PORTA=0x99; _delay_ms(1000);}}}按键按一下后弹起#include<avr/io.h>#include<avr/delay.h>#define F_CPU 800000ULunsigned char digit[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};int main(void){DDRA=0xff;PORTA=0x00;DDRB=0xf8;DDRD=0X00;PORTD=0XFF;int i;while(1){if(~PIND&0x04) //保证其位为0{PORTA=digit[1];_delay_ms(100);}else PORTA=digit[0];}}第二部分 SPI通信第三部分数码管数码管由8段组成A B C D E F G P . 8 个连接在一起的发光二极管。

两种:共阳形共阴行。

驱动方式:静态驱动,动态驱动.静态:一个IO 端口控制一个数码管。

方便,耗电量大,占用资源多。

动态:一位一位动态点亮各个数码管。

每隔一段时间点亮一次。

占用资源少,不易控制。

8个段码加上几个位选。

几个位选代表几个数码管。

数码管驱动芯片:CH451,CH451可以驱动8个数码管或者64个发光二极管。

串行数据的输入顺序是低位在前,高位在后。

CH451有4个串行接口;4个:DIN DCLK LOAD DOUT .DIN(输入线)DCLK(时钟线)LOAD(加载线)是带上拉的输入信号线,默认是高电平。

DOUT 串行数据输出线。

第四部分引脚电源:VCC (电源)A VCC(模拟电源)GNDRESTE 外部复位脚单片机一般是低电平复位。

在RESTE上给一个低电平使其复位。

XTAL1 XTAL2 时钟CH451的扫描顺序为DIG0-DIG7 一个引脚吸入电流时,其他引脚不吸入电流。

降低扫描极限可以提高数码管的亮度。

CH451有8个8位的数据寄存器。

第五部分键盘(PD的高四位作为输出口低四位作为输入口列线作为输入端行线作为输出端)独立键盘:根据电平的不同来判断是否按下。

机械弹性触电开关。

按键抖动键盘的消抖硬件消抖:加入消抖电路(难度大)软件消抖:软件设计(第一次确认后经过10MS再确认按键是否按下)上拉电阻使能?(PORTXN=1 PUD=1 DDRXN=0)三个条件都满足时表示上拉电阻有效。

当PORTXN=0表示其上拉电阻无效。

矩阵键盘:反转法和逐行扫描矩阵(由行线列线构成)按键未按下时是高电平,按下变成低电平电平与信号一个键盘对应一个IO口IO 口有三态?上拉电阻逐行扫描法:确定有键按下:4行全部是低电平4列全部是高电平确定后确定哪个键按下依次将行线设置为低电平列线全部为高电平PA0-PA3控制行PA4-PA7控制列输出端是不变的如果输入端是低电平输出端为高电平输如端变为高电平程序#include <avr/io.h>#include <utile/delay.h>unsigned char read_key(void)unsigned char i,j,key_value=0xff;DDRD=0xf0;PORTD=0x0f;if((PIND&0x0f) return Oxff;else {delay_ms(5);if((PIND&0x0f)==0x0f) return 0xff;else{for (i=4;i<8;i++){PORTD=~(1<<i)|0x0f;for(j=0;j<4;j++){if((PIND&(1<<j)==0)key_value=(i-4)*4+j;}}return key_value;}}int main (){//}第六部分:中断中断:自动响应请求执行中断请求服务再回来。

优点:实时处理实现分时操作进行故障处理待机状态的唤醒几个概念:主程序中断源:可以发出单片机的CPU中断请求的部件和设备(分类:非屏蔽中断可屏蔽中断软件中断)中断请求信号:发出的申请信号中断标志:对应的不同中断标志位有不同的变化中断响应:停止现行程序转向中断服务程序中断服务程序:中断要做到事情转向断点:被打断的地方中断现场保护中断返回中断向量中断优先级(由硬件决定)中断嵌套响应A中断=全局中断标志中断A允许标志中断A标志(三个条件) 针对可屏蔽中断ATMEGE16共21个中断源每个中断向量占2个字(4个字节)中断响应过程:第一:全局允许中断位清0 禁止响应其它中断被响应的中断标志位清0 将中断的断点的地址压入堆栈自动将响应中断向量地址压入程序计数器(中断服务程序的入口地址)至少4个时钟周期中断返回的过程程序:几个寄存器MCUCR(ISC11ISC10)控制INT1(ISC01ISC00)控制INT0GICR(当它是1时开启中断)(中断使能寄存器)GIFR(外部中断标志器)#define F_CPU 7372800UL //定义时钟频率,保证delay函数的准确键盘中断#include<avr/io.h>#include<util/delay.h>#include<avr/interrupt.h>int num_tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示数字时对应的PA口信号void led_num(unsigned int num) //数字输出函数{unsigned char temp,i;for(i=0;i<4;i++){PORTB=0XFF;temp=num%10;PORTA=num_tab[temp];PORTB=~(1<<(3-i));_delay_us(20);num/=10;}}//中断SIGNAL(SIG_INTERRUPT0) //外部中断0所执行程序的内容{sei(); //开总中断PORTB=0X00;PORTA=0xf0;while(1);}SIGNAL(SIG_INTERRUPT1) //外部中断1所执行程序的内容{sei(); //开总中断PORTB=0X00;PORTA=0x0f;while(1);}void IO_init(void) //端口初始化{PORTA=0XFF;DDRA=0XFF;PORTB=0XFF;DDRB=0XFF;PORTC=0xff;DDRC=0xff;PORTD=0xff;DDRD=0x00;}void interrupt_init(void) //中断初始化{MCUCR=0X03; //中断0、1为上升沿产生中断请求,GICR=0xc0; //开中断0、1}int main(void){IO_init(); //端口初始化interrupt_init(); //中断初始化sei(); //开总中断unsigned int a,b;while(1){for(a=0;a<9999;a++){for(b=0;b<5000;b++)led_num(a); //输出信号}}}按键中断的起始条件:DDRA=0XFF;DDRB=0XFF;DDRD=0X00;PORTD=0XFF;中断函数SIGNAL(SIG_INTERRUPT0)void interrupt_init(void) //中断初始化{MCUCR=0X03; //中断0、1为上升沿产生中断请求,GICR=0xc0; //开中断0、1}计时器计数器定时计数器的长度 8位16位脉冲信号源外部引脚和内部提供计数器的类型 +1 -1上下限最小值最大值计数器的事件比较匹配中断2个八位一个16位的计数器主要是8位T/C01单通道计数器2比较匹配清0计数器3允许使用外部引脚410位的时钟分频器和频率发生器5溢出和比较匹配中断源6输出PWM信号中断方式:溢出中断比较中断时钟源外部时钟源同步采样电路边缘检测电路外部频率至少不能大于系统的 2.5分之一宽度大于一个系统时钟周期定时器的计数单元 +1 或者-1 或者清0比较匹配中断输出比较寄存器 TCNT OCRN 两者相等时输出中断标志位置为1 为什么有些是到255?定时器的工作模式:普通模式比较模式PWM模式TCNTO 记录初值输出比较寄存器OCROTIMSKTIFRTCCRO 控制寄存器调节工作模式用的是 WGM00 WGM01CS02 CS01 CS02 0选择时钟源1 1 0 下降沿触发1 1 1 上升沿触发void timer0_init() //计时器T0初始化{TCNT0 = 0;TCCR0 |= (1<<CS00)|(1<<CS02);//1024分频TIMSK |=(1<<TOIE0); //TO中断溢出允许}//ISR(TIMER0_OVF_vect)SIGNAL(SIG_OVERFLOW0) //T0中断溢出函数{n+=1;}两个独立的中断源:溢出中断TOVO 输出比较中断0CF0总结TCCRO T/C控制寄存器是用来控制信息源的类别和模式的TCNTO T/C寄存器OCRO 输出比较寄存器TIMSK T/C中断屏蔽寄存器TIFR 中断标志寄存器当TIMSK=0X01时是溢出中断当TIMSK=0X02时是比较中断中断标志寄存器是不用我们定义的电脑运行的时候中断执行会把它变为1中断使能的意思是这个中断可以运行.问:0CR0=0XFF的时候CTC模式等于普通模式.CTC与快速PWM的区别是两着的TOP不同,快速PWM模式改变波形:改变有效值(有效电压)快速PWM模式在比较匹配的时候电平变为0 达到最大值的时候(0XFF)变为10C0是在PB3上的打开这个端口是DDRB=0X04当有输出的时候要打开0CO不是所有的比较输出都要打开0C0的主要看要不要输出0CR0是那个比较的数值.TCO 八位计时器TC1十六位计时器使用内部时钟源计时使用外部时钟源用来计数{TCNTO=0X00;TCCRO=0X07;TIMSK|=(1<<TOIEO);}要发生中断要按255次1号按键 T0对应PB0 按键可以吗? PB0好像没有按键.在普通模式中当他完成溢出中断的时候他是返回原值还是0X00?0X00在CTC模式的时候是返回原值的。

相关主题