單片機(jī)程序12-18B20和PLD與EDA講義_第1頁(yè)
單片機(jī)程序12-18B20和PLD與EDA講義_第2頁(yè)
單片機(jī)程序12-18B20和PLD與EDA講義_第3頁(yè)
單片機(jī)程序12-18B20和PLD與EDA講義_第4頁(yè)
單片機(jī)程序12-18B20和PLD與EDA講義_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、/*數(shù)字中C程序設(shè)計(jì)*/#include#include#define uint unsigned int #define uchar unsigned char/*時(shí)間位變量定義*/sbit mode=P37;sbit inc=P36;sbit dec=P35;sbit enter=P34;sbit point=P07;bit flag=1;sbit DQ=P11; /設(shè)定溫度采集端sbit led=P27;/三色指示時(shí)鐘sbit speaker=P26;/聲音報(bào)警端口sbit d2=P25;sbit d3=P24;sbit d4=P23;sbit d5=P22;sbit d6=P21;sb

2、it d7=P20;/*變量定義*/uchar t,hhour,lhour,hmin,lmin,hsec,lsec;uchar hour,min,sec,vmode; uchar ahour,amin;uchar m,n,deta;uchar day,week,mon;/定義日期uint year;uchar temp;/存放溫度值uchar str3;/存放溫度分離值uchar code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x00,0 x00;/共陰型七段數(shù)碼管09的斷碼uchar code

3、choosebit=0 x01,0 x02,0 x04,0 x08,0 x10,0 x20;/P20P25是6個(gè)數(shù)碼管從地位到高位的位選uchar table1=31,31,29,31,30,31,30,31,31,30,31,30,31; /閏年uchar table2=31,31,28,31,30,31,30,31,31,30,31,30,31; /非閏年/*聲明時(shí)鐘調(diào)用子函數(shù)*/void delay(uint z);void delay_spk(uint cnt);void mode0();void mode1();void mode2();void mode3();void mode4

4、();void mode5();/顯示日期void mode6();/顯示溫度void display(uchar t_hour,uchar t_min,uchar t_sec);/*聲明ds18b20調(diào)用的子函數(shù)*/ uchar ReadTemperature(void); /讀取溫度void Init_DS18B20(void); /18b20初始化函數(shù)uchar ReadOneChar(void);/讀一個(gè)字節(jié)void WriteOneChar(uchar dat); /寫(xiě)一個(gè)字節(jié)void delay_temperature(uint y);/延時(shí)函數(shù)void display_tempe

5、rature();/*主函數(shù)*/void main() vmode=0;speaker=0; hour=0;min=1;sec=0;ahour=0;amin=3;led=0;year=2009;mon=05;day=25;week=01;/日期賦初值TMOD=0 x11;/設(shè)置定時(shí)器0,1為工作方式1TH0=0 xd8;/定時(shí)器定時(shí)10msTL0=0 xf0; TH1=(65536-5000)/256;TL1=(65536-5000)%256;IE=0X8a;/開(kāi)定時(shí)器0,1中斷 TR0=1;/啟動(dòng)定時(shí)器0TR1=1;/啟動(dòng)定時(shí)器1 t=0;/賦顯示初值while(1) switch(vmod

6、e)case 0:mode0();break;/正常走時(shí)case 1:mode1();break;/調(diào)整當(dāng)前時(shí)間分鐘case 2:mode2();break;/調(diào)整當(dāng)前時(shí)間小時(shí)case 3:mode3();break;/調(diào)整鬧鐘時(shí)間分鐘case 4:mode4();break;/調(diào)整鬧鐘時(shí)間分鐘 case 5:/正常日期case 6:/調(diào)整月值case 7:/調(diào)整日值case 8:mode5();break;/調(diào)整周值 case 9:mode6();break;/顯示溫度default:break;/*10mS定時(shí)中斷服務(wù)子函數(shù)*/void timer1_ISR(void) interrupt

7、 3 TH1=(65536-5000)/256;TL1=(65536-5000)%256;if(m=1)n+;if(n=50)n=0;m=0;P3=0 xff;if(P3!=0 xff) if(n=0)m=1; if(n=1) if(mode=0) vmode+; if(enter=0) vmode=0;TR0=1; if(vmode=1&inc=0) TR0=0;min+;if(min=60) min=0; if(vmode=1&dec=0) TR0=0;min-;if(min=24) hour=0; if(vmode=2&dec=0) TR0=0;hour-;if(hour=60) ami

8、n=0; if(vmode=3&dec=0) TR0=0;amin-;if(amin=24) ahour=0; if(vmode=4&dec=0) TR0=0;ahour-;if(ahour=13) mon=1; if(vmode=6&dec=0) TR0=0;mon-;if(mon=0) mon=12; if(vmode=7&inc=0) TR0=0;day+;if(year%4=0&year%100!=0|year%400=0) if(day=table1mon+1) day=1; else /非閏年if(day=table2mon+1) day=1; if(vmode=7&dec=0)

