AVR單片機(jī)如何學(xué)?ATMEGA16的定時(shí)/計(jì)數(shù)器的學(xué)習(xí)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
四、ATMEGA16的定時(shí)/計(jì)數(shù)器
四—(03)、PWM測(cè)試實(shí)驗(yàn)
手控PWM測(cè)試實(shí)驗(yàn)
定時(shí)器T2通過比較寄存器OCR2后從OC2腳(PD7)輸出PWM信號(hào),從000~255共分256級(jí),對(duì)應(yīng)的輸出電壓為0.00~5.00V
下面是圖片~原理以前早就說過了~~不再贅述~~
然后就是程序:
不過從現(xiàn)在開始使用模塊化變成了~~你懂得,為的就是用起來方便~~
這里是主函數(shù):
//------------------------------------------------------------------------------
//手控PWM測(cè)試實(shí)驗(yàn)
//定時(shí)器T2通過比較寄存器OCR2后從OC2腳(PD7)輸出PWM信號(hào),從000~255共分256級(jí),對(duì)應(yīng)的輸出電壓為0.00~5.00V
#include"ioavr.h"
#include"intrinsics.h"
#include"lcdinit.h"
#include"delayics.h"
#include"bitics.h"
//------------------------------------------------------------------------------
uchar __flash title[]={"PWM Test"};
uchar __flash test[]={" OCR2:0000.00V"};
uchar wide;
//------------------------------------------------------------------------------
//端口初始化函數(shù)
void port_init()
{
DDRA=0XFF;
PORTA=0X00;
DDRB=0XFF;
PORTB=0X00;
DDRD=0X80;
__no_operation();
PORTD=0X70;
}
//------------------------------------------------------------------------------
//定時(shí)器2初始化函數(shù)
voidtimer2_init()
{
TCNT2=0X01;//TCNT2的初值為0X01
OCR2=0XFF;//輸出比較寄存器初值為0XFF
TCCR2=0X61;//T2工作在相位修正PWM模式,沒有預(yù)分頻
}
//------------------------------------------------------------------------------
//芯片初始化函數(shù)
void device_init()
{
port_init();
timer2_init();
TIMSK=0X00;
}
//------------------------------------------------------------------------------
//按鍵S1檢測(cè)函數(shù)
voids1_scan()
{
if(GET_BIT(PIND,4)==0)
{
delay_ms(2);
{
if(GET_BIT(PIND,4)==0)
{
if(wide<255)
wide++;
//delay_ms(50);
while(!GET_BIT(PIND,4));//等待松手?。?!
}
}
}
}
//------------------------------------------------------------------------------
//按鍵S2檢測(cè)函數(shù)
voids2_scan()
{
if(GET_BIT(PIND,5)==0)
{
delay_ms(2);
if(GET_BIT(PIND,5)==0)
{
if(wide>0)
wide--;
//delay_ms(50);
while(!GET_BIT(PIND,5));//等待松手~~~~
}
}
}
//------------------------------------------------------------------------------
//main
voidmain()
{
uint voltage;
device_init();
//delay_ms(40);
lcd_init();
lcd_display_chars(0x80,title,8);
lcd_display_chars(0x80+0x40,test,16);
while(1)
{
s1_scan();
s2_scan();
lcd_display_onechar(0x80+0x40+6,(wide/100)+0x30);
lcd_display_onechar(0x80+0x40+7,(wide0/10)+0x30);
lcd_display_onechar(0x80+0x40+8,(wide)+0x30);
OCR2=wide;
voltage=(uint)wide;
voltage=(voltage*196)/100;
lcd_display_onechar(0x80+0x40+11,(voltage/100)+0x30);
lcd_display_onechar(0x80+0x40+13,(voltage0/10)+0x30);
lcd_display_onechar(0x80+0x40+14,(voltage)+0x30);
}
}
LCD初始化函數(shù):以后就一直用這個(gè)了:記?。海ㄎ乙彩腔藭r(shí)間正好的~~當(dāng)時(shí)電腦還特別不給力,真他媽的想換了~~擦,不過又讓我給修復(fù)好了~~爽歪歪?。?/p>
//------------------------------------------------------------------------------
//LCD1602的初始化程序—可調(diào)用函數(shù)
#include"ioavr.h"
#include"intrinsics.h"
#include"delayics.h"
#include"bitics.h"
//------------------------------------------------------------------------------
typedef unsigned char uchar;
typedef unsigned intuint;
//------------------------------------------------------------------------------
//RS、RW、EN引腳輸出高低電平的宏定義
#define lcd_rs_1SET_BIT(PORTB,0)
#define lcd_rs_0CLR_BIT(PORTB,0)
#define lcd_rw_1SET_BIT(PORTB,1)
#define lcd_rw_0CLR_BIT(PORTB,1)
#define lcd_en_1SET_BIT(PORTB,2)
#define lcd_en_0CLR_BIT(PORTB,2)
//------------------------------------------------------------------------------
#define data_port PORTA
#define busy0x80
//------------------------------------------------------------------------------
//LCD寫數(shù)據(jù)函數(shù)
void lcd_write_data(uchar dat)
{
lcd_rs_1;
lcd_rw_0;
data_port=dat;
delay_ms(1);
lcd_en_1;
delay_ms(1);
lcd_en_0;
}
//------------------------------------------------------------------------------
//LCD寫指令函數(shù)
voidlcd_write_command(uchar com)
{
lcd_rs_0;
lcd_rw_0;
data_port=com;
delay_ms(1);
lcd_en_1;
delay_ms(1);
lcd_en_0;
}
//------------------------------------------------------------------------------
//LCD初始化函數(shù)
void lcd_init()
{
lcd_write_command(0x01);
delay_ms(1);
lcd_write_command(0x38);
delay_ms(1);
lcd_write_command(0x0c);
delay_ms(1);
lcd_write_command(0x06);
delay_ms(1);
}
//------------------------------------------------------------------------------
//LCD顯示一個(gè)字節(jié)函數(shù)
voidlcd_display_onechar(uchar add,uchar dat)
{
lcd_write_command(add);
delay_ms(1);
lcd_write_data(dat);
delay_ms(1);
}
//------------------------------------------------------------------------------
//LCD顯示多個(gè)字節(jié)函數(shù)
voidlcd_display_chars(uchar add,uchar __flash *s,uchar num)
{
uchar i;
lcd_write_command(add);
for(i=0;i
#ifndef __lcdinit_h
#define __lcdinit_h
typedef unsigned char uchar;
typedef unsigned intuint;
//------------------------------------------------------------------------------
externvoidlcd_write_data(uchar dat);//LCD寫數(shù)據(jù)函數(shù)
externvoidlcd_write_command(uchar com);//LCD寫指令函數(shù)
externvoidlcd_init();//LCD初始化函數(shù)
externvoidlcd_display_onechar(uchar add,uchar dat);//LCD顯示一個(gè)字節(jié)函數(shù)
voidlcd_display_chars(uchar add,uchar __flash *s,uchar num);//LCD顯示多個(gè)字節(jié)函數(shù)
#endif
然后貼張圖片~~看看我都用到了哪些程序模塊~~