AVRmega16基本程序.doc_第1页
AVRmega16基本程序.doc_第2页
AVRmega16基本程序.doc_第3页
AVRmega16基本程序.doc_第4页
AVRmega16基本程序.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/* MCU: ATmega16 外部晶振: 8MHz 程序功能: 4*4鍵盤識別,LED七段數碼管顯示,密碼功能模塊,直流電機正反轉控制 AD轉換模塊, 模擬比較器,外部中斷應用,12864液晶,C/T0 硬件設計: 參考PROTUES硬件仿真電路 調試: 所有程序主要功能都軟硬件仿真通過,實際使用時要根據需要加入可靠性。 編譯環境: ICC AVR Design by: wdw */#include#include#include #define uchar unsigned char#define uint unsigned int#define SET_1(a,b) a|=bit(b) /將寄存器a的第b位置1#define CLR_0(a,b) a&=bit(b) /將寄存器a的第b位清0#program date code: const date=0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,/共陽數據; 0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E;#program duan code: const duan=0x20,0x10,0x08,0x04,0x02,0x01; /段選;char adchannel; int dispbuf=0,0,0,0,0,0,; /顯示緩存;uchar securbuf=0,0,0,0,0,; /5位密碼緩存;/*名稱:ms延時子函數功能:延時指定的ms*/void delayms(int ms) int i,j;for(i=ms;i0;i-) for(j=1722;j0;j-); /8M时改为1141; /12M时为1722; /*名稱:us延時子程序功能:延時指定的us*/void delayus(uchar us) for(us;us0;us-); /12M时单位T为1.45US /*单参数LED 显示硬件连接:数据PORTC-D7D0 段选PORTD-D7D4*/void LEDShow(long int shownum)uchar i,tmp,curnum;long int tmpnum;tmp = 0xfb;tmpnum = shownum;for(i=0;i6;i+) /显示的位数为5curnum = tmpnum % 10;tmpnum = tmpnum / 10;PORTD = tmp;PORTC = datecurnum;delayus(1);tmp = (tmp 1) + 0x01; /补上移位造成的最右位为0; /*名稱:七段LED共陽數碼管,在指定数位上显示指定的数,双参数功能:在指定的位置上顯示制定的數;硬件連接:PC口複用控制段選和位選,有2片573進行數據鎖存;*/ void show(uchar dat,uchar num) /六位七段數碼管顯示程序OK; PORTC=datedat; PORTD|=BIT(0); PORTD&=BIT(0); /送數據; delayus(2); PORTC=0X00; delayus(1); PORTC=duannum; PORTD|=BIT(1); delayus(2); PORTD&=BIT(1); delayus(2); /送選通信號;/*名稱:MCU端口初始化功能:設置MCU端口初始方向為輸出初始狀態為低*/void Gpioinit0() DDRA=0XFF; PORTA=0X00; DDRB=0XFF; PORTB=0X00; DDRC=0XFF; PORTC=0X00; DDRD=0XFF; PORTD=0X00; /*名稱:MCU端口初始化功能:設置MCU端口初始為輸出初始狀態為高 */void Gpioinit1() DDRA=0Xff; PORTA=0XFF; DDRB=0xff; PORTB=0XFF; DDRC=0xff; PORTC=0XFF; DDRD=0xff; PORTD=0XFF; /*名稱:單端口測試輸入:測試PC的任意端口號07功能:週期改變一個端口的電平*/ void IOtest(uchar num) DDRC|=BIT(num); / while(1) / PORTC|=BIT(num); delayms(50); PORTC&=BIT(num); delayms(50); / /*名稱:按鍵動作檢測子程序。功能:檢測4*4鍵盤是否有鍵按下;硬件連接:PB0PB3為行;PB4pb7為列;*/ uchar key_press() uchar key; DDRB=0XFF; PORTB=0X0F; DDRB=0XF0; delayms(2); /此處要加上適當延時否則讀不到端口信息; key=PINB; key&=0x0f; /按下返回1,否則為0; if(key=0x0f) return 0; else return 1; /* 名稱:4*4矩陣按鍵掃描子程序 功能:掃描一個4*4矩陣案件,比返回相應按鍵值; 硬件連接:PB0PB3為行;PB4pb7為列;*/ uchar keyscan() /4*4鍵盤掃面程序,調試0K; uchar keycode,keynum; do while(key_press()=0); /按鍵是否按下? asm(nop); asm(nop); while(key_press()=1) DDRB=0XFF; /PB0PB3為列,PB4PB7為行;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) case 0xee: keynum=0; break; case 0xde: keynum=1; break; case 0xbe: keynum=2; break; case 0x7e: keynum=3; break; case 0xed: keynum=4; break; case 0xdd: keynum=5; break; case 0xbd: keynum=6; break; case 0x7d: keynum=7; break; case 0xeb: keynum=8; break; case 0xdb: keynum=9; break; case 0xbb: keynum=10; break; case 0x7b: keynum=11; break; case 0xe7: keynum=12; break; case 0xd7: keynum=13; break; case 0xb7: keynum=14; break; case 0x77: keynum=15; break; default : keynum=16; break; return keynum; /* 名稱:六位密碼輸入比對程序 功能:輸入六位數並與存儲密碼比對,0K返回1,按錯或者順序錯返回0; 原始密碼654321*/uchar securtcom() /6位密碼輸入比對程序0K; uchar keycount=0; while(key_press()=1); delayms(3); do while(key_press()=1); delayms(1); while(key_press()=0); show(8,keycount); securbufkeycount+=keyscan(); while(keycount0;count-) adaver=ad_conv();adaver+=adaver;delayms(1); adaver=adaver/8; delayms(1); return adaver; /*名稱:AD採樣功能:採樣AD0的電壓,內部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 programvoid process() int adcode=0; ADCSRA&=BIT(ADIE); adcode=ADCL; adcode=(ADCH8)+adcode; /get adc value /* 中斷處理函數 */ ADCSRA|=BIT(ADIE); /*名稱:DAC0832 DA轉換輸入:有效分度0255輸出:無功能:對8為數字信號進行DA轉換,實際應用需調試*/#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; /*名稱: 數據拆分顯示函數功能: 將四位數據分別顯示到對應的數碼管。*/ void addisplay(int addat) /轉換數據顯示,運算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通信功能:應用mega16自身SPI通信模塊與外設進行通信.查詢方式;*/ void SPI_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); void SPI_mastertransdata(uchar data) SPDR=data; while(!(SPSR&BIT(7); void SPI_slaveinit() void SPI_slaverecive() /*名稱:比較匹配模式,中斷方式,調試OK功能:AVR比較匹配模式應用,當AIN大於AIN1時,上升沿產生中斷*/ void com_inti() SEI(); /開總中斷; DDRB&=(BIT(2)&(BIT(3); /設置PB2/3口為輸入;SFIOR&=BIT(3); /設置AIN1為模擬比較器反向輸入端;ACSR&=BIT(7); /使能模擬比較器,注意此處為低電平有效;ACSR&=BIT(6); /設置AIN0為正極輸入端;ACSR|=BIT(3); /使能模擬比較器中斷; ACSR|=(BIT(1)|BIT(0); /比較器上升沿觸發中斷; #pragma interrupt_handler comp:17 /注意函數名後不加();void comp() /模擬比較器中斷服務程序; ACSR&=BIT(3); /* 此處加中斷處理函數 */ ACSR|=BIT(3); /*名稱:外部中斷INT0 調試OK功能:低電平觸發INT0端口引起中斷,並響應相關中斷服務程序*/ void int0_init() DDRD&=BIT(2); /PD2/INT0端口配置為輸入; MCUCR&=(BIT(0)&(BIT(0); /INT0觸發方式為低電平; GICR|=BIT(6); /使能外部中斷0; SEI(); /開總中斷; #pragma interrupt_handler int0:2void int0() /INT0中斷服務函數; GICR&=BIT(6); /關閉外部INT0; /* 此處加INT0中斷處理函數 */ GICR|=BIT(6); /開啟外部INT0; /*名稱:外部中斷INT1,功能:邊沿觸發INT0端口引起中斷,並響應相關中斷服務程序*/ void int1_init() DDRD&=BIT(3); /將PD3口配置為輸入; PORTD&=BIT(3); /pd3口初始值為0; MCUCR|=(BIT(3)|BIT(2); /INT1上升沿觸發中斷; GICR|=BIT(7); /使能INT1中斷; SEI(); /開總中斷; #pragma interrupt_handler int1:3void int1() GICR&=BIT(7); /關閉INT1中斷; /* 此處加INT1中斷服務函數; */ GICR|=BIT(7); /開啟INT1中斷; /* /*名稱:12864(ks0108)顯示應用功能:圖形液晶使用*/ #define EN_CLR PORTD&=BIT(0) /使能12864#define EN_SET PORTD|=BIT(0) /關閉12864#define RW_READ PORTD|=BIT(1) /讀操作#define RW_WRITE PORTD&=BIT(1) /寫操作#define RS_COMM PORTD&=BIT(2) /命令操作#define RS_DATA PORTD|=BIT(2) /數據操作#define RESET PORTD&=BIT(3) /12864液晶複位#define RESET_OVER PORTD|=BIT(3) /12864液晶結束複位;#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數據,基本指令集;#define explo_com 0xc4 /擴展指令集#define show_stitude 0x0f /顯示狀態,整體顯示,游標開,游標位置開#define cleanscreen 0x01 /顯示清零,AC歸零#define cursor 0x07 /写入/讀取时,游标右移,畫面左移#define AC_0 0x03 /AC归0,不改变DDRAM内容const int char_0816= 0xe0,0x18,0x04,0x04,0x04,0x18,0xe0,0x00, 0x07,0x18,0x20,0x20,0x20,0x18,0x07,0x00 ;/*名稱:MCU端口初始化功能:設置MCU端口初始方向以及狀態*/void GPIO_INIT() DDRA=0XFF; PORTA=0X00; DDRB=0XFF; PORTA=0X00; DDRC=0XFF; PORTA=0X00; DDRD=0XFF; PORTA=0X00; /*名稱:輸入數據功能:MCU將數據送到總線*/ void SET_DATA(uchar data) delayus(3); PORTC=data; delayus(3); /*名稱:開關顯示控制功能:開啟與關閉顯示操作,1為開顯示,0為關閉顯示*/void LCD_Command_Displayonoff(uchar onoff) RW_WRITE; RS_COMM; EN_CLR; SET_DATA(0x3e + onoff); /onoff為1開顯示,為0關顯示; EN_SET; delayus(2); EN_CLR; /*名稱: LCD顯示起始行設定功能:設置LCD顯示起始行位置,startline範圍063*/ void LCD_Command_setstartline(uchar startline) RW_WRITE; RS_COMM; EN_CLR; SET_DATA(0Xc0 + startline); /12864行地址為063之間設定; EN_SET; delayus(2); EN_CLR; /*名稱:設置顯示行頁地址功能:設置顯示行頁地址,12864為07*/void LCD_Command_set_x(uchar x) RW_WRITE; RS_COMM; EN_CLR; SET_DATA(0xB8+x); /設置12864行頁地址 x範圍07; EN_SET; delayus(2); EN_CLR; /*名稱:設置顯示列地址功能:設置顯示列地址y,範圍063;*/void LCD_Command_set_y(uchar column) RW_WRITE; RS_COMM; EN_CLR; SET_DATA(0x40+column); /設置顯示列地址y,範圍063; EN_SET; delayus(2); EN_CLR; /*名稱:LCD顯示數據寫入功能:將顯示數據寫入12864液晶*/void LCD_Command_writebyte(uchar data) RW_WRITE; RS_DATA; EN_CLR; SET_DATA(data); EN_SET; de

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论