9、TR0=0;day-;if(year%4=0&year%100!=0|year%400=0) if(day=0) day=table1mon-1; else if(day=8) week=1; if(vmode=8&dec=0) TR0=0;week-;if(week=10)vmode=0;switch(vmode) case 0:mode0();break;/正常走時(shí)case 1:mode1();break;/調(diào)整正常走時(shí)的分鐘case 2:mode2();break;/調(diào)整正常走時(shí)的小時(shí)case 3:mode3();break;/調(diào)整定時(shí)的分鐘case 4:mode4();break;/調(diào)

10、整定時(shí)的小時(shí) case 5: /顯示正常月日周 case 6: /調(diào)整月份值 case 7: /調(diào)整日期值 case 8:mode5();break; /調(diào)整星期值 case 9:mode6();break; /顯示溫度default:break; /時(shí)間正常運(yùn)行void timer0_ISR(void) interrupt 1TH0=0 xd8;TL0=0 xf0;t+;deta+;if(deta=50)deta=0;flag=!flag;/每隔一秒最低位的小數(shù)點(diǎn)閃爍一次if(t=100)t=0;sec+;if(sec=60)sec=0;min+;if(min=60)min=0;hour+;

11、if(hour=24) hour=0;day+;week+;if(week=8) week=1;if(year%4=0&year%100!=0|year%400=0) /閏年 if(day=table1mon+1) day=1; mon+; if(mon=13) mon=1;year+;else /非閏年 if(day=table2mon+1) day=1; mon+;if(mon=13) mon=1;year+;/*模式設(shè)置*/模式0 正常走時(shí)并顯示void delay_spk(uint cnt)/延時(shí)while(-cnt);void mode0() uchar i; display(hou

12、r,min,sec); while(hour=ahour&min=amin)|(min=0)/鬧鐘和整點(diǎn)報(bào)時(shí) for(i=0;i=60)hhour=10;lhour=10;else hhour=t_hour/10;lhour=t_hour%10; if(t_min=60)hmin=10;lmin=10;elsehmin=t_min/10;lmin=t_min%10;if(t_sec=60)hsec=10;lsec=10;elsehsec=t_sec/10;lsec=t_sec%10;/choose the first led d2=1;d3=0;d4=0;d5=0;d6=0;d7=0;P0=t

13、ablehhour;delay(2);P0=0;/choose the second led d2=0;d3=1;d4=0;d5=0;d6=0;d7=0;P0=tablelhour;delay(2);P0=0;/choose the third ledd2=0; d3=0;d4=1;d5=0;d6=0;d7=0;P0=tablehmin;delay(2);P0=0;/choose the fourth ledd2=0;d3=0;d4=0;d5=1;d6=0;d7=0;P0=tablelmin;delay(2);P0=0;/choose the fifth led d2=0;d3=0;d4=0;

14、d5=0;d6=1;d7=0;P0=tablehsec;delay(2);P0=0;/choose the sixth led d2=0;d3=0;d4=0;d5=0;d6=0;d7=1;P0=tablelsec;if(flag=1)point=1;delay(2);P0=0;void delay(uint z)uint y;for(;z0;z-)for(y=0;y0;i-) DQ = 0; / 給脈沖信號(hào) dat=1; DQ = 1; / 給脈沖信號(hào) if(DQ) dat|=0 x80; delay_temperature(5); return(dat);/寫(xiě)一個(gè)字節(jié)void WriteOn

15、eChar(uchar dat) uchar i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0 x01; delay_temperature(5); DQ = 1; dat=1; delay_temperature(5);/*/*讀取溫度*/uchar ReadTemperature(void)uchar a=0;uchar b=0;uchar t1=0;/float tt=0;Init_DS18B20();WriteOneChar(0 xCC); / 跳過(guò)ROMWriteOneChar(0 x44); / 啟動(dòng)溫度轉(zhuǎn)換delay_temperature(20

16、0);Init_DS18B20();WriteOneChar(0 xCC); /跳過(guò)ROM WriteOneChar(0 xBE); /讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度a=ReadOneChar(); /a是低八位,傳送先高位,后低位b=ReadOneChar(); /b是高八位b4; /高四位與低四位互換t1=b;/tt=t*0.0625;/t1= tt*10+0.5; /放大10倍輸出并四舍五入return(t1);/*/*溫度顯示子函數(shù)*/void display_temperature()/顯示十位speaker=0;/蜂鳴器不響d3=0;d4=0;d5=1;d6=

