1、单片机与传感器基础-课程总结学习硬件:AVR ATmega8 a学习软件:Proteus7 .8 + Code Vision AVR1、AVR特性哈佛结构(计算机或者说单片机分为两种结构:冯诺伊曼结构和哈佛结构,它们的区别在于前者只有一条总线进行数据和指令的传输而后者有两条总线一条是数据总线一条是代码指令传输的总线;提高了单片机的效率。)RISC精简指令集单时钟周期指令2、ATmega8 a特性8位1 3 0条指令-大多数指令执行时间为单个时钟周期,硬件乘法器需两个时钟周期3 2个8位通用工作寄存器8 K字节可在线自编程Flash程序存储器:引导程序区(Boot区)和应用程序区1 K字节的片内
2、SRAM5 1 2字节的EEPROM擦写寿命:Flash, 1万次;EEPROM: 1 0万次3、ALU-算术逻辑单元-两个寄存器-(访问,运算,存回,一个时钟)一条指令执行需要一个时钟周期在一个时钟周期内分三个阶段第一个阶段从通用工作寄存器里取数据,然后放到ALU里进行处理,最后把处理完的数据再送回3 2位通用工作寄存器里;相当于是取算回。4、状态寄存器-SREG,最高位bit7为全局中断使能,使用时先置1。5、堆栈指针:总是指向堆栈的顶部;向下生长;必须先定义堆栈空间,初值必须大于0 X6 06、复位源:上电复位,掉电复位,外部复位,看门狗复位。状态寄存器MCUCSR(相应位会置1)可用于
3、检测何种原因复位。7、执行时第一条指令在复位向量处(第一条指令),地址0 0 0 0,为绝对跳转指令,如果在其它中断位置则随便条程序出错。8、中断:1 9个中断源,响应时间-4个时钟周期9、逻辑运算主要分两种,条件间的与或非,操作式之间的按位与或非和异或。1 0、关键字flash,e2 prom和register作用:flash存常量,e2 prom可读可写故存变量,register必须存入3 2个通用工作寄存器中。interrupt关键字在建立中断服务程序(前面必须加该关键字,与普通的不同)时会用到;interrupt+中断向量号(01 9)。1 1、C语言中如何单行嵌入汇编语言:#asm
4、(sei)1 2、编译之后寄存器的名字都是地址。1 3、外部中断2个触发方式4个:下降沿、上升沿、低电平、电平转换1 4、编程方式:选择触发引脚(INT0,INT1)设置触发方式打开中断开关编写中断服务程序。1 5、时钟源:三个控制位8种设置方式,7来源(第一中没有时钟)clk_i/o,不计数即调为0 0 01 6、TC1 CTC模式和快速脉宽模式PWM的发送都是从小到大计数(从0计到最大值)。CTC模式记到最大值后匹配然后改变输出状态。每计一次数输出状态改变一次,记录半个周期的信号。快速脉宽方式从小到大有两个事件,中间有一个比较匹配事件,计到最大值有一个溢出事件,OCR1 A或B电平发生变化
5、,每记一次数输出一个周期的信号。1 7、TC1 PWM模式的top值存在ICR1,比较值存在OCR1 A或OCR1 B。top值有五种,三种为固定8,9,1 0位二进制数,另两种是top值可以改变的一种存在ICR1输入捕捉寄存器中;也可以存在OCR1 A输出比较寄存器中。1 8、怎样改变TC1的工作模式,TC1有一个wave form generation模式控制位,一共有四个控制位,其中两位在TCCR1 A这个寄存器里,有两位在TCCR1 B这个寄存器里。这四位有1 6种组合方式,对应1 6种工作方式:普通工作方式四个0。1 9、TC1编程用到了哪些寄存器(8个);2个控制寄存器TCCR1
6、A,TCCR1 B(8位);2个输出比较寄存器OCR1 A,OCR1 B(1 6位);一个数据寄存器TCNT1(1 6位);一个输入捕捉寄存器ICR1(1 6位);两个通用寄存器,中断开关TI_MASK和中断服务寄存器TI_MR(与TC0共有)。2 0、TC1时钟源选择有8种选择(第一种没有时钟,后两种比较输入,中间1,8,6 4,2 5 6,1 0 2 4分频(与TC0共用分频模块)。2 1、开关电源电路电感和二极管作用:电感储能,二极管蓄流。2 2、快速脉宽调制方式PWM输出公式:f_OC1 APWM=fracf_clk_ION*(TOP+1 ),变量因子N=1,8,6 4,2 5 6,1
7、 0 2 4。2 3、为什么CTC的输出公式中分母里有2,因为CTC模式每计一次输出半个周期,所以它计两次数才改变一次,而PWM计一次变一次,所以频率f是前者的两倍。2 4、SPI四个引脚各为?MISO MOSI SCK SS(主机/master,从机/slave;MISO,MOSI,SCK,SS引脚,同名相连;同名的引脚作为主机和从机时功能不同-MISO;系统包括两个移位寄存器和一个主机时钟发生器;SS引脚拉低,主机启动一次通讯过程;主机在SCK引脚上产生时钟脉冲以交换数据;数据从主机的MOSI移出,在从机的MOSI移入;)2 5、MISO功能为何?主机接收从机发送。2 6、SPI有几个寄存
8、器(3个),各何?SPCR,SPDR,SPSR2 7、USART异步串口有3个独立中断:发送结束中断,发送数据寄存器空中断,以及接收结束中断。2 8、USART的帧结构(共3 0种):起始位+5,6,7,8或9个数据位+无校验位,奇或偶校验+1或2个停止位。2 9、USART接收发送有几个缓存寄存器,发送1个,接受放2个缓存器,凡是缓存器都是先入先出。3 0、USART中有两个寄存器共用一个I/O口地址,UBRR和UCSRC。3 1、USART寄存器有:数据寄存器UDR,三个控制和状态寄存器,UCSRA,B,C,波特率寄存器UBRRL和UBRRH(1 6位,分为高字节低字节)。3 2、7 4
9、LS1 6 4作用:串行输入,并行输出(串并转换)。3 3、TWI几根线?两根线:SCL,SDA最多连接1 2 8个设备(7位地址空间),每个设备都有自己的地址。3 4、“线与”:一个器件输出低,总电平就为低。TWI中多个主机仲裁和同步主机时钟或从机需要主机等待时(把时钟线拉低)用到线与。3 5、TWI传输时在数据位有何要求,START,STOP信号如何定义?TWI总线数据位传送与时钟脉冲同步;时钟线为高电平时,数据线电平必须保持稳定,否则:开始和结束信号。3 6、赢得仲裁判断标准为何?输入输出一样。仲裁是在发送地址时同步发生的。3 7、TWI通信过程:START+地址包+数据包+1位应答位地
10、址包-9位(7位地址位+1位R/W控制位+1位应答位)数据包-9位(8位数据位+1位应答位)高位先发3 8、TWI工作模式四种:(主机+从机)*(发送+接收)。3 9、形容TWI的特点:面向字节,基于中断。4 0、TWINT:由谁置位(硬件置位或操作置位)TWI完成当前工作,希望应用程序介入时TWINT置位;TWINT置位时,时钟线SCL信号电平即被拉低;TWINT不自动清“0”;软件写“1”一旦被清零,TWI立即开始工作;4 1、ADC转换,分辨率1 0位。方式:逐次逼近。几路输入:6 /8路复用的单端输入通道。4 2、最高采样率:每秒钟最多多少次AD转换(SPS,sample per se
11、cond)4 3、参考电压三种来源:AVCC,AREF,2 .5 64 4、ADC两种工作方式:连续转换,单次转换。4 5、启动转换:ADSC写1;判断结束:ADIF置位。4 6、量化误差:+-0 .5 LSB;LSB定义:参考电压分为1 0 2 4份的最小份数。4 7、右对齐取1 0位转换结果,左对齐取高8位转换结果。4 8、涉及寄存器外部中断:MCU控制寄存器-MCUCR通用中断控制寄存器-GICR通用中断标志寄存器-GIFRTC0:控制寄存器-TCCR0数据寄存器-TCNT0中断屏蔽寄存器-TIMSK中断标志寄存器-TIFRTC1:看上1 9SPI:控制寄存器-SPCR数据寄存器-SPD
12、R状态寄存器-SPSRUSART:数据寄存器-UCR控制与状态寄存器A/B/C-UCSRA/B/C波特率寄存器-UBRRL/HTWI:比特率寄存器-TWBR控制寄存器-TWCR状态寄存器-TWSR数据寄存器-TWDR(从机)地址寄存器-TWARADC:多路选择寄存器-ADMUX控制与状态寄存器A-ADCSRA数据寄存器-ADCL/H作业一:频率为8 MHZ,仅EDA,不能应用于硬件。#include #include unsigned char m2 0 ,sec,mode,mode0 ,i,j,k=0 ;unsigned char ledcode1 0 =0 X0 3 ,0 X9 F,0 X
13、2 5 ,0 X0 D,0 X9 9 ,0 X4 9 ,0 X4 1 ,0 X1 F,0 X0 1 ,0 X0 9 ;/ External Interrupt 0 service routineinterrupt EXT_INT0 void ext_int0 _isr(void) mode+;if(mode=3 ) mode=0 ;interrupt EXT_INT1 void ext_int1 _isr(void) mode0 +;k=1 ;if(mode0 =3 ) mode0 =0 ;interrupt TIM0 _OVF void timer0 _ovf_isr(void)TCNT0
14、=0 x6 4 ;m2 0 +;if(m2 0 =5 0 )sec+;m2 0 =0 ;void tc0 () m2 0 =0 ;sec=0 ;TCCR0 =(1 #include unsigned char ledcode1 0 =0 X0 3 ,0 X9 F,0 X2 5 ,0 X0 D,0 X9 9 ,0 X4 9 ,0 X4 1 ,0 X1 F,0 X0 1 ,0 X0 9 ;/ Declareyour global variables hereunsigned int d,m=0 ,a,b;/ External Interrupt 0 service routineinterrupt
15、 EXT_INT0 void ext_int0 _isr(void)b+=1 5 ;a+=3 0 ;d=a;UDR=b;interrupt USART_RXC void usart_rx_isr(void)d=UDR;/ External Interrupt 1 service routineinterrupt EXT_INT1 void ext_int1 _isr(void)b-=1 0 ;a-=2 0 ;d=a;TWCR=(0 void main(void)unsigned char i=0 ,j;/ Declare your local variables here/ Input/Out
16、put Ports initialization/ Port B initialization/ Function: Bit7 =In Bit6 =In Bit5 =Out Bit4 =In Bit3 =Out Bit2 =Out Bit1 =Out Bit0 =InDDRB=(0 #include #define ADC_VREF_TYPE (1 j)PORTB.5 =1 ;for(j=0 ;jj)PORTB.5 =1 ;for(j=0 ;jj)PORTB.5 =1 ;void disp(int d) /SPI显示函数i=d;j=i%1 0 0 ;SPDR=ledcodej%1 0 ;whi
17、le(!(SPSRif(sec=6 4 )sec=0 ;k=0 ;TCCR0 =(0 CS0 2 ) | (0 CS0 1 ) | (0 CS0 0 );PORTB.0 =1 ;PORTB.1 =1 ;PORTB.2 =1 ;PORTB.4 =1 ;PORTC.0 =1 ;PORTC.1 =1 ;void ADC() /模数转换功能函数SPCR=(0 SPIE) | (1 SPE) | (1 DORD) | (1 MSTR) | (0 CPOL) | (0 CPHA) | (1 SPR1 ) |(0 SPR0 );SPSR=(0 SPI2 X);ADCSRA|=(1 ADSC);while (
18、mode0 =2 )if(ADCSRAadc_no+;if(adc_no=5 0 )adc_sum=adc_sum/5 0 ;adc_v=adc_sum;adc_v=adc_v*2 5 6 /1 0 2 4 ;adc_sum=adc_v;adc_td=adc_sum%1 0 0 ;SPDR=ledcodeadc_td%1 0 ;while(!(SPSRSPDR=ledcodeadc_td/1 0 ;while(!(SPSRSPDR=ledcodeadc_sum/1 0 0 -1 ;while(!(SPSRadc_no=0 ;adc_sum=0 ;ADCSRA|=(1 ADIF);delay_m
19、s(5 );SPCR=(0 SPIE) | (0 SPE) | (0 DORD) | (0 MSTR) | (0 CPOL) | (0 CPHA) | (0 SPR1 ) |(0 SPR0 );void hall() /霍尔传感器功能函数SPCR=(0 SPIE) | (1 SPE) | (1 DORD) | (1 MSTR) | (0 CPOL) | (0 CPHA) | (1 SPR1 ) |(0 SPR0 );SPSR=(0 SPI2 X);TCCR0 =(1 CS0 2 ) | (1 CS0 1 ) | (1 CS0 0 );TIMSK|=(1 TOIE0 );TCNT0 =0 ;wh
20、ile(mode0 =3 )disp(TCNT0 ); /使用TCNT0计数,未用中断delay_ms(3 0 0 );TCCR0 =(0 CS0 2 ) | (0 CS0 1 ) | (0 CS0 0 );SPCR=(0 SPIE) | (0 SPE) | (0 DORD) | (0 MSTR) | (0 CPOL) | (0 CPHA) | (0 SPR1 ) |(0 SPR0 );void delayus(unsigned int x) /自建delay函数unsigned char i,j;j=x/5 ;for(i=0 ;ij;i+)#asm(“nopnopnopnopnop“)voi
21、d playmusic() /音乐播放函数unsigned int i=0 ;unsigned int f; unsigned char j;PORTB=PORTC=0 xff;while(mode0 =4 )if(mui=8 8 ) i=0 ; delay_ms(3 0 0 0 ); if(mui=0 ) PORTD.6 =0 ; delay_ms(4 0 0 *mui+1 ); i+=2 ;TCCR0 =(1 CS0 2 ) | (0 CS0 1 ) | (1 CS0 0 );f=FODmui%1 0 ;for(j=1 ;jmui/1 0 ;j+) f*=2 ; /频率f=5 0 0 0
22、0 /f*1 0 ; /半周期for(m2 0 =0 ;m2 0 4 0 0 /2 0 *mui+1 ;)PORTD.6 =1 ; delayus(f);PORTD.6 =0 ; delayus(f);if(mode0 !=4 ) break;TCCR0 =(0 CS0 2 ) | (0 CS0 1 ) | (0 CS0 0 );i+=2 ;void US_CB() /USRAT信号传输函数SPCR=(0 SPIE) | (1 SPE) | (1 DORD) | (1 MSTR) | (0 CPOL) | (0 CPHA) | (1 SPR1 ) |(0 SPR0 );SPSR=(0 SPI2
23、 X);ur=1 ;while (mode0 =5 )if(ur=1 )disp(d);ur=0 ;SPCR=(0 SPIE) | (0 SPE) | (0 DORD) | (0 MSTR) | (0 CPOL) | (0 CPHA) | (0 SPR1 ) |(0 SPR0 );void TWI_CB() /TWI信号传输函数SPCR=(0 SPIE) | (1 SPE) | (1 DORD) | (1 MSTR) | (0 CPOL) | (0 CPHA) | (1 SPR1 ) |(0 SPR0 );SPSR=(0 SPI2 X);ur=1 ;while (mode0 =6 )if(ur
24、=1 )disp(d);ur=0 ;SPCR=(0 SPIE) | (0 SPE) | (0 DORD) | (0 MSTR) | (0 CPOL) | (0 CPHA) | (0 SPR1 ) |(0 SPR0 );void main(void)/ Input/Output Ports initialization/ Port B initialization/ Function: Bit7 =In Bit6 =In Bit5 =Out Bit4 =Out Bit3 =Out Bit2 =Out Bit1 =Out Bit0 =OutDDRB=(0 DDB7 ) | (0 DDB6 ) |
25、(1 DDB5 ) | (1 DDB4 ) | (1 DDB3 ) | (1 DDB2 ) | (1 DDB1 )| (1 DDB0 );/ State: Bit7 =T Bit6 =T Bit5 =T Bit4 =0 Bit3 =T Bit2 =0 Bit1 =0 Bit0 =0PORTB=(0 PORTB7 ) | (0 PORTB6 ) | (0 PORTB5 ) | (0 PORTB4 ) | (0 PORTB3 ) |(0 PORTB2 ) | (0 PORTB1 ) | (0 PORTB0 );/ Port C initialization/ Function: Bit6 =In
26、Bit5 =In Bit4 =In Bit3 =In Bit2 =In Bit1 =Out Bit0 =OutDDRC=(0 DDC6 ) | (0 DDC5 ) | (0 DDC4 ) | (0 DDC3 ) | (0 DDC2 ) | (1 DDC1 ) | (1 DDC0 );/ State: Bit6 =T Bit5 =T Bit4 =T Bit3 =T Bit2 =T Bit1 =0 Bit0 =0PORTC=(0 PORTC6 ) | (0 PORTC5 ) | (0 PORTC4 ) | (0 PORTC3 ) | (0 PORTC2 ) | (0 PORTC1 )| (0 PO
27、RTC0 );/ Port D initialization/ Function: Bit7 =In Bit6 =Out Bit5 =In Bit4 =In Bit3 =In Bit2 =In Bit1 =In Bit0 =InDDRD=(0 DDD7 ) | (1 DDD6 ) | (0 DDD5 ) | (0 DDD4 ) | (0 DDD3 ) | (0 DDD2 ) | (0 DDD1 )| (0 DDD0 );/ State: Bit7 =T Bit6 =T Bit5 =T Bit4 =T Bit3 =T Bit2 =T Bit1 =T Bit0 =TPORTD=(0 PORTD7
28、) | (0 PORTD6 ) | (0 PORTD5 ) | (0 PORTD4 ) | (0 PORTD3 ) |(0 PORTD2 ) | (0 PORTD1 ) | (0 PORTD0 );/ Timer/Counter 0 initialization/ Clock source: System Clock/ Clock value: 7 .8 1 3 kHzTCNT0 =0 x1 6 ;/ Timer/Counter 1 initialization/ Clock source: System Clock/ Clock value: Timer1 Stopped/ Mode: No
29、rmal top=0 xFFFF/ OC1 A output: Disconnected/ OC1 B output: Disconnected/ Noise Canceler: Off/ Input Capture on Falling Edge/ Timer1 Overflow Interrupt: Off/ Input Capture Interrupt: Off/ Compare A Match Interrupt: Off/ Compare B Match Interrupt: OffTCCR1 A=(0 COM1 A1 ) | (0 COM1 A0 ) | (0 COM1 B1 )
30、 | (0 COM1 B0 ) | (0 WGM1 1 ) |(0 WGM1 0 );TCCR1 B=(0 ICNC1 ) | (0 ICES1 ) | (0 WGM1 3 ) | (0 WGM1 2 ) | (0 CS1 2 ) | (0 CS1 1 ) |(0 CS1 0 );TCNT1 H=0 x0 0 ;TCNT1 L=0 x0 0 ;ICR1 H=0 x0 0 ;ICR1 L=0 x0 0 ;OCR1 AH=0 x0 0 ;OCR1 AL=0 x0 0 ;OCR1 BH=0 x0 0 ;OCR1 BL=0 x0 0 ;/ Timer/Counter 2 initialization/
31、 Clock source: System Clock/ Clock value: Timer2 Stopped/ Mode: Normal top=0 xFF/ OC2 output: DisconnectedASSR=0 AS2 ;TCCR2 =(0 PWM2 ) | (0 COM2 1 ) | (0 COM2 0 ) | (0 CTC2 ) | (0 CS2 2 ) | (0 CS2 1 ) |(0 CS2 0 );TCNT2 =0 x0 0 ;OCR2 =0 x0 0 ;/ Timer(s)/Counter(s) Interrupt(s) initializationTIMSK=(0
32、OCIE2 ) | (0 TOIE2 ) | (0 TICIE1 ) | (0 OCIE1 A) | (0 OCIE1 B) | (0 TOIE1 ) |(1 TOIE0 );/ External Interrupt(s) initialization/ INT0 : On/ INT0 Mode: Falling Edge/ INT1 : On/ INT1 Mode: Falling EdgeGICR|=(1 INT1 ) | (1 INT0 );MCUCR=(1 ISC1 1 ) | (0 ISC1 0 ) | (1 ISC0 1 ) | (0 ISC0 0 );GIFR=(1 INTF1
33、) | (1 INTF0 );/ USART initialization/ USART disabledUCSRA=(0 RXC) | (0 TXC) | (0 UDRE) | (0 FE) | (0 DOR) | (0 UPE) | (0 U2 X) |(0 MPCM);UCSRB=(1 RXCIE) | (0 TXCIE) | (0 UDRIE) | (1 RXEN) | (1 TXEN) | (0 UCSZ2 ) |(0 RXB8 ) | (0 TXB8 );UCSRC=(1 URSEL) | (0 UMSEL) | (0 UPM1 ) | (0 UPM0 ) | (0 USBS) |
34、 (1 UCSZ1 ) |(1 UCSZ0 ) | (0 UCPOL);UBRRH=0 x0 0 ;UBRRL=0 x3 3 ;/ Analog Comparator initialization/ Analog Comparator: Off/ The Analog Comparators positive input is/ connected to the AIN0 pin/ The Analog Comparators negative input is/ connected to the AIN1 pinACSR=(1 ACD) | (0 ACBG) | (0 ACO) | (0 A
35、CI) | (0 ACIE) | (0 ACIC) | (0 ACIS1 ) |(0 ACIS0 );SFIOR=(0 ACME);/ ADC initialization/ ADC disabledADMUX = adc_input | ADC_VREF_TYPE;ADCSRA=(1 ADEN) | (0 ADSC) | (1 ADFR) | (0 ADIF) | (0 ADIE) | (1 ADPS2 ) |(1 ADPS1 ) | (0 ADPS0 );SFIOR=(0 ACME);/ SPI initialization/ SPI disabledSPCR=(0 SPIE) | (0
36、SPE) | (0 DORD) | (0 MSTR) | (0 CPOL) | (0 CPHA) | (0 SPR1 ) |(0 SPR0 );/ TWI initialization/ TWI disabledTWCR=(0 TWEA) | (0 TWSTA) | (0 TWSTO) | (0 TWEN) | (0 TWIE);TWBR=7 2 ;TWSR=0 ;TWAR=0 X0 4 ;TWCR=(1 TWEA)|(1 TWEN)|(1 TWIE);/ Global enable interrupts#asm(“sei“)sound();while (1 )mode1 =0 ;adc_input=2 ;if(mode0 =6 )TWI_CB();if(mode0 =5 )US_CB();if(mode0 =4 )playmusic();if(mode0 =3 )hall();if(mode0 =2 )ADC();if(mode0 =1 )counter();if(mode0 =0 )traffic_light();