新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Atmega16單片機(jī)實(shí)用程序

Atmega16單片機(jī)實(shí)用程序

作者: 時(shí)間:2016-12-01 來(lái)源:網(wǎng)絡(luò) 收藏
/************************************************************
名稱:六位密碼輸入比對(duì)程序
功能:輸入六位數(shù)並與存儲(chǔ)密碼比對(duì),0K返回1,按錯(cuò)或者順序錯(cuò)返回0;
原始密碼654321
**************************************************************/
uchar securtcom() //6位密碼輸入比對(duì)程序0K;
{
uchar keycount=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) //初始比對(duì),密碼654321;
{
if(securbuf[1]==5)
{
if(securbuf[2]==4)
{
if(securbuf[3]==3)
{
if(securbuf[4]==2)
{
if(securbuf[5]==1);
}
}
}
}
return 1; //密碼正確,返回1;
}
else
return 0; //密碼錯(cuò)誤,返回0;
}
uchar serset() //密碼設(shè)定子程序;
{
}
uchar speci_keypress(uchar presstimes) //特殊按鍵F按下某一設(shè)定次數(shù)OK;
{
}
uchar key_longpress(uchar prst) //按鍵長(zhǎng)按子程序
{
}
/**************************************************
名稱: 直流蜂鳴器控制
功能: 控制蜂鳴器鳴響時(shí)間
硬件連接:PD5輸出控制信號(hào)
**************************************************/
void dcbeep(uchar beeptime) //直流蜂鳴器,調(diào)試OK;
{uchar beep;
DDRD|=BIT(5);
PORTD&=~BIT(5);
PORTD|=BIT(5);
delayus(beeptime);
PORTD&=~BIT(5);
delayus(100-beeptime);
}
/**********************************************************
名稱:直流電機(jī)全橋控制
功能:fbw=1.正轉(zhuǎn);fbw=0,反轉(zhuǎn);
硬件連接:PD6與PD7口組合輸出控制信號(hào);
**********************************************************/
void moto(uchar fbw) //直流電機(jī)正反轉(zhuǎn)程序,驅(qū)動(dòng)全橋;
{
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單次轉(zhuǎn)換子程序;
功能: 採(cǎi)樣AD通路0的電壓,該函數(shù)輸出為AD 轉(zhuǎn)換後的數(shù)據(jù),
查詢工作方式
*********************************************************/
void ad_init()
{
ADMUX=0XC0; //設(shè)置AD輸入通道為0通道,內(nèi)部2.56V參考電壓;
ADCSRA=0X80; //使能ADC,清中斷標(biāo)誌ADIF,查詢方式;
DDRA&=~BIT(0); //設(shè)置PA0口為輸入;
PORTA&=~BIT(0); //PA0口清零;
}
int ad_conv() //單次轉(zhuǎn)換子程序,OK;
{
int addata;
ADCSRA|=BIT(ADSC); //啟動(dòng)一次轉(zhuǎn)換;
while(!(ADCSRA&(BIT(ADIF)))); //查詢等待轉(zhuǎn)換結(jié)束標(biāo)誌置位;
ADCSRA&=~BIT(ADIF);
addata=ADCL;
addata=addata+ADCH*256;
return addata;
}
int ad_aver() //轉(zhuǎn)換8次,做平均值濾波
{
int adaver,count;
for(count=7;count>0;count--)
{
adaver=ad_conv();
adaver+=adaver;
delayms(1);
}
adaver=adaver/8;
delayms(1);
return adaver;
}
/*********************************************************
名稱:AD採(cǎi)樣
功能:採(cǎi)樣AD0的電壓,內(nèi)部2.56V參考電壓,中斷工作方式
**********************************************************/
void ad0_init()
{
ADMUX=0xc0;
adchannel=0;
ADCSRA=0x98;
DDRA&=~BIT(0);
PORTA&=~BIT(0);
SEI();
}
#pragma interrupt_handler process:15 //interrupt process program
void process()
{
int adcode=0;
ADCSRA&=~BIT(ADIE);
adcode=ADCL;
adcode=(ADCH<<8)+adcode; //get adc value
/************************
中斷處理函數(shù)
*************************/
ADCSRA|=BIT(ADIE);
}
/********************************************************
名稱:DAC0832 DA轉(zhuǎn)換
輸入:有效分度0~255
輸出:無(wú)
功能:對(duì)8為數(shù)字信號(hào)進(jìn)行DA轉(zhuǎn)換,實(shí)際應(yīng)用需調(diào)試
********************************************************/
#define cs_low PORTD&=~BIT(0)
#define cs_high PORTD|=BIT(0)
#define wr1_low PORTD&=~BIT(1)
#define wr1_high PORTD|=BIT(1)
#define ile_high PORTD|=BIT(2)
#define ile_low PORTD&=~BIT(2)
#define wr2_low PORTD&=~BIT(3)
#define wr2_high PORTD|=BIT(3)
#define xfer_low PORTD&=~BIT(5)
#define xfer_high PORTD|=BIT(5)
void dac(int dadata)
{
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;
}
/*****************************************************
名稱: 數(shù)據(jù)拆分顯示函數(shù)
功能: 將四位數(shù)據(jù)分別顯示到對(duì)應(yīng)的數(shù)碼管。
*****************************************************/
void addisplay(int addat) //轉(zhuǎn)換數(shù)據(jù)顯示,運(yùn)算OK;
{
int a;
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通信
功能:應(yīng)用mega16自身SPI通信模塊與外設(shè)進(jìn)行通信.查詢方式;
***********************************************************/
void SPI_masterinit()
{
DDRB|=BIT(5)|BIT(7); //設(shè)置MOSI與SCK為輸出
DDRB&=~(BIT(4)&BIT(6)); //設(shè)置MISO與SS為輸入
SPCR|=BIT(4)|BIT(3)|BIT(1)|BIT(0); //數(shù)據(jù)高位先發(fā)送,主機(jī)模式,空閒時(shí)鐘極性
//為高,SCK起始沿採(cǎi)樣數(shù)據(jù),128分頻
SPCR|=BIT(6); //使能SPI
delayms(1);
}
void SPI_mastertransdata(uchar data)
{
SPDR=data;
while(!(SPSR&BIT(7)));
}
void SPI_slaveinit()
{
}
void SPI_slaverecive()
{
}
/*********************************************************
名稱:比較匹配模式,,中斷方式,調(diào)試OK
功能:AVR比較匹配模式應(yīng)用,當(dāng)AIN大於AIN1時(shí),上升沿產(chǎn)生中斷
**********************************************************/
void com_inti()
{
SEI(); //開(kāi)總中斷;
DDRB&=((~BIT(2))&(~BIT(3))); //設(shè)置PB2/3口為輸入;
SFIOR&=~BIT(3); //設(shè)置AIN1為模擬比較器反向輸入端;
ACSR&=~BIT(7); //使能模擬比較器,注意此處為低電平有效;
ACSR&=~BIT(6); //設(shè)置AIN0為正極輸入端;
ACSR|=BIT(3); //使能模擬比較器中斷;
ACSR|=(BIT(1)|BIT(0)); //比較器上升沿觸發(fā)中斷;
}
#pragma interrupt_handler comp:17 //注意函數(shù)名後不加();
void comp() //模擬比較器中斷服務(wù)程序;
{
ACSR&=~BIT(3);
/*************
此處加中斷處理函數(shù)
**************/
ACSR|=BIT(3);
}
/**********************************************************
名稱:外部中斷INT0 調(diào)試OK
功能:低電平觸發(fā)INT0端口引起中斷,並響應(yīng)相關(guān)中斷服務(wù)程序
**********************************************************/
void int0_init()
{
DDRD&=~BIT(2); //PD2/INT0端口配置為輸入;
MCUCR&=((~BIT(0))&(~BIT(0))); //INT0觸發(fā)方式為低電平;
GICR|=BIT(6); //使能外部中斷0;
SEI(); //開(kāi)總中斷;
}
#pragma interrupt_handler int0:2
void int0() //INT0中斷服務(wù)函數(shù);
{
GICR&=~BIT(6); //關(guān)閉外部INT0;
/************************
此處加INT0中斷處理函數(shù)
************************/
GICR|=BIT(6); //開(kāi)啟外部INT0;
}
/*********************************************************
名稱:外部中斷INT1,
功能:邊沿觸發(fā)INT0端口引起中斷,並響應(yīng)相關(guān)中斷服務(wù)程序
**********************************************************/
void int1_init()
{
DDRD&=~BIT(3); //將PD3口配置為輸入;
PORTD&=~BIT(3); //pd3口初始值為0;
MCUCR|=(BIT(3)|BIT(2)); //INT1上升沿觸發(fā)中斷;
GICR|=BIT(7); //使能INT1中斷;
SEI(); //開(kāi)總中斷;
}
#pragma interrupt_handler int1:3
void int1()
{
GICR&=~BIT(7); //關(guān)閉INT1中斷;
/*******************************
此處加INT1中斷服務(wù)函數(shù);
*******************************/
GICR|=BIT(7); //開(kāi)啟INT1中斷;
}
/**********************************************************
/**********************************************************
名稱:12864(ks0108)顯示應(yīng)用
功能:圖形液晶使用
**********************************************************/
#define EN_CLR PORTD&=~BIT(0) //使能12864
#define EN_SET PORTD|=BIT(0) //關(guān)閉12864
#define RW_READ PORTD|=BIT(1) //讀操作
#define RW_WRITE PORTD&=~BIT(1) //寫(xiě)操作
#define RS_COMM PORTD&=~BIT(2) //命令操作
#define RS_DATA PORTD|=BIT(2) //數(shù)據(jù)操作
#define RESET PORTD&=~BIT(3) //12864液晶複位
#define RESET_OVER PORTD|=BIT(3) //12864液晶結(jié)束複位;
#define CS1_EN PORTD&=~BIT(4) //使能CS1,選擇左半屏幕;
#define CS1_DIS PORTD|=BIT(4) //禁止CS1
#define CS2_EN PORTD&=~BIT(5) //使能CS2,選擇右半屏幕;
#define CS2_DIS PORTD|=BIT(5) //禁止CS2
#define basic_com 0x30 //一次送8BIT數(shù)據(jù),基本指令集;
#define explo_com 0xc4 //擴(kuò)展指令集
#define show_stitude 0x0f //顯示狀態(tài),整體顯示,游標(biāo)開(kāi),游標(biāo)位置開(kāi)
#define cleanscreen 0x01 //顯示清零,AC歸零
#define cursor 0x07 //寫(xiě)入/讀取時(shí),游標(biāo)右移,畫(huà)面左移
#define AC_0 0x03 //AC歸0,不改變DDRAM內(nèi)容
const int char_0816[]={
0xe0,0x18,0x04,0x04,0x04,0x18,0xe0,0x00,
0x07,0x18,0x20,0x20,0x20,0x18,0x07,0x00
};
/************************************************************
名稱:MCU端口初始化
功能:設(shè)置MCU端口初始方向以及狀態(tài)
*************************************************************/
void GPIO_INIT()
{
DDRA=0XFF;
PORTA=0X00;
DDRB=0XFF;
PORTA=0X00;
DDRC=0XFF;
PORTA=0X00;
DDRD=0XFF;
PORTA=0X00;
}
/****************************************************************
名稱:輸入數(shù)據(jù)
功能:MCU將數(shù)據(jù)送到總線
*****************************************************************/
void SET_DATA(uchar data)
{
delayus(3);
PORTC=data;
delayus(3);
}
/****************************************************************
名稱:開(kāi)關(guān)顯示控制
功能:開(kāi)啟與關(guān)閉顯示操作,1為開(kāi)顯示,0為關(guān)閉顯示
*****************************************************************/
void LCD_Command_Displayonoff(uchar onoff)
{
RW_WRITE;
RS_COMM;
EN_CLR;
SET_DATA(0x3e + onoff); //onoff為1開(kāi)顯示,為0關(guān)顯示;
EN_SET;
delayus(2);
EN_CLR;
}
/***************************************************************
名稱: LCD顯示起始行設(shè)定
功能:設(shè)置LCD顯示起始行位置,startline範(fàn)圍0~63
***************************************************************/
void LCD_Command_setstartline(uchar startline)
{
RW_WRITE;
RS_COMM;
EN_CLR;
SET_DATA(0Xc0 + startline); //12864行地址為0~63之間設(shè)定;
EN_SET;
delayus(2);
EN_CLR;
}
/***************************************************************
名稱:設(shè)置顯示行頁(yè)地址
功能:設(shè)置顯示行頁(yè)地址,12864為0~7
****************************************************************/
void LCD_Command_set_x(uchar x)
{
RW_WRITE;
RS_COMM;
EN_CLR;
SET_DATA(0xB8+x); //設(shè)置12864行頁(yè)地址 x範(fàn)圍0~7;
EN_SET;
delayus(2);

評(píng)論


技術(shù)專區(qū)

關(guān)閉