17、0;d7=0;P0=str2;delay(30);P0=0;/顯示位個(gè)speaker=0;d3=0;d4=0;d5=0;d6=1;d7=0;P0=str1;delay(30);P0=0;/顯示符號(hào)cspeaker=0;d3=0;d4=0;d5=0;d6=0;d7=1;P0=str0;delay(30);P0=0;/*ds18b20延時(shí)函數(shù)*/*/void delay_temperature(uint y)/延時(shí)函數(shù) while(y-);-/*1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E *7-14 DB0-DB7 15-BLA 16-BLK */*copyright 2007

18、,ShangHai HaoTun Electronic Technology co.,Ltd * *This sample is used for lcm1602 . * *write by Shifang 2007-8-11 * *V1.1 */#include#include#includeunsigned int hour,minute,second,count;sbit RS = P22;/Pin4sbit RW = P23; /Pin5sbit E = P24;/Pin6#define Data P0 /數(shù)據(jù)端口char data TimeNum= ;char data Test1=

19、 ;/*/* 函數(shù)聲明 */*/*/void DelayUs(unsigned char us)/delay us unsigned char uscnt; uscnt=us1;/* Crystal frequency in 12MHz*/ while(-uscnt);/*/void DelayMs(unsigned char ms)/delay Ms while(-ms) DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); void WriteCommand(unsigned char c) DelayMs(5);/short de

20、lay before operation E=0; RS=0; RW=0; _nop_(); E=1; Data=c; E=0;/*/void WriteData(unsigned char c) DelayMs(5); /short delay before operation E=0; RS=1; RW=0; _nop_(); E=1; Data=c; E=0; RS=0;/*/void ShowChar(unsigned char pos,unsigned char c) unsigned char p; if (pos=0 x10) p=pos+0 xb0; /是第二行則命令代碼高4位

21、為0 xc else p=pos+0 x80; /是第二行則命令代碼高4位為0 x8 WriteCommand (p);/write command WriteData (c); /write data/*/void ShowString (unsigned char line,char *ptr) unsigned char l,i; l=line4; for (i=0;i16;i+) ShowChar (l+,*(ptr+i);/循環(huán)顯示16個(gè)字符/*/void InitLcd() DelayMs(15); WriteCommand(0 x38); /display mode WriteC

22、ommand(0 x38); /display mode WriteCommand(0 x38); /display mode WriteCommand(0 x06); /顯示光標(biāo)移動(dòng)位置 WriteCommand(0 x0c); /顯示開(kāi)及光標(biāo)設(shè)置 WriteCommand(0 x01); /顯示清屏/void main(void)InitLcd();/DelayMs(15);sprintf(Test1, );/the first lineShowString(0,Test1);sprintf(TimeNum,LCM1602 Test ok!);/the first lineShowStri

23、ng(1,TimeNum);while(1);-/18B20單線溫度檢測(cè)的應(yīng)用樣例程序#include#include#include#define uchar unsigned char#define uint unsigned int;/*/sbit DQ=P35;/ds18b20 端口/*/ unsigned int temp;uchar flag_get;/*/void delay1(uchar MS);unsigned char ReadTemperature(void);void Init_DS18B20(void);unsigned char ReadOneChar(void);

24、void WriteOneChar(unsigned char dat);void delay(unsigned int i);void DelayMs(unsigned char ms);/delay Msvoid InitLcd();void lcd_sef_chr();/*/void display(void);/外部函數(shù)main()TMOD|=0 x01;/定時(shí)器設(shè)置TH0=0 xef;TL0=0 xf0;IE=0 x82;TR0=1; InitLcd();/DelayMs(15);lcd_sef_chr(); /寫(xiě)入自定義字符號(hào)while(1) if(flag_get=1) /定時(shí)讀

25、取當(dāng)前溫度 temp=ReadTemperature(); flag_get=0; display();/顯示 void tim(void) interrupt 1 using 1/中斷,用于數(shù)碼管掃描和溫度檢測(cè)間隔static unsigned char num;TH0=0 xef;/定時(shí)器重裝值TL0=0 xf0;num+;if (num=50) num=0; flag_get=1;/標(biāo)志位有效 /*/void delay(unsigned int i)/延時(shí)函數(shù) while(i-);/*/18b20初始化函數(shù)void Init_DS18B20(void) unsigned char x=

26、0; DQ = 1; /DQ復(fù)位 delay(8); /稍做延時(shí) DQ = 0; /單片機(jī)將DQ拉低 delay(80); /精確延時(shí) 大于 480us DQ = 1; /拉高總線 delay(10); x=DQ; /稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗 delay(5);/讀一個(gè)字節(jié)unsigned char ReadOneChar(void)unsigned char i=0;unsigned char dat = 0;for (i=8;i0;i-) DQ = 0; / 給脈沖信號(hào) dat=1; DQ = 1; / 給脈沖信號(hào) if(DQ) dat|=0 x80; del

27、ay(5); return(dat);/寫(xiě)一個(gè)字節(jié)void WriteOneChar(unsigned char dat) unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0 x01; delay(5); DQ = 1; dat=1; delay(5);/讀取溫度unsigned char ReadTemperature(void)unsigned char a=0;unsigned char b=0;unsigned char t=0;/float tt=0;Init_DS18B20();WriteOneChar(0 xCC); /

28、 跳過(guò)讀序號(hào)列號(hào)的操作WriteOneChar(0 x44); / 啟動(dòng)溫度轉(zhuǎn)換delay(200);Init_DS18B20();WriteOneChar(0 xCC); /跳過(guò)讀序號(hào)列號(hào)的操作 WriteOneChar(0 xBE); /讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度a=ReadOneChar();b=ReadOneChar();b4;t=b;/tt=t*0.0625;/t= tt*10+0.5; /放大10倍輸出并四舍五入return(t);-/18B20單線溫度檢測(cè)的應(yīng)用樣例程序#include#include#include#define uchar unsig

29、ned char#define uint unsigned int;/*/sbit seg1=P20;sbit seg2=P21;sbit seg3=P22;sbit DQ=P35;/ds18b20 端口sfr dataled=0 x80;/顯示數(shù)據(jù)端口/*/ uchar temp;uchar flag_get,count,num,minute,second;uchar code tab=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;/7段數(shù)碼管段碼表共陽(yáng)uchar str3;/*/void delay1(uchar M

30、S);unsigned char ReadTemperature(void);void Init_DS18B20(void);unsigned char ReadOneChar(void);void WriteOneChar(unsigned char dat);void delay(unsigned int i);/*/main()TMOD|=0 x01;/定時(shí)器設(shè)置TH0=0 xef;TL0=0 xf0;IE=0 x82;TR0=1;P2=0 x00; count=0;while(1) str0=0 xc6;/顯示C符號(hào) str2=tabtemp/10; /十位溫度 str1=tabtem

31、p%10; /個(gè)位溫度 if(flag_get=1) /定時(shí)讀取當(dāng)前溫度 temp=ReadTemperature(); flag_get=0; void tim(void) interrupt 1 using 1/中斷,用于數(shù)碼管掃描和溫度檢測(cè)間隔TH0=0 xef;/定時(shí)器重裝值TL0=0 xf0;num+;if (num=50) num=0; flag_get=1;/標(biāo)志位有效 second+; if(second=60) second=0; minute+; count+;if(count=1) P2=0 xf7; dataled=str0;/數(shù)碼管掃描if(count=2) P2=0

32、 xfb; dataled=str1;if(count=3) P2=0 xfd; dataled=str2; count=0;/*/void delay(unsigned int i)/延時(shí)函數(shù) while(i-);/*/18b20初始化函數(shù)void Init_DS18B20(void) unsigned char x=0; DQ = 1; /DQ復(fù)位 delay(8); /稍做延時(shí) DQ = 0; /單片機(jī)將DQ拉低 delay(80); /精確延時(shí) 大于 480us DQ = 1; /拉高總線 delay(10); x=DQ; /稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗 de

33、lay(5);/讀一個(gè)字節(jié)unsigned char ReadOneChar(void)unsigned char i=0;unsigned char dat = 0;for (i=8;i0;i-) DQ = 0; / 給脈沖信號(hào) dat=1; DQ = 1; / 給脈沖信號(hào) if(DQ) dat|=0 x80; delay(5); return(dat);/寫(xiě)一個(gè)字節(jié)void WriteOneChar(unsigned char dat) unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0 x01; delay(5); DQ = 1

34、; dat=1; delay(5);/讀取溫度unsigned char ReadTemperature(void)unsigned char a=0;unsigned char b=0;unsigned char t=0;/float tt=0;Init_DS18B20();WriteOneChar(0 xCC); / 跳過(guò)讀序號(hào)列號(hào)的操作WriteOneChar(0 x44); / 啟動(dòng)溫度轉(zhuǎn)換delay(200);Init_DS18B20();WriteOneChar(0 xCC); /跳過(guò)讀序號(hào)列號(hào)的操作 WriteOneChar(0 xBE); /讀取溫度寄存器等(共可讀9個(gè)寄存器)

35、 前兩個(gè)就是溫度a=ReadOneChar();b=ReadOneChar();b4;t=b;/tt=t*0.0625;/t= tt*10+0.5; /放大10倍輸出并四舍五入return(t);-/*1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E *7-14 DB0-DB7 15-BLA 16-BLK */*copyright 2007,ShangHai HaoTun Electronic Technology co.,Ltd * *This sample is used for lcm1602 . * *write by Shifang 2007-8-11 * *V1.1

36、*/#include#include#includeunsigned int hour,minute,second,count;sbit RS = P22;/Pin4sbit RW = P23; /Pin5sbit E = P24;/Pin6#define Data P0 /數(shù)據(jù)端口char data TimeNum= ;char data Test1= ;/*/* 函數(shù)聲明 */*/*/void DelayUs(unsigned char us)/delay us unsigned char uscnt; uscnt=us1;/* Crystal frequency in 12MHz*/ w

37、hile(-uscnt);/*/void DelayMs(unsigned char ms)/delay Ms while(-ms) DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); void WriteCommand(unsigned char c) DelayMs(5);/short delay before operation E=0; RS=0; RW=0; _nop_(); E=1; Data=c; E=0;/*/void WriteData(unsigned char c) DelayMs(5); /short dela

38、y before operation E=0; RS=1; RW=0; _nop_(); E=1; Data=c; E=0; RS=0;/*/void ShowChar(unsigned char pos,unsigned char c) unsigned char p; if (pos=0 x10) p=pos+0 xb0; /是第二行則命令代碼高4位為0 xc else p=pos+0 x80; /是第二行則命令代碼高4位為0 x8 WriteCommand (p);/write command WriteData (c); /write data/*/void ShowString (u

39、nsigned char line,char *ptr) unsigned char l,i; l=line4; for (i=0;i16;i+) ShowChar (l+,*(ptr+i);/循環(huán)顯示16個(gè)字符/*/void InitLcd() DelayMs(15); WriteCommand(0 x38); /display mode WriteCommand(0 x38); /display mode WriteCommand(0 x38); /display mode WriteCommand(0 x06); /顯示光標(biāo)移動(dòng)位置 WriteCommand(0 x0c); /顯示開(kāi)及光

40、標(biāo)設(shè)置 WriteCommand(0 x01); /顯示清屏/void main(void)InitLcd();/DelayMs(15);sprintf(Test1, );/the first lineShowString(0,Test1);sprintf(TimeNum,LCM1602 Test ok!);/the first lineShowString(1,TimeNum);while(1);-/*copyright 2007,ShangHai HaoTun Electronic Technology co.,Ltd * *This sample is used for 7-seg le

41、d dynamic display . * *write by Shifang 2007-4-23 * *V1.1 */#include unsigned char const dofly=0 xf9,0 xb0,0 x92,0 x80,0 xf9,0 xb0,0 x92,0 x80;/ 顯示數(shù)值表 13581358 /8位數(shù)碼管顯示13581358unsigned char code seg=0 x7f,0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe;/分別對(duì)應(yīng)相應(yīng)的數(shù)碼管點(diǎn)亮/void delay(unsigned int cnt) while(-cnt

42、);/main() unsigned char i; while(1) P0=doflyi;/取顯示數(shù)據(jù) P2=seg7-i; /取段碼 delay(30000); /掃描間隙延時(shí),這個(gè)時(shí)間比較長(zhǎng),用于演示動(dòng)態(tài)掃描 /縮短這個(gè)時(shí)間,利用人眼的暫留效應(yīng)我們就可以看到 /類似靜態(tài)的顯示了 i+; if(8=i) i=0; -/*copyright 2007,ShangHai HaoTun Electronic Technology co.,Ltd * *This sample is used for 7-seg led dynamic display . * *write by Shifang 2

43、007-4-23 * *V1.1 */#include unsigned char const dofly=0 xf9,0 xb0,0 x92,0 x80,0 xf9,0 xb0,0 x92,0 x80;/ code table 13581358unsigned char code seg=0 x7f,0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe;/分別對(duì)應(yīng)相應(yīng)的數(shù)碼管點(diǎn)亮/void delay(unsigned int cnt) while(-cnt);/main() unsigned char i; while(1) P0=doflyi;/取顯示數(shù)據(jù)

44、P2=seg7-i; /取段碼 delay(200); /掃描間隙延時(shí) i+; if(8=i) /檢測(cè)8位掃描完全? i=0; -#include sbit key1=P30;/定義按鍵位置sbit key2=P31;sbit key3=P32;sbit key4=P33;/unsigned char const dofly=0 xf9,0 xb0,0 x92,0 x80;/ code table 1358/void delay(unsigned int cnt) while(-cnt);/main() P2=0 x00;/數(shù)碼管全亮 while(1) if(!key1) /按下相應(yīng)的按鍵,數(shù)

45、碼管顯示相應(yīng)的碼值 P0=0 xf9;/1 if(!key2) P0=0 xa4;/2 if(!key3) P0=0 xb0;/3 if(!key4) P0=0 x99;/4 /使用過(guò)程中如果碰到干擾情況,請(qǐng)?jiān)黾尤ザ冻绦?#include #include#defineUchar unsigned char#define Uint unsigned int/ LCM1602A端口地址定義char xdata Lcd1602CmdPort _at_ 0 x7cff;/E=1 RS=0 RW=0char xdata Lcd1602WdataPort _at_ 0 x7eff; /E =1 RS=1

