AVRmega16基本程序文件Word文件下载.docx

上传人:b****2 文档编号:3658573 上传时间:2023-05-02 格式:DOCX 页数:42 大小:23.96KB
下载 相关 举报
AVRmega16基本程序文件Word文件下载.docx_第1页
第1页 / 共42页
AVRmega16基本程序文件Word文件下载.docx_第2页
第2页 / 共42页
AVRmega16基本程序文件Word文件下载.docx_第3页
第3页 / 共42页
AVRmega16基本程序文件Word文件下载.docx_第4页
第4页 / 共42页
AVRmega16基本程序文件Word文件下载.docx_第5页
第5页 / 共42页
AVRmega16基本程序文件Word文件下载.docx_第6页
第6页 / 共42页
AVRmega16基本程序文件Word文件下载.docx_第7页
第7页 / 共42页
AVRmega16基本程序文件Word文件下载.docx_第8页
第8页 / 共42页
AVRmega16基本程序文件Word文件下载.docx_第9页
第9页 / 共42页
AVRmega16基本程序文件Word文件下载.docx_第10页
第10页 / 共42页
AVRmega16基本程序文件Word文件下载.docx_第11页
第11页 / 共42页
AVRmega16基本程序文件Word文件下载.docx_第12页
第12页 / 共42页
AVRmega16基本程序文件Word文件下载.docx_第13页
第13页 / 共42页
AVRmega16基本程序文件Word文件下载.docx_第14页
第14页 / 共42页
AVRmega16基本程序文件Word文件下载.docx_第15页
第15页 / 共42页
AVRmega16基本程序文件Word文件下载.docx_第16页
第16页 / 共42页
AVRmega16基本程序文件Word文件下载.docx_第17页
第17页 / 共42页
AVRmega16基本程序文件Word文件下载.docx_第18页
第18页 / 共42页
AVRmega16基本程序文件Word文件下载.docx_第19页
第19页 / 共42页
AVRmega16基本程序文件Word文件下载.docx_第20页
第20页 / 共42页
亲,该文档总共42页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

AVRmega16基本程序文件Word文件下载.docx

《AVRmega16基本程序文件Word文件下载.docx》由会员分享,可在线阅读,更多相关《AVRmega16基本程序文件Word文件下载.docx(42页珍藏版)》请在冰点文库上搜索。

AVRmega16基本程序文件Word文件下载.docx

voiddelayms(intms)

{

inti,j;

for(i=ms;

i>

0;

i--)

for(j=1722;

j>

j--);

//8M时改为1141;

}//12M时为1722;

}

/*******************************************************************

us延時子程序

延時指定的us

********************************************************************/

voiddelayus(ucharus)

for(us;

us<

us--);

}//12M时单位T为1.45US

单参数LED显示

硬件连接:

数据PORTC-----D7~D0

段选PORTD-----D7~D4

*********************************************************************/

voidLEDShow(longintshownum)

{

uchari,tmp,curnum;

longinttmpnum;

tmp=0xfb;

tmpnum=shownum;

for(i=0;

i<

6;

i++)//显示的位数为5

{

curnum=tmpnum%10;

tmpnum=tmpnum/10;

PORTD=tmp;

PORTC=date[curnum];

delayus

(1);

tmp=(tmp<

<

1)+0x01;

//补上移位造成的最右位为0;

}

}

/*******************************************************

七段LED共陽數碼管,在指定数位上显示指定的数,双参数

在指定的位置上顯示制定的數;

硬件連接:

PC口複用控制段選和位選,有2片573進行數據鎖存;

*******************************************************/

voidshow(uchardat,ucharnum)//六位七段數碼管顯示程序OK;

PORTC=date[dat];

PORTD|=BIT(0);

PORTD&

=~BIT(0);

//送數據;

delayus

(2);

PORTC=0X00;

delayus

(1);

PORTC=duan[num];

PORTD|=BIT

(1);

=~BIT

(1);

}//送選通信號;

/************************************************************

MCU端口初始化

設置MCU端口初始方向為輸出初始狀態為低

*************************************************************/

voidGpioinit0()

DDRA=0XFF;

PORTA=0X00;

DDRB=0XFF;

PORTB=0X00;

DDRC=0XFF;

