AVRmega16基本程序.docx
- 文档编号:10751186
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:42
- 大小:23.95KB
AVRmega16基本程序.docx
《AVRmega16基本程序.docx》由会员分享,可在线阅读,更多相关《AVRmega16基本程序.docx(42页珍藏版)》请在冰豆网上搜索。
AVRmega16基本程序
/*********************************************************************
MCU:
ATmega16
外部晶振:
8MHz
程序功能:
4*4鍵盤識別,LED七段數碼管顯示,密碼功能模塊,直流電機正反轉控制
AD轉換模塊,模擬比較器,外部中斷應用,12864液晶,C/T0
硬件設計:
參考PROTUES硬件仿真電路
調試:
所有程序主要功能都軟硬件仿真通過,實際使用時要根據需要加入可靠性。
編譯環境:
ICCAVR
Designby:
wdw
********************************************************************/
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineSET_1(a,b)a|=bit(b)//將寄存器a的第b位置1
#defineCLR_0(a,b)a&=~bit(b)//將寄存器a的第b位清0
#programdatecode:
constdate[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,//共陽數據;
0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
#programduancode:
constduan[]={0x20,0x10,0x08,0x04,0x02,0x01};//段選;
charadchannel;
intdispbuf[]={0,0,0,0,0,0,};//顯示緩存;
ucharsecurbuf[]={0,0,0,0,0,};//5位密碼緩存;
/********************************************************************
名稱:
ms延時子函數
功能:
延時指定的ms
*********************************************************************/
voiddelayms(intms)
{
inti,j;
for(i=ms;i>0;i--)
{
for(j=1722;j>0;j--);//8M时改为1141;
}//12M时为1722;
}
/*******************************************************************
名稱:
us延時子程序
功能:
延時指定的us
********************************************************************/
voiddelayus(ucharus)
{
for(us;us<0;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);
delayus
(2);
PORTD&=~BIT
(1);
delayus
(2);
}//送選通信號;
/************************************************************
名稱:
MCU端口初始化
功能:
設置MCU端口初始方向為輸出初始狀態為低
*************************************************************/
voidGpioinit0()
{
DDRA=0XFF;
PORTA=0X00;
DDRB=0XFF;
PORTB=0X00;
DDRC=0XFF;
PORTC=0X00;
DDRD=0XFF;
PORTD=0X00;
}
/***********************************************************
名稱:
MCU端口初始化
功能:
設置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);
delayms(50);
//}
}
/*************************************************
名稱:
按鍵動作檢測子程序。
功能:
檢測4*4鍵盤是否有鍵按下;
硬件連接:
PB0~PB3為行;PB4~pb7為列;
*************************************************/
ucharkey_press()
{
ucharkey;
DDRB=0XFF;
PORTB=0X0F;
DDRB=0XF0;
delayms
(2);//此處要加上適當延時否則讀不到端口信息;
key=PINB;
key&=0x0f;//按下返回1,否則為0;
if(key==0x0f)
{
return0;
}
else
return1;
}
/***************************************************
名稱:
4*4矩陣按鍵掃描子程序
功能:
掃描一個4*4矩陣案件,比返回相應按鍵值;
硬件連接:
PB0~PB3為行;PB4~pb7為列;
***************************************************/
ucharkeyscan()//4*4鍵盤掃面程序,調試0K;
{
ucharkeycode,keynum;
do{
}while(key_press()==0);//按鍵是否按下?
asm("nop");
asm("nop");
while(key_press()==1)
{
DDRB=0XFF;//PB0~PB3為列,PB4~PB7為行;
PORTB=0X0F;//列輸出高電平,行輸出低電平;
DDRB=0XF0;
delayus(10);//延時2毫秒,讀列狀態;
keycode=PINB;
keycode&=0x0f;//讀列狀態,屏蔽行狀態;
DDRB=0XFF;
PORTB=0XF0;
DDRB=0X0F;
delayus(10);
PINB&=0Xf0;//讀行狀態,屏蔽列狀態;
keycode|=PINB;
delayus(10);
do{
}while(key_press()==1);//按鍵是否釋放;
switch(keycode)
{
case0xee:
keynum=0;
break;
case0xde:
keynum=1;
break;
case0xbe:
keynum=2;
break;
case0x7e:
keynum=3;
break;
case0xed:
keynum=4;
break;
case0xdd:
keynum=5;
break;
case0xbd:
keynum=6;
break;
case0x7d:
keynum=7;
break;
case0xeb:
keynum=8;
break;
case0xdb:
keynum=9;
break;
case0xbb:
keynum=10;
break;
case0x7b:
keynum=11;
break;
case0xe7:
keynum=12;
break;
case0xd7:
keynum=13;
break;
case0xb7:
keynum=14;
break;
case0x77:
keynum=15;
break;
default:
keynum=16;
break;
}
}
returnkeynum;
}
/************************************************************
名稱:
六位密碼輸入比對程序
功能:
輸入六位數並與存儲密碼比對,0K返回1,按錯或者順序錯返回0;
原始密碼654321
**************************************************************/
ucharsecurtcom()//6位密碼輸入比對程序0K;
{
ucharkeycount=0;
while(key_press()==1);
delayms(3);
do{
while(key_press()==1);
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);
PORTD&=~BIT(5);
PORTD|=BIT(5);
delayus(beeptime);
PORTD&=~BIT(5);
delayus(100-beeptime);
}
/**********************************************************
名稱:
直流電機全橋控制
功能:
fbw=1.正轉;fbw=0,反轉;
硬件連接:
PD6與PD7口組合輸出控制信號;
**********************************************************/
voidmoto(ucharfbw)//直流電機正反轉程序,驅動全橋;
{
DDRD|=BIT(6);
DDRD|=BIT(7);
PORTD&=~BIT(6);
PORTD&=~BIT(7);
delayms(5);
if(fbw==1)
{
PORTD|=BIT(6);
delayms(500);
PORTD&=~BIT(6);
delayms(20);
}
else
{
}
if(fbw==0)
{
PORTD|=BIT(7);
delayms(500);
PORTD&=~BIT(7);
delayms(20);
}
}
/*********************************************************
名稱:
AD單次轉換子程序;
功能:
採樣AD通路0的電壓,該函數輸出為AD轉換後的數據,
查詢工作方式
*********************************************************/
voidad_init()
{
ADMUX=0XC0;//設置AD輸入通道為0通道,內部2.56V參考電壓;
ADCSRA=0X80;//使能ADC,清中斷標誌ADIF,查詢方式;
DDRA&=~BIT(0);//設置PA0口為輸入;
PORTA&=~BIT(0);//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>0;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;
DDRA&=~BIT(0);
PORTA&=~BIT(0);
SEI();
}
#pragmainterrupt_handlerprocess:
15//interruptprocessprogram
voidprocess()
{
intadcode=0;
ADCSRA&=~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();
DDRD=0xff;
DDRC=0xff;
ile_high;
//delayus
(1);
cs_low;
wr1_low;
//delayus
(1);
PORTC=dadata;
//delayus
(1);
wr1_high;
cs_high;
//delayus
(1);
wr2_low;
xfer_low;
//delayus
(1);
xfer_high;
}
/*****************************************************
名稱:
數據拆分顯示函數
功能:
將四位數據分別顯示到對應的數碼管。
*****************************************************/
voidaddisplay(intaddat)//轉換數據顯示,運算OK;
{
inta;
a=addat;
show(a/1000,3);
delayms
(2);
show((a/100)%10,2);
delayms
(2);
show(((a/10)%10)/10,1);
delayms
(2);
show(a%10,0);
delayms
(2);
}
/**********************************************************
名稱:
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
delayms
(1);
}
voidSPI_mastertransdata(uchardata)
{
SPDR=data;
while(!
(SPSR&BIT(7)));
}
voidSPI_slaveinit()
{
}
voidSPI_slaverecive()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AVRmega16 基本 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)