版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 單片機(jī)原理及應(yīng)用</b></p><p><b> 課程設(shè)計(jì)</b></p><p> 學(xué)院名稱: 計(jì)算機(jī) </p><p> 專業(yè)班級: 通信0902 </p><p> 學(xué)生
2、姓名: </p><p> 學(xué)生學(xué)號: </p><p> 指導(dǎo)教師姓名: </p><p> 2012年 1 月</p><p> 點(diǎn)陣式液晶顯示屏的顯示程序設(shè)計(jì)</p>
3、;<p><b> 一、設(shè)計(jì)目的</b></p><p> 1.熟練掌握C51系統(tǒng)仿真開發(fā)系統(tǒng)的應(yīng)用。</p><p> 2.加強(qiáng)單片機(jī)的綜合運(yùn)用能力、提高單片機(jī)的軟件編程和調(diào)試能力,為以后的學(xué)習(xí)和開發(fā)工作打下良好基礎(chǔ)。</p><p> 3.掌握的液晶的工作原理以及應(yīng)用設(shè)計(jì)。</p><p>
4、4.掌握小系統(tǒng)開發(fā)設(shè)計(jì)的流程以及設(shè)計(jì)思路。</p><p><b> 二、設(shè)計(jì)方案</b></p><p><b> 實(shí)驗(yàn)要求:</b></p><p> 1)從下到上滾動(dòng)顯示:“江蘇大學(xué)計(jì)算機(jī)學(xué)院”然后交替顯示:“單片機(jī)課程設(shè)計(jì)”“液晶點(diǎn)陣顯示屏程序設(shè)計(jì)”“作者姓名、班級、學(xué)號” </p><
5、p> 2)能進(jìn)行正常的模擬量采樣值顯示(溫度、壓力、電位) 。</p><p> 3) 改變字庫的內(nèi)容,顯示其它漢字。</p><p> 4) 改變頁地址或列地址,使顯示的內(nèi)容改變位置。 </p><p> 5)其它功能(如左、右移,上下卷、顯示圖片等)。</p><p><b> 設(shè)計(jì)思路:</b>
6、;</p><p> 由于實(shí)驗(yàn)指導(dǎo)書中做過液晶顯示和模數(shù)轉(zhuǎn)換得實(shí)驗(yàn),根據(jù)兩個(gè)實(shí)驗(yàn)的功能實(shí)現(xiàn)和流程原理進(jìn)行設(shè)計(jì)</p><p> 將程序分成三個(gè)模塊:</p><p> 主函數(shù)模塊main.c</p><p> 模數(shù)轉(zhuǎn)換模塊ADC.c</p><p> 液晶顯示模塊KS0108.c</p><
7、;p> 其中讓主函數(shù)模塊做一些初始化和函數(shù)調(diào)用工作,模數(shù)轉(zhuǎn)換模塊主要是將溫度,壓力,點(diǎn)位的值轉(zhuǎn)化為數(shù)字量供液晶顯示用,液晶顯示模塊得到模數(shù)轉(zhuǎn)換模塊傳遞過來的數(shù)字量顯示到液晶面板上。</p><p><b> 程序流程圖:</b></p><p><b> 1系統(tǒng)主流程圖如下</b></p><p><b&
8、gt; 2主函數(shù)流程圖</b></p><p><b> 3 顯示模塊流程圖</b></p><p> 4 模數(shù)轉(zhuǎn)換模塊流程圖</p><p><b> 主要的源程序及注釋</b></p><p><b> 主函數(shù):</b></p><
9、p> #include "c8051f020.h" </p><p> #include <intrins.h> </p><p> void Delay1us(unsigned char us)//延時(shí)us</p><p><b> {</b></p><p> whil
10、e (us)</p><p><b> {</b></p><p> _nop_(); _nop_(); _nop_(); _nop_(); _nop_();</p><p><b> --us;</b></p><p><b> }</b></p>&l
11、t;p><b> }</b></p><p> void SYSCLK_Init (void)//系統(tǒng)時(shí)鐘初始化</p><p><b> {</b></p><p> int i; // delay counter</p><p&
12、gt; OSCXCN = 0x67; // start external oscillator with</p><p> // 18.432MHz crystal</p><p> for (i=0; i < 256; i++) ; // Wait for osc. to start up</p>&
13、lt;p> while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle</p><p> OSCICN = 0x88; // select external oscillator as SYSCLK</p><p> // source and e
14、nable missing clock</p><p> // detector</p><p> //OSCICN = 0x07; //interal 16MHZ</p><p><b> }</b></p><p> #define PRT0CF P0MDOUT</p><p>
15、 #define PRT1CF P1MDOUT</p><p> #define PRT2CF P2MDOUT</p><p> void PORT_Init (void) //串口初始化</p><p><b> {</b></p><p> XBR0 = 0x07;
16、 // Enable SMBus, SPI0, and UART0</p><p> XBR1 = 0x00;</p><p> XBR2 = 0x44; // Enable crossbar and weak pull-ups</p><p> EMI0CF = 0x2
17、7;</p><p> EMI0TC = 0x21;</p><p> P74OUT = 0xFF;</p><p> P0MDOUT = 0x15;</p><p> P1MDOUT |= 0x3C; //P1.2-P1.5推挽輸出</p><p> P1 &= 0xc3;
18、//P1.2-P1.5=0</p><p><b> }</b></p><p> void SPI0_Init (void) //spi0初始化</p><p><b> {</b></p><p> SPI0CFG = 0x07;
19、 // data sampled on 1st SCK rising edge</p><p> // 8-bit data words</p><p> SPI0CFG|=0xC0;//CKPOL =1;</p><p> SPI0CN = 0x03; // Master mode; SPI e
20、nabled; flags</p><p> // cleared</p><p> SPI0CKR = SYSCLK/2/8000000-1; // SPI clock <= 8MHz (limited by </p><p> // EEPROM spec.)</p><p><b> }</b&
21、gt;</p><p> unsigned char Count1ms;</p><p> void Timer0_Init (void) //計(jì)數(shù)器0初始化</p><p><b> {</b></p><p> CKCON|=0x8;</p><p>
22、TMOD|=0x1; //16Bit</p><p> Count1ms=10;</p><p> TR0 = 0; // STOP Timer0</p><p> TH0 = (-SYSCLK/1000) >> 8; // set Timer0 to overflow in 1m
23、s</p><p> TL0 = -SYSCLK/1000;</p><p> TR0 = 1; // START Timer0</p><p> IE|= 0x2; </p><p><b> }</b></p><p> void Timer0_ISR (void) inter
24、rupt 1 //1ms </p><p><b> {</b></p><p> TH0 = (-SYSCLK/1000) >> 8; </p><p> TL0 = -SYSCLK/1000;</p><p> if (Count1ms) Count1ms--;</p><
25、;p><b> }</b></p><p> void Delay1ms(unsigned char T) //延時(shí)1ms</p><p><b> {</b></p><p> Count1ms=T;</p><p> while (Count1ms);</p&
26、gt;<p><b> }</b></p><p> void Delay1s(unsigned char T) //延時(shí)1s</p><p><b> {</b></p><p><b> while (T)</b></p><p><
27、;b> {</b></p><p> Delay1ms(200);</p><p> Delay1ms(200);</p><p> Delay1ms(200);</p><p> Delay1ms(200);</p><p> Delay1ms(200);</p><
28、p><b> T--;</b></p><p><b> }</b></p><p><b> }</b></p><p> void TestLCD(void);//測試初始畫面</p><p> char GetKeyValue(void);//獲取鍵值&l
29、t;/p><p> void init_adc(void);</p><p> unsigned int GetADCValue(char No);</p><p> void Display (char *DispBuf,char ShowDot,char x,char y);</p><p> void menulcd ();<
30、/p><p> void zuoyouyi();</p><p> void caiji ();</p><p> void main (void) </p><p><b> {</b></p><p><b> char i;</b></p><
31、p> unsigned int u;</p><p><b> char Num;</b></p><p> WDTCN = 0xde;</p><p> WDTCN = 0xad; //關(guān)看門狗</p><p> SYSCLK_Init (); //初始化時(shí)鐘<
32、/p><p> Timer0_Init();//初始化定時(shí)器</p><p> PORT_Init (); //初始化IO口</p><p> SPI0_Init (); //初始化SPI0</p><p> init_adc();</p><p> CPT1CN|=
33、0x80;//使能比較器1</p><p> REF0CN = 0x07; //使能片內(nèi)參考電壓</p><p> DAC0CN |= 0x80;//使能DAC0</p><p> DAC0H=0;DAC0L=0;</p><p> EA=1;//開中斷</p><p><b>
34、Num=0;</b></p><p> menulcd ();</p><p> u= GetADCValue(Num);//獲取按鍵值</p><p><b> for (;;)</b></p><p><b> {</b></p><p> i=Ge
35、tKeyValue();</p><p> if ((i<1)||(i>3))</p><p><b> Num=i;</b></p><p> Delay1ms(100);</p><p> if (Num==0)</p><p><b> {</b>
36、</p><p> menulcd ();//按0顯示主菜單</p><p><b> }</b></p><p> else if(Num==4)</p><p><b> {</b></p><p> TestLCD();//按4顯示開始畫面</p>
37、<p><b> }</b></p><p> else if(Num==5)</p><p><b> {</b></p><p> zuoyouyi();//按5漢字,圖畫左右移動(dòng)</p><p><b> }</b></p><
38、p> else if(Num==6)</p><p><b> {</b></p><p> caiji ();//按6采集溫度,電壓,壓力</p><p><b> }</b></p><p> u = GetADCValue(Num);</p><p>&
39、lt;b> }</b></p><p><b> }</b></p><p><b> KS0108模塊:</b></p><p> #include "c8051F020.h"</p><p> #include <intrins.h>&
40、lt;/p><p> #include "dianzhen.c"//所有用到的漢字,圖畫點(diǎn)陣</p><p> #define LCD_DATA P2</p><p> #define LCD_RS P30</p><p> #define LCD_RW P31</p><p> #defin
41、e LCD_E P32</p><p> #define LCD_CS1 P33</p><p> #define LCD_CS2 P34</p><p> #define LCD_RST P35</p><p> sbitHD7279_DAT=P1^7;</p><p> sbitHD7279_
42、CLK=P1^6;</p><p> #define NOSELECT7279 P5 |= 0x80//SPICS4(P57)=1</p><p> #define SELECT7279 P5 &= ~(0x80) //SPICS4(P57)=0;</p><p> #define Set7279DAT HD7279_DAT=1&l
43、t;/p><p> #define Clr7279DAT HD7279_DAT=0</p><p> #define Set7279CLK HD7279_CLK=1</p><p> #define Clr7279CLK HD7279_CLK=0</p><p><b> //7279模塊</b><
44、;/p><p> void Delay1ms(unsigned char T);</p><p> void Delay1s(unsigned char T);</p><p> void Delay1us(unsigned char T);</p><p> void Send7279Byte(unsigned char ch)//發(fā)送
45、</p><p><b> {</b></p><p><b> char i;</b></p><p> SELECT7279; //置CS低電平 </p><p> Delay1us(50);//延時(shí)50μ</p><p> for (i=0;i
46、<8;i++)</p><p><b> {</b></p><p> if (ch&0x80)//輸出7位到HD7279A的DATA端 </p><p><b> {</b></p><p> Set7279DAT;</p><p><b&g
47、t; }</b></p><p><b> else</b></p><p><b> {</b></p><p> Clr7279DAT;</p><p><b> }</b></p><p> Set7279CLK;//置
48、CLK高電平 </p><p> ch=ch<<1;//待發(fā)數(shù)據(jù)左移 </p><p> Delay1us(8);//延時(shí)8μ</p><p> Clr7279CLK;//置CLK低電平 </p><p> Delay1us(8);//延時(shí)50μ</p><p><b> }
49、</b></p><p> Clr7279DAT;//發(fā)送完畢,DATA端置低,返回 </p><p><b> }</b></p><p> unsigned char Receive7279Byte(void)//接收</p><p><b> {</b></p&
50、gt;<p> unsigned char i,ch;</p><p><b> ch=0;</b></p><p> Set7279DAT;//DATA端置為高電平,輸入狀態(tài)</p><p> Delay1us(50);//延時(shí)50μ</p><p> for (i=0;i<
51、8;i++)</p><p><b> {</b></p><p> Set7279CLK;//置CLK高電平</p><p> Delay1us(8);//延時(shí)8μ</p><p> ch=ch<<1;//接收數(shù)據(jù)左移1位</p><p> if (HD7279_
52、DAT)</p><p> ch+=1;//接收1位數(shù)據(jù)</p><p> Clr7279CLK;//置CLK低電平</p><p> Delay1us(8);//延時(shí)8μ</p><p><b> }</b></p><p> Clr7279DAT;//接收完畢,DAT
53、A端重新置成低電平(輸出狀態(tài))</p><p> return ch;</p><p><b> }</b></p><p> unsigned char code BdSeg[]={</p><p> 0x7e,0x30,0x6d,0x79, // 0 1 2 3 </p><p>
54、0x33,0x5b,0x5f,0x70, // 4 5 6 7</p><p> 0x7f,0x7b,0x77,0x1f, // 8 9 a b</p><p> 0x4e,0x3d,0x4f,0x47, // c d e f</p><p> 0x00,0x01}; </p><p> char GetKeyValue(void)/
55、/獲取鍵值</p><p><b> {</b></p><p> char KeyValue;</p><p> if (CPT1CN&0x40) return -1;//無鍵按下 </p><p> Send7279Byte(0x15);//發(fā)讀鍵盤指令 </p><p>
56、 KeyValue=Receive7279Byte();</p><p> NOSELECT7279; //置CS高電平 </p><p> return KeyValue; </p><p><b> }</b></p><p> //KS0108模塊</p><p> #
57、define SELECTCS 0</p><p> void LCD_WaitReady1(void) //判斷LCD控制芯片KS0108是否忙</p><p><b> {</b></p><p> LCD_DATA=0xff;</p><p><b> _nop_();</b><
58、/p><p> LCD_CS2=SELECTCS;</p><p><b> LCD_RW=1;</b></p><p><b> LCD_RS=0;</b></p><p><b> LCD_E=1;</b></p><p> while (LC
59、D_DATA&0x80);</p><p> LCD_CS2=!SELECTCS;</p><p><b> }</b></p><p> void LCD_WaitReady2(void) //判斷LCD控制芯片KS0108是否忙</p><p><b> {</b></p&
60、gt;<p> LCD_DATA=0xff;</p><p><b> _nop_();</b></p><p> LCD_CS1=SELECTCS;</p><p><b> LCD_RW=1;</b></p><p><b> LCD_RS=0;</b&g
61、t;</p><p><b> LCD_E=1;</b></p><p> while (LCD_DATA&0x80);</p><p> LCD_CS1=!SELECTCS;</p><p><b> }</b></p><p> void LCD_Wri
62、teCommand1(char ch) //向LCD控制芯片KS0108發(fā)送控制命令</p><p><b> {</b></p><p> LCD_WaitReady1();</p><p> LCD_CS2=SELECTCS;</p><p><b> LCD_RW=0;</b><
63、/p><p><b> LCD_RS=0;</b></p><p> LCD_DATA=ch;</p><p><b> LCD_E=1;</b></p><p><b> LCD_E=0;</b></p><p> LCD_CS2=!SELECT
64、CS;</p><p><b> }</b></p><p> void LCD_WriteCommand2(char ch)//向LCD控制芯片KS0108發(fā)送控制命令</p><p><b> {</b></p><p> LCD_WaitReady2();</p>&l
65、t;p> LCD_CS1=SELECTCS;</p><p><b> LCD_RW=0;</b></p><p><b> LCD_RS=0;</b></p><p> LCD_DATA=ch;</p><p><b> LCD_E=1;</b></p&
66、gt;<p><b> LCD_E=0;</b></p><p> LCD_CS1=!SELECTCS;</p><p><b> }</b></p><p> void LCD_WriteData1(char ch)//向LCD控制芯片KS0108發(fā)送數(shù)據(jù)命令</p><p&g
67、t;<b> {</b></p><p> LCD_WaitReady1();</p><p> LCD_CS2=SELECTCS;</p><p><b> LCD_RW=0;</b></p><p><b> LCD_RS=1;</b></p>&l
68、t;p> LCD_DATA=ch;</p><p><b> LCD_E=1;</b></p><p><b> LCD_E=0;</b></p><p> LCD_CS2=!SELECTCS;</p><p><b> }</b></p><
69、;p> void LCD_WriteData2(char ch)//向LCD控制芯片KS0108發(fā)送數(shù)據(jù)命令</p><p><b> {</b></p><p> LCD_WaitReady2();</p><p> LCD_CS1=SELECTCS;</p><p><b> LCD_RW
70、=0;</b></p><p><b> LCD_RS=1;</b></p><p> LCD_DATA=ch;</p><p><b> LCD_E=1;</b></p><p><b> LCD_E=0;</b></p><p>
71、 LCD_CS1=!SELECTCS;</p><p><b> }</b></p><p> void LCD_WriteZM(char x,char y,char *Dot) { //顯示16*16點(diǎn)陣漢字</p><p><b> char i;</b></p><p> for
72、(i=0;i<16;i++){</p><p> if ((x+i%8)<64){</p><p> LCD_WriteCommand1(0xB8+y+i/8);</p><p> LCD_WriteCommand1(0x40+x+i%8);</p><p> LCD_WriteData1(Dot[i]);}</p
73、><p> else{LCD_WriteCommand2(0xB8+y+i/8);</p><p> LCD_WriteCommand2(0x40+x-64+i%8);</p><p> LCD_WriteData2(Dot[i]);}}}</p><p> void LCD_WriteHZ(char x,char y,char *Dot
74、) //顯示16*16點(diǎn)陣漢字</p><p><b> {</b></p><p><b> char i;</b></p><p> for (i=0;i<32;i++)</p><p><b> {</b></p><p> if
75、((x+i%16)<64)</p><p><b> {</b></p><p> LCD_WriteCommand1(0xB8+y+i/16);</p><p> LCD_WriteCommand1(0x40+x+i%16);</p><p> LCD_WriteData1(Dot[i]);</p&
76、gt;<p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> LCD_WriteCommand2(0xB8+y+i/16);</p><p> LCD_WriteCommand2(
77、0x40+x-64+i%16);</p><p> LCD_WriteData2(Dot[i]);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void L
78、CD_WriteHZcircle(char x,char y,char *Dot) //顯示循環(huán)漢字</p><p><b> {</b></p><p><b> char i;</b></p><p> for (i=0;i<32;i++)</p><p><b> {&
79、lt;/b></p><p> if ((x+i%16)<64)</p><p><b> {</b></p><p> LCD_WriteCommand1(0xB8+y+i/16);</p><p> LCD_WriteCommand1(0x40+x+i%16);</p><p&
80、gt; LCD_WriteData1(Dot[i]);</p><p><b> }</b></p><p> else if((x+i%16)>63&&(x+i%16)<=127)</p><p><b> {</b></p><p> LCD_WriteCo
81、mmand2(0xB8+y+i/16);</p><p> LCD_WriteCommand2(0x40+x-64+i%16);</p><p> LCD_WriteData2(Dot[i]);</p><p><b> }</b></p><p><b> else</b></p&g
82、t;<p><b> {</b></p><p> LCD_WriteCommand1(0xB8+y+i/16);</p><p> LCD_WriteCommand1(0x40+(x+i%16)%128);</p><p> LCD_WriteData1(Dot[i]);</p><p><
83、b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void InitLCD(void) //初始化LCD</p><p><b> {</b></p><
84、;p><b> char i,j;</b></p><p> LCD_RST=0;</p><p> Delay1ms(1);</p><p> LCD_RST=1;</p><p> LCD_WriteCommand1(0xc0);</p><p> LCD_WriteCom
85、mand2(0xc0);</p><p> LCD_WriteCommand1(0x3f); //開顯示</p><p> LCD_WriteCommand2(0x3f);</p><p> for (j=0;j<8;j++)//清屏</p><p><b> {</b></p>&
86、lt;p> LCD_WriteCommand1(0xB8+j);//清左半屏</p><p> LCD_WriteCommand1(0x40);</p><p> for (i=0;i<64;i++)</p><p> LCD_WriteData1(0x00);</p><p> LCD_WriteCommand2(0
87、xB8+j);//清右半屏</p><p> LCD_WriteCommand2(0x40);</p><p> for (i=0;i<64;i++)</p><p> LCD_WriteData2(0x00);</p><p><b> }</b></p><p><b&g
88、t; }</b></p><p> void DispBmp(char *buf,int n)//顯示一幅位圖</p><p><b> {</b></p><p><b> int i,j;</b></p><p> for (j=0;j<8;j++)//顯示位
89、圖</p><p><b> {</b></p><p> LCD_WriteCommand1(0xB8+j+n);</p><p> LCD_WriteCommand1(0x40);</p><p> for (i=0;i<64;i++)</p><p> LCD_WriteD
90、ata1(buf[(j*2)*64+i]);</p><p> LCD_WriteCommand2(0xB8+j+n);</p><p> LCD_WriteCommand2(0x40);</p><p> for (i=0;i<64;i++)</p><p> LCD_WriteData2(buf[(j*2+1)*64+i]
91、);</p><p><b> }</b></p><p><b> }</b></p><p> void DispBmp1(char *buf,int n,int m)//顯示一幅位圖//128*16,n為頁值,m為列值</p><p><b> {</b><
92、;/p><p><b> int i,j;</b></p><p> for (j=0;j<2;j++)//顯示位圖</p><p><b> {</b></p><p><b> if(m<=63)</b></p><p><
93、;b> {</b></p><p> LCD_WriteCommand1(0xB8+j+n);</p><p> LCD_WriteCommand1(0x40);</p><p> for(i=128-m;i<=127;i++)</p><p> LCD_WriteData1(buf[i+128*j]);&
94、lt;/p><p> for(i=0;i<=63-m;i++)</p><p> LCD_WriteData1(buf[i+128*j]);</p><p> LCD_WriteCommand2(0xB8+j+n);</p><p> LCD_WriteCommand2(0x40);</p><p> f
95、or(i=64-m;i<=127-m;i++)</p><p> LCD_WriteData2(buf[128*j+i]);</p><p><b> }</b></p><p><b> else</b></p><p><b> { </b></p&g
96、t;<p> LCD_WriteCommand2(0xB8+j+n);</p><p> LCD_WriteCommand2(0x40);</p><p> for(i=192-m;i<=127;i++)</p><p> LCD_WriteData2(buf[128*j+i]);</p><p> for(i
97、=0;i<=127-m;i++)</p><p> LCD_WriteData2(buf[128*j+i]);</p><p> LCD_WriteCommand1(0xB8+j+n);</p><p> LCD_WriteCommand1(0x40);</p><p> for(i=128-m;i<=191-m;i++
98、)</p><p> LCD_WriteData1(buf[i+128*j]);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void Display (c
99、har *DispBuf,char ShowDot,char x,char y) //液晶屏顯示溫度、電壓,壓力值</p><p><b> {</b></p><p> char i,ch,j=-16;</p><p> ShowDot--;</p><p> for (i=2;i<6;i++)<
100、/p><p><b> {</b></p><p><b> j+=16;</b></p><p> ch=DispBuf[i];</p><p> switch(ch)</p><p> {case 0: LCD_WriteZM(x+j,y,led0); br
101、eak;</p><p> case 1: LCD_WriteZM(x+j,y,led1); break;</p><p> case 2: LCD_WriteZM(x+j,y,led2); break;</p><p> case 3: LCD_WriteZM(x+j,y,led3); break;</p><p> c
102、ase 4: LCD_WriteZM(x+j,y,led4); break;</p><p> case 5: LCD_WriteZM(x+j,y,led5); break;</p><p> case 6: LCD_WriteZM(x+j,y,led6); break;</p><p> case 7: LCD_WriteZM(x+j,y,le
103、d7); break;</p><p> case 8: LCD_WriteZM(x+j,y,led8); break;</p><p> case 9: LCD_WriteZM(x+j,y,led9); break;</p><p> default: LCD_WriteZM(x+j,y,led); break;</p><
104、p><b> }</b></p><p> if(i==ShowDot)</p><p><b> {</b></p><p> LCD_WriteZM(x+j+8,y,Dot);</p><p><b> }</b></p><p>&
105、lt;b> }</b></p><p><b> }</b></p><p> unsigned int GetADCValue(char No);</p><p> char GetKeyValue(void);</p><p> void menulcd () //顯
106、示菜單</p><p><b> {</b></p><p> InitLCD();</p><p> DispBmp(menu,0);</p><p><b> }</b></p><p> void TestLCD(void) //開頭文字的顯示&l
107、t;/p><p><b> {</b></p><p><b> char i;</b></p><p> InitLCD();</p><p> DispBmp(ss,1);//江蘇大學(xué)計(jì)算機(jī)學(xué)院</p><p> Delay1s(0.5);</p>&
108、lt;p> for (i=0;i<64;i++)</p><p><b> {</b></p><p> Delay1ms(100);</p><p> LCD_WriteCommand1(0xc0+i%64);//設(shè)置起始行,實(shí)現(xiàn)向上滾動(dòng)</p><p> LCD_WriteCommand2(0
109、xc0+i%64);</p><p><b> }</b></p><p> Delay1s(2);</p><p> InitLCD();</p><p> DispBmp(ss1,1);//單片機(jī)課程設(shè)計(jì)</p><p> Delay1s(2);</p><p&g
110、t; InitLCD();</p><p> DispBmp(ss2,1);//液晶點(diǎn)陣顯示屏程序設(shè)計(jì)</p><p> Delay1s(2);</p><p> InitLCD();</p><p> DispBmp(ss3,1);//作者:柳健 班級:計(jì)算機(jī)0902 學(xué)號:3090601061</p><p&
111、gt; Delay1s(2);</p><p><b> }</b></p><p> void zuoyouyi()//漢字,圖畫左右移動(dòng)</p><p><b> {</b></p><p> char i,j,k;</p><p><b> k=1
112、;</b></p><p> for (j=0;j<8;j++)//漢字從左向右滾動(dòng)</p><p><b> {</b></p><p> for(i=0;i<14;i++)</p><p><b> {</b></p><p> Init
113、LCD();</p><p> LCD_WriteHZcircle(k,j,Han); //顯示16*16點(diǎn)陣漢字'漢'</p><p><b> k++;</b></p><p><b> }</b></p><p> Delay1ms(70);</p>&
114、lt;p><b> }</b></p><p> for (j=7;j>=0;j--)//漢字從右向左滾動(dòng)</p><p><b> {</b></p><p> for(i=0;i<14;i++)</p><p><b> {</b></p&
115、gt;<p> InitLCD();</p><p> LCD_WriteHZcircle(k,j,Han); //顯示16*16點(diǎn)陣漢字'漢'</p><p><b> k--;</b></p><p><b> }</b></p><p> Delay1
116、ms(70);</p><p><b> } </b></p><p><b> }</b></p><p> void caiji () //溫度,電壓,壓力采集</p><p><b> {</b></p><p><b&g
117、t; char i;</b></p><p> unsigned int w;</p><p> char No,buf[6];</p><p> No=1; </p><p> w = GetADCValue(1);</p><p><b> for (;;)</b&
118、gt;</p><p><b> {</b></p><p> i=GetKeyValue();</p><p> if ((i>=0)&&(i<=3))//如果按鍵大于3,則不讀入鍵值</p><p><b> No=i;</b></p><
119、p> Delay1ms(250);</p><p> buf[0]= No;</p><p> buf[1]= ' ';</p><p> buf[2]=(w%10000)/1000;</p><p> buf[3]=(w%1000)/100;</p><p> buf[4]=(w%1
120、00)/10;</p><p> buf[5]=(w%10);</p><p> if (No==1)</p><p><b> {</b></p><p> InitLCD();</p><p> DispBmp(tem,1);//按1采集到溫度</p><p>
121、; Display(buf,4,50,4);</p><p><b> }</b></p><p> else if (No==2)</p><p><b> {</b></p><p> InitLCD();</p><p> DispBmp(volte,1);
122、//按2采集到電壓</p><p> Display(buf,3,50,4);</p><p><b> } </b></p><p> else if (No==3)</p><p><b> {</b></p><p> InitLCD();<
123、/p><p> DispBmp(pres,1);//按3采集到壓力</p><p> Display(buf,4,50,4);</p><p><b> }</b></p><p><b> else</b></p><p> break;//按0回到主菜單
124、</p><p> w = GetADCValue(No);</p><p><b> }</b></p><p><b> }</b></p><p><b> ADC模塊:</b></p><p> #include "c8051
125、F020.h"</p><p> #include <intrins.h></p><p><b> /*</b></p><p> 壓力應(yīng)變片ADC試驗(yàn)</p><p> 運(yùn)行此程序,壓力值將在數(shù)碼管上顯示.用手觸摸應(yīng)變片</p><p><b> 觀察
126、壓力變化.</b></p><p><b> */</b></p><p> #define MUX_TEMP0x08</p><p> #define MUX_VOLT0x01</p><p> #define MUX_PRESS0x02</p><p>
127、 unsigned int idata Temp, Press, Volt;</p><p> unsigned char idata mux_select;</p><p> sfr16 ADC0 = 0xbe; // ADC0 data</p><p> void init_adc(void)</p>
128、<p><b> {</b></p><p> ADC0CN = 0x81; // ADC0 enabled; normal tracking</p><p> // mode; ADC0 conversions are initiated </p><p> // on writ
129、e to AD0BUSY; ADC0 data is</p><p> // left-justified</p><p> REF0CN = 0x07; // enable temp sensor, on-chip VREF,</p><p> // and VREF output buffer</p>
130、<p> mux_select = MUX_TEMP; // CPU on-chip temp sensor</p><p> AMX0SL = MUX_TEMP; </p><p> ADC0CF = (SYSCLK/2500000) << 3; // ADC conversion clock = 2.5MHz</p>&l
131、t;p> //ADC0CF |= 0x01; // PGA gain = 2</p><p> EIE2 &= ~0x02; // disable ADC0 EOC interrupt</p><p> EIE1 &= ~0x04; //
132、disable ADC0 window compare interrupt</p><p><b> }</b></p><p> // On-chip temperature</p><p> // AN1. 電位器</p><p> // AN2. 應(yīng)變片</p><p> v
133、oid read_analog_inputs(void)</p><p><b> {</b></p><p> long temp_long;</p><p> AD0INT = 0; // clear conversion complete indicator</p><p
134、> AD0BUSY = 1; // initiate conversion</p><p> while (AD0INT == 0); // wait for conversion complete</p><p> switch (mux_select)</p><p><b>
135、 {</b></p><p> case MUX_TEMP:</p><p> temp_long = ADC0 - 42380/2;</p><p> temp_long = (temp_long * 200L) / 156;</p><p> Temp=temp_long;</p><p>
136、 AMX0SL = MUX_VOLT;// Select AIN1 for next read</p><p> mux_select = MUX_VOLT;</p><p><b> break;</b></p><p> case MUX_VOLT:</p><p> temp_long = ADC0;&
137、lt;/p><p> Volt = 24*temp_long/655;</p><p> AMX0SL = MUX_PRESS;// Select on-chip temp sensor</p><p> mux_select = MUX_PRESS;</p><p><b> break;</b></p&
138、gt;<p> case MUX_PRESS:</p><p> temp_long = ADC0;</p><p> temp_long = 24*temp_long/655;</p><p> Press = temp_long;</p><p> AMX0SL = MUX_TEMP; </p>&
139、lt;p> mux_select = MUX_TEMP;</p><p><b> break;</b></p><p><b> default:</b></p><p> AMX0SL = MUX_TEMP;</p><p> mux_select = MUX_TEMP;<
140、/p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> unsigned int GetADCValue(char No)//采集數(shù)據(jù)</p><p><b&g
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計(jì)---點(diǎn)陣式液晶顯示屏的顯示程序設(shè)計(jì)
- 單片機(jī)原理及應(yīng)用課程設(shè)計(jì)--點(diǎn)陣式液晶顯示屏的顯示程序設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---液晶點(diǎn)陣顯示屏程序設(shè)計(jì)
- 課程設(shè)計(jì)--點(diǎn)陣式lcd液晶顯示屏設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---點(diǎn)陣電子顯示屏設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--點(diǎn)陣led電子顯示屏
- 單片機(jī)課程設(shè)計(jì)---點(diǎn)陣led電子顯示屏
- 單片機(jī)課程設(shè)計(jì)報(bào)告--- led點(diǎn)陣動(dòng)態(tài)顯示屏設(shè)計(jì)
- 液晶顯示屏lcd顯示接口設(shè)計(jì)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---led點(diǎn)陣電子顯示屏的設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)之led點(diǎn)陣電子顯示屏設(shè)計(jì)
- led顯示屏單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--漢字液晶顯示器顯示
- 單片機(jī)課程設(shè)計(jì)lcd顯示屏設(shè)計(jì)
- 基于單片機(jī)的led點(diǎn)陣顯示屏設(shè)計(jì)
- led點(diǎn)陣顯示屏課程設(shè)計(jì)
- 液晶課程設(shè)計(jì)--單片機(jī)液晶顯示器系統(tǒng)設(shè)計(jì)
- 液晶顯示器課程設(shè)計(jì)--tn-lcd顯示屏設(shè)計(jì)——電子體溫計(jì)顯示屏設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)---基于單片機(jī)控制的點(diǎn)陣式漢字電子顯示屏的設(shè)計(jì)
- 基于單片機(jī)的點(diǎn)陣電子顯示屏的設(shè)計(jì)
評論
0/150
提交評論