DDRD=0XFF;

PORTD=0X00;

}

/***********************************************************

設置MCU端口初始為輸出初始狀態為高

************************************************************/

voidGpioinit1()

DDRA=0Xff;

PORTA=0XFF;

DDRB=0xff;

PORTB=0XFF;

DDRC=0xff;

PORTC=0XFF;

DDRD=0xff;

PORTD=0XFF;

/**************************************************

單端口測試

輸入:

測試PC的任意端口號0~7

週期改變一個端口的電平

**************************************************/

voidIOtest(ucharnum)

DDRC|=BIT(num);

//while

(1)

//{

PORTC|=BIT(num);

delayms(50);

PORTC&

=~BIT(num);

//}

/*************************************************

按鍵動作檢測子程序。

檢測4*4鍵盤是否有鍵按下;

PB0~PB3為行;

PB4~pb7為列;

*************************************************/

ucharkey_press()

ucharkey;

PORTB=0X0F;

DDRB=0XF0;

delayms

(2);

//此處要加上適當延時否則讀不到端口信息;

key=PINB;

key&

=0x0f;

//按下返回1,否則為0;

if(key==0x0f)

return0;

else

return1;

/***************************************************

名稱:

4*4矩陣按鍵掃描子程序

功能:

掃描一個4*4矩陣案件,比返回相應按鍵值;

硬件連接:

***************************************************/

ucharkeyscan()//4*4鍵盤掃面程序,調試0K;

ucharkeycode,keynum;

do{

}while(key_press()==0);

//按鍵是否按下?

asm("

nop"

);

while(key_press()==1)

DDRB=0XFF;

//PB0~PB3為列,PB4~PB7為行;

PORTB=0X0F;

//列輸出高電平,行輸出低電平;

DDRB=0XF0;

delayus(10);

//延時2毫秒,讀列狀態;

keycode=PINB;

keycode&

//讀列狀態,屏蔽行狀態;

PORTB=0XF0;

DDRB=0X0F;

PINB&

=0Xf0;

//讀行狀態,屏蔽列狀態;

keycode|=PINB;

}while(key_press()==1);

//按鍵是否釋放;

switch(keycode)

{

case0xee:

keynum=0;

break;

case0xde:

keynum=1;

case0xbe:

keynum=2;

case0x7e:

keynum=3;

case0xed:

keynum=4;

case0xdd:

keynum=5;

case0xbd:

keynum=6;

case0x7d:

keynum=7;

case0xeb:

keynum=8;

case0xdb:

keynum=9;

case0xbb:

keynum=10;

case0x7b:

keynum=11;

case0xe7:

keynum=12;

case0xd7:

keynum=13;

case0xb7:

keynum=14;

case0x77:

keynum=15;

default:

keynum=16;

break;

}

}

returnkeynum;

 

六位密碼輸入比對程序

輸入六位數並與存儲密碼比對,0K返回1,按錯或者順序錯返回0;

原始密碼654321

**************************************************************/

ucharsecurtcom()//6位密碼輸入比對程序0K;

ucharkeycount=0;

while(key_press()==1);

delayms(3);

do{

delayms

(1);

while(key_press()==0);

show(8,keycount);

securbuf[keycount++]=keyscan();

}while(keycount<

6);

if(securbuf[0]==6)//初始比對,密碼654321;

if(securbuf[1]==5)

{

if(securbuf[2]==4)

{

if(securbuf[3]==3)

{

if(securbuf[4]==2)

{

if(securbuf[5]==1);

}

}

}

}

return1;

//密碼正確,返回1;

else

return0;

//密碼錯誤,返回0;

ucharserset()//密碼設定子程序;

ucharspeci_keypress(ucharpresstimes)//特殊按鍵F按下某一設定次數OK;

ucharkey_longpress(ucharprst)//按鍵長按子程序

}

直流蜂鳴器控制

控制蜂鳴器鳴響時間

PD5輸出控制信號

voiddcbeep(ucharbeeptime)//直流蜂鳴器,調試OK;