46、 RW=0char xdata Lcd1602StatusPort _at_ 0 x7dff; /CS=1 RS=0 RW=1#define Busy0 x80 / 忙判別位code char exampl=For an example. - By xiaoqin;void Delay400Ms(void);void Delay5Ms(void);void LcdWriteData( char dataW );void LcdWriteCommand( Uchar CMD,Uchar AttribC );void LcdReset( void );void Display( Uchar dd

47、);void DispOneChar(Uchar x,Uchar y,Uchar Wdata);void ePutstr(Uchar x,Uchar y, Uchar code *ptr);/主程序void main(void)Uchar temp;Delay400Ms();/啟動(dòng)時(shí)必須的延時(shí),等待lcm進(jìn)入工作狀態(tài)LcdReset(); /這也是必需的.初始化temp = 32;ePutstr(0,0,exampl); /上面一行顯示一個(gè)預(yù)定字符串Delay400Ms(); /保留顯示內(nèi)容Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();

48、Delay400Ms();Delay400Ms();Delay400Ms();while(1)temp &= 0 x7f; /只顯示ASCII字符if (temp31)l+;for (i=0;il;i+) DispOneChar(x+,y,ptri);if ( x = 16 )x = 0; y = 1;/ 演示一行連續(xù)字符串,配合上位程序演示移動(dòng)字串void Display( Uchar dd ) Uchar i;for (i=0;i16;i+) DispOneChar(i,1,dd+);dd &= 0 x7f;if (dd32) dd=32;/ 顯示光標(biāo)定位void LocateXY( ch

49、ar posx,char posy) Uchar temp;temp = posx & 0 xf;posy &= 0 x1;if ( posy )temp |= 0 x40;temp |= 0 x80;LcdWriteCommand(temp,0);/ 按指定位置顯示數(shù)出一個(gè)字符void DispOneChar(Uchar x,Uchar y,Uchar Wdata) LocateXY( x, y ); / 定位顯示地址LcdWriteData( Wdata ); / 寫(xiě)字符/ 初始化程序, 必須按照產(chǎn)品資料介紹的初始化過(guò)程進(jìn)行void LcdReset( void ) LcdWriteCom

50、mand( 0 x38, 0);/ 顯示模式設(shè)置(不檢測(cè)忙信號(hào))Delay5Ms();LcdWriteCommand( 0 x38, 0);/ 共三次Delay5Ms();LcdWriteCommand( 0 x38, 0);Delay5Ms();LcdWriteCommand( 0 x38, 1);/ 顯示模式設(shè)置(以后均檢測(cè)忙信號(hào)) LcdWriteCommand( 0 x08, 1);/ 顯示關(guān)閉 LcdWriteCommand( 0 x01, 1);/ 顯示清屏LcdWriteCommand( 0 x06, 1);/ 顯示光標(biāo)移動(dòng)設(shè)置LcdWriteCommand( 0 x0c, 1)

51、;/ 顯示開(kāi)及光標(biāo)設(shè)置/ 寫(xiě)控制字符子程序: E=1 RS=0 RW=0void LcdWriteCommand( Uchar CMD,Uchar AttribC ) if (AttribC) while( Lcd1602StatusPort & Busy );/ 檢測(cè)忙信號(hào)?Lcd1602CmdPort = CMD;/ 當(dāng)前位置寫(xiě)字符子程序: E =1 RS=1 RW=0void LcdWriteData( char dataW ) while( Lcd1602StatusPort & Busy );/ 檢測(cè)忙信號(hào)Lcd1602WdataPort = dataW;/ 短延時(shí)void Dela