{ucharbeep;

DDRD|=BIT(5);

=~BIT(5);

PORTD|=BIT(5);

delayus(beeptime);

delayus(100-beeptime);

/**********************************************************

直流電機全橋控制

fbw=1.正轉;

fbw=0,反轉;

PD6與PD7口組合輸出控制信號;

**********************************************************/

voidmoto(ucharfbw)//直流電機正反轉程序,驅動全橋;

DDRD|=BIT(6);

DDRD|=BIT(7);

=~BIT(6);

=~BIT(7);

delayms(5);

if(fbw==1)

PORTD|=BIT(6);

delayms(500);

PORTD&

delayms(20);

if(fbw==0)

PORTD|=BIT(7);

}

/*********************************************************

AD單次轉換子程序;

採樣AD通路0的電壓,該函數輸出為AD轉換後的數據,

查詢工作方式

*********************************************************/

voidad_init()

ADMUX=0XC0;

//設置AD輸入通道為0通道,內部2.56V參考電壓;

ADCSRA=0X80;

//使能ADC,清中斷標誌ADIF,查詢方式;

DDRA&

//設置PA0口為輸入;

PORTA&

//PA0口清零;

intad_conv()//單次轉換子程序,OK;

intaddata;

ADCSRA|=BIT(ADSC);

//啟動一次轉換;

while(!

(ADCSRA&

(BIT(ADIF))));

//查詢等待轉換結束標誌置位;

ADCSRA&

=~BIT(ADIF);

addata=ADCL;

addata=addata+ADCH*256;

returnaddata;

intad_aver()//轉換8次,做平均值濾波

intadaver,count;

for(count=7;

count>

count--)

adaver=ad_conv();

adaver+=adaver;

delayms

(1);

adaver=adaver/8;

delayms

(1);

returnadaver;

AD採樣

採樣AD0的電壓,內部2.56V參考電壓,中斷工作方式

**********************************************************/

voidad0_init()

ADMUX=0xc0;

adchannel=0;

ADCSRA=0x98;

SEI();

#pragmainterrupt_handlerprocess:

15//interruptprocessprogram

voidprocess()

{

intadcode=0;

=~BIT(ADIE);

adcode=ADCL;

adcode=(ADCH<

8)+adcode;

//getadcvalue

/************************

中斷處理函數

*************************/

ADCSRA|=BIT(ADIE);

/********************************************************

DAC0832DA轉換

有效分度0~255

輸出:

對8為數字信號進行DA轉換,實際應用需調試

********************************************************/

#definecs_lowPORTD&

=~BIT(0)

#definecs_highPORTD|=BIT(0)

#definewr1_lowPORTD&

=~BIT

(1)

#definewr1_highPORTD|=BIT

(1)

#defineile_highPORTD|=BIT

(2)

#defineile_lowPORTD&

=~BIT

(2)

#definewr2_lowPORTD&

=~BIT(3)

#definewr2_highPORTD|=BIT(3)

#definexfer_lowPORTD&

=~BIT(5)

#definexfer_highPORTD|=BIT(5)

voiddac(intdadata)

Gpioinit1();

ile_high;

//delayus

(1);

cs_low;

wr1_low;

PORTC=dadata;

wr1_high;

cs_high;

//delayus

(1);

wr2_low;

xfer_low;

xfer_high;

/*****************************************************

數據拆分顯示函數

將四位數據分別顯示到對應的數碼管。

*****************************************************/

voidaddisplay(intaddat)//轉換數據顯示,運算OK;

inta;

a=addat;

show(a/1000,3);

delayms

(2);

show((a/100)%10,2);

show(((a/10)%10)/10,1);

show(a%10,0);

SPI通信

應用mega16自身SPI通信模塊與外設進行通信.查詢方式;

***********************************************************/

voidSPI_masterinit()

DDRB|=BIT(5)|BIT(7);

//設置MOSI與SCK為輸出

DDRB&

=~(BIT(4)&

BIT(6));

//設置MISO與SS為輸入

SPCR|=BIT(4)|BIT(3)|BIT

(1)|BIT(0);

//數據高位先發送,主機模式,空閒時鐘極性

//為高,SCK起始沿採樣數據,128分頻

SPCR|=BIT(6);

//使能SPI

voidSPI_mastertransdata(uchardata)

SPDR=data;

while(!

(SPSR&

BIT(7)));

voidSPI_slaveinit()

voidSPI_slaverecive()

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2