52、y5Ms(void)Uint i = 5552;while(i-);/長(zhǎng)延時(shí)void Delay400Ms(void)Uchar i = 5;Uint j;while(i-)j=7269;while(j-);-可編程邏輯器件課程簡(jiǎn)介:本課程主要介紹在電子系統(tǒng)設(shè)計(jì)中當(dāng)前很流行的專門用于數(shù)字電路與系統(tǒng)設(shè)計(jì)的可編程邏輯器件及設(shè)計(jì)方法。通俗地講,就是利用可編程邏輯器件來(lái)設(shè)計(jì)電子系統(tǒng)的技術(shù),也就是通常所說(shuō)的CPLD/FPGA應(yīng)用技術(shù)。它是EDA技術(shù)(電子設(shè)計(jì)自動(dòng)化)的一個(gè)重要分支。本課程是一門工具性的課程。本課程主要包括以下幾個(gè)方面的內(nèi)容:EDA技術(shù)概述可編程邏輯器件的原理與系統(tǒng)設(shè)計(jì)Altera公司的M

53、AX+PLUS II軟件的使用VHDL語(yǔ)言編程基礎(chǔ)系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)本課程主要特點(diǎn):理論較少,實(shí)踐性強(qiáng),主要靠自己多動(dòng)手編程設(shè)計(jì),并上機(jī)實(shí)驗(yàn)本課程的先修課程:數(shù)字電路(邏輯門,組合邏輯電路設(shè)計(jì),時(shí)序邏輯電路設(shè)計(jì))組合邏輯:邏輯門時(shí)序邏輯:觸發(fā)器、時(shí)鐘信號(hào)EDA技術(shù)概述1. EDA技術(shù)的發(fā)展EDA:Electronics Design Automation,電子設(shè)計(jì)自動(dòng)化電子系統(tǒng)硬件設(shè)計(jì)的一般過(guò)程:功能設(shè)計(jì)電路原理設(shè)計(jì)PCB(Printed Circuit Board,印刷電路板)設(shè)計(jì)與制作元件安裝調(diào)試過(guò)去:狹義的電路板的設(shè)計(jì)(Protel等):布線、檢查、分析采用專用集成電路設(shè)計(jì):效率高,體積小,電

54、路簡(jiǎn)單,但不一定總能找到正好符合設(shè)計(jì)者的特殊要求的電路芯片,能找到最好,成本稍高,但貨源和價(jià)格受供貨商的限制。例:遙控小車、計(jì)算器、電子鐘、門鈴等。采用通用集成電路設(shè)計(jì):需要設(shè)計(jì)電路,采用若干片芯片組合來(lái)實(shí)現(xiàn)所需功能。效率稍低,體積稍大,但貨源很廣,成本低。如74系列芯片。缺點(diǎn):a)當(dāng)功能較復(fù)雜時(shí),電路也很復(fù)雜,體積大,可靠性降低;b)一旦設(shè)計(jì)完成后,電路修改困難(反復(fù)改板,困難,周期長(zhǎng));c)調(diào)試?yán)щy,不便于仿真測(cè)試?,F(xiàn)在:采用可編程邏輯器件設(shè)計(jì):是當(dāng)前新興的一類專門用于電路系統(tǒng)設(shè)計(jì)的通用的可編程芯片,設(shè)計(jì)者可以在電腦上通過(guò)軟件設(shè)計(jì)自己所需的電路或系統(tǒng),然后通過(guò)電纜下載到這類可編程芯片中,使

55、該芯片具有自己所需的功能,并可方便地進(jìn)行仿真調(diào)試和功能測(cè)試,而且可以在線地進(jìn)行修改而無(wú)需改動(dòng)外部連線。好處:大大縮短開(kāi)發(fā)周期,大大減少設(shè)計(jì)調(diào)試的工作量,提高開(kāi)發(fā)效率和設(shè)計(jì)質(zhì)量,降低開(kāi)發(fā)費(fèi)用,提高產(chǎn)品競(jìng)爭(zhēng)力。(PCB板的改動(dòng)和升級(jí)周期很長(zhǎng),費(fèi)用高)。特點(diǎn):體積小,集成度高,設(shè)計(jì)、修改、測(cè)試方便,能在線修改。軟件硬化,運(yùn)行速度比軟件快得多(例如,數(shù)字濾波,信號(hào)變換、編碼、解碼)EDA現(xiàn)狀:片上系統(tǒng)級(jí)設(shè)計(jì)、設(shè)計(jì)驗(yàn)證與仿真、可優(yōu)化、可以設(shè)計(jì)與器件分離、可內(nèi)嵌微處理器核、IP核等。片上系統(tǒng)設(shè)計(jì)(SOC:System On Chip),借助有關(guān)軟件(如MAX +PLUS II),自己設(shè)計(jì)自己系統(tǒng)所需的專用

56、芯片(ASIC:Application Specific Integrated Circuits)。片上可編程系統(tǒng)設(shè)計(jì)(SOPC:System On Programmable Chip)EDA發(fā)展趨勢(shì):SOPC、內(nèi)嵌:MPU/MCU核、DSP核、存儲(chǔ)器核、數(shù)/?;旌掀骷?、RF處理器等,效邏輯門數(shù)、密度、工作電壓、時(shí)鐘頻率等。2. EDA技術(shù)的構(gòu)成要素四大要素:1. 大規(guī)??删幊唐骷ㄐ酒㏄LD(Programmable Logic Device,可編程邏輯器件)低密度PLD:PAL(早期),GAL(小規(guī)模,現(xiàn)在仍有應(yīng)用)、PLA(早期)高密度PLD:CPLD(復(fù)雜可編程邏輯器件)、FPGA(

57、現(xiàn)場(chǎng)可編程門陣列)、ISP-PLD(在系統(tǒng)可編程邏輯器件)三大國(guó)際主流公司(前述)PAC(Programmable Analog Circuit,可編程模擬器件)Lattice公司的ispPAC芯片,內(nèi)含:運(yùn)放、電阻、電容等可用元件2. 硬件描述語(yǔ)言(HDL,Hardware Description Language)類似于C語(yǔ)言,用于在設(shè)計(jì)電路/系統(tǒng)時(shí),描述所設(shè)計(jì)電路的功能、信號(hào)連接關(guān)系、時(shí)序等,相當(dāng)于一種編程語(yǔ)言。用HDL語(yǔ)言設(shè)計(jì)好電路/系統(tǒng),再進(jìn)行仿真,通過(guò)后寫(xiě)入PLD芯片,完成設(shè)計(jì)。常用:VHDL、Verilog HDL3. 軟件開(kāi)發(fā)工具它是一類集成開(kāi)發(fā)環(huán)境,將電路設(shè)計(jì)(支持VHDL語(yǔ)

58、言)、仿真驗(yàn)證、輸出下載等功能集成在一起。各大PLD生產(chǎn)廠商都為自己的芯片開(kāi)發(fā)推出了相應(yīng)的集成開(kāi)發(fā)軟件。見(jiàn)前表。4. 電腦書(shū)上講的“實(shí)驗(yàn)開(kāi)發(fā)系統(tǒng)”是為學(xué)習(xí)而用的,不是今后從事EDA工作必須的。但為了運(yùn)行軟件開(kāi)發(fā)工具,電腦是不可缺少的。3. EDA軟件系統(tǒng)的構(gòu)成設(shè)計(jì)輸入子模塊設(shè)計(jì)數(shù)據(jù)庫(kù)子模塊分析驗(yàn)證子模塊綜合仿真子模塊布局布線子模塊4. 基于可編程邏輯器件EDA技術(shù)設(shè)計(jì)流程本節(jié)介紹利用可編程邏輯器件和EDA技術(shù)設(shè)計(jì)電子電路/系統(tǒng)的流程。流程如P7的圖1-1所示。1. 設(shè)計(jì)準(zhǔn)備:功能確定所需資源估計(jì)速度要求選擇器件2. 設(shè)計(jì)輸入:用某種方式來(lái)描述所需的電路、系統(tǒng)。原理圖輸入方式層次圖方式(用狀態(tài)圖

59、或波形圖、真值表等)HDL程序方式3. 設(shè)計(jì)實(shí)現(xiàn):主要是器件配置:由不針對(duì)任何器件的設(shè)計(jì)輸入,轉(zhuǎn)換成針對(duì)指定器件(廠家、型號(hào))的文件。這是通過(guò)集成開(kāi)發(fā)環(huán)境軟件中的有關(guān)設(shè)置來(lái)實(shí)現(xiàn)的。在第三章介紹MAX+PLUS II時(shí)將會(huì)學(xué)到具體方法。4. 器件編程與配置:就是通常所說(shuō)的“下載”,將編譯好的設(shè)計(jì)文件通過(guò)下載電纜下載到目標(biāo)芯片CPLD/FPGA中去。對(duì)CPLD來(lái)說(shuō)是將JED文件下載到CPLD芯片中去(Programming);對(duì)FPGA來(lái)說(shuō)是將BG文件配置到FPGA芯片中去(Configurating)。下載時(shí)采用專用下載電纜,一端為并口,另一端是一個(gè)并口到JTAG口的轉(zhuǎn)換接頭,見(jiàn)P299下圖F-

60、2。5. 設(shè)計(jì)驗(yàn)證:在以上每步完成后,都可進(jìn)行有關(guān)的仿真,以驗(yàn)證設(shè)計(jì)是否正確,并非一定要等到下載到芯片后才進(jìn)行。如,時(shí)序仿真??删幊踢壿嬈骷c數(shù)字系統(tǒng)的設(shè)計(jì)可編程邏輯器件是用于數(shù)字電路/系統(tǒng)設(shè)計(jì)的。本章學(xué)習(xí)PLD的分類、原理、典型器件,及基于PLD的數(shù)字系統(tǒng)的設(shè)計(jì)方法。1.可編程邏輯器件概述一、分類:數(shù)字可編程邏輯器件,模擬可編程器件二、PLD的發(fā)展與應(yīng)用現(xiàn)在的PLD公用性強(qiáng),批量大,成本低,可靠性高。用戶開(kāi)發(fā)時(shí),自己既是芯片的設(shè)計(jì)者,也是芯片的制造者。通常在產(chǎn)品的研發(fā)階段,為了提高研發(fā)速度,降低開(kāi)發(fā)費(fèi)用,多采用PLD進(jìn)行設(shè)計(jì)(產(chǎn)品的原型設(shè)計(jì))。等到產(chǎn)品大批量生產(chǎn)時(shí),可把PLD再轉(zhuǎn)換成全定制的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論