直流電機pid轉(zhuǎn)速閉環(huán)調(diào)速控制系統(tǒng)_第1頁
已閱讀1頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  基于uC/COS的直流電機PID轉(zhuǎn)速閉環(huán)調(diào)速控制系統(tǒng)Proteus仿真實現(xiàn)</p><p>  在工業(yè)自動控制系統(tǒng)和各種智能產(chǎn)品中常常會用用電動機進行驅(qū)動、傳動和控制,而現(xiàn)代智能控制系統(tǒng)中,對電機的控制要求越來越精確和迅速,對環(huán)境的適應要求越來越高。隨著科技的發(fā)展,通過對電機的改造,出現(xiàn)了一些針對各種應用要求的電機,如伺服電機、步進電機、開關(guān)磁阻電機等非傳統(tǒng)電機。但是在一些對位置控制要求不高

2、的電機控制系統(tǒng)如傳動控制系統(tǒng)中,傳統(tǒng)電機如直流電機乃有很大的優(yōu)勢,而要對其進行精確而又迅速的控制,就需要復雜的控制系統(tǒng)。隨著微電子和計算機的發(fā)展,數(shù)字控制系統(tǒng)應用越來越廣泛,數(shù)字控制系統(tǒng)有控制精確,硬件實現(xiàn)簡單,受環(huán)境影響小,功能復雜,系統(tǒng)修改簡單,有很好的人機交換界面等特點。</p><p>  在電機控制系統(tǒng)開發(fā)中,常常需要消耗各種硬件資源,系統(tǒng)構(gòu)建時間長,而在調(diào)試時很難對硬件系統(tǒng)進行修改,從而延長開發(fā)周期。

3、隨著計算機仿真技術(shù)的出現(xiàn)和發(fā)展,可用計算機對電機控制系統(tǒng)進行仿真,從而減小系統(tǒng)開發(fā)開支和周期。計算機仿真可分為整體仿真</p><p>  和實時仿真。整體仿真是對系統(tǒng)各個時間段對各個對象進行計算和分析,從而對各個對象的變化情況有直觀的整體的了解,即能對系統(tǒng)進行精確的預測,如Matlab就是一個典型的實時仿真軟件。實時仿真是對時間點的動態(tài)仿真,即隨著時間的推移它能動態(tài)仿真出當時系統(tǒng)的狀態(tài)。Proteus是一個實時

4、仿真軟件,用來仿真各種嵌入式系統(tǒng)。它能對各種微控制器進行仿真,本系統(tǒng)即用Proteus對直流電機控制系統(tǒng)進行仿真。</p><p>  在系統(tǒng)軟件開發(fā)中開發(fā)中可用操作系統(tǒng),也可不用操作系統(tǒng)。如用操作系統(tǒng),程序可實現(xiàn)模塊化,并能對系統(tǒng)資源進行統(tǒng)籌管理,最主要的是可實現(xiàn)多任務運行。如果需要多任務并行運行,并且需要一定的時間間隔,某些任務對時間的要求不高時,如不用操作系統(tǒng)則要占用定時器資源,并且對??臻g和硬件資源很難進

5、行管理,所以在這種情況下需要操作系統(tǒng)。本系統(tǒng)用操作系統(tǒng)uC/COS.</p><p>  uC/COS是一個完整的、可移植、可固化、可剪裁的占先式實時多任務內(nèi)核.uC/COS</p><p>  已經(jīng)有很多產(chǎn)品成功使用的案例且得到美國軍方的認證,說明了該系統(tǒng)的可靠性。uC/COS</p><p>  源代碼公開,代碼短,源代碼大部分是使用ANSI C編寫的,移植性和

6、裁減性好,功能強大,</p><p>  能可靠應用于各種控制系統(tǒng)中。</p><p><b>  系統(tǒng)構(gòu)成</b></p><p><b>  硬件全圖</b></p><p><b>  各子系統(tǒng)</b></p><p><b> ?。?

7、轉(zhuǎn)速控制輸入</b></p><p>  如用按鍵輸入則需要復雜的軟件實現(xiàn),并且需要足夠的引腳資源,本系統(tǒng)用ADC0832采樣電位器上的電壓信號來實現(xiàn)轉(zhuǎn)速信號輸入。</p><p>  2.LPC2106微控制器</p><p>  LPC2106是Phlip公司推出的核心為ARM的控制器。LPC2106 包含一個支持仿真的ARM7TDMI-S CPU、

8、與片內(nèi)存儲器控制器接口的ARM7 局部總線、與中斷控制器接口的AMBA 高性能總線(AHB)和連接片內(nèi)外設功能的VLSI 外設總線(VPB,ARMAMBA 總線的兼容超集)。片內(nèi)有64K 字節(jié)靜態(tài)RAM和128K的FLASH存儲器??蓪ぶ?GB。</p><p>  在本仿真中LPC2106沒加晶振電路,頻率在芯片屬性中設置。</p><p><b>  3.液晶顯示</b

9、></p><p>  本系統(tǒng)采用Proteus仿真庫有的液晶顯示模塊AMPIRE128X64,為8192像素的單色LCD</p><p>  屏幕分為兩半控制,控制引腳為CS1和CS2。數(shù)據(jù)通過移位寄存器輸入。</p><p><b>  4.電機驅(qū)動電路</b></p><p>  本系統(tǒng)仿真的是最大輸入電壓為

10、12伏的微型電機,故用通用電機驅(qū)動電路實現(xiàn)假設該電路輸入電阻為無窮大,輸出電阻為0。</p><p>  5.仿真電機的51單片機</p><p>  雖然Proteus有電機模塊,但其電機模塊沒有輸出轉(zhuǎn)速接口故用一單片機代替它,單片機用ADC0832采樣輸入的電壓,經(jīng)過處理即輸出和真實電機同步的轉(zhuǎn)速(需要大量的浮點運算,可考慮用DSP)。通過兩個按鍵改變轉(zhuǎn)矩沒按一次增大或減小0.001,

11、上面的是增大。</p><p><b>  6.仿真結(jié)果</b></p><p>  仿真1.8秒鐘后得下圖,可看到轉(zhuǎn)速逐漸增大然后穩(wěn)定下來。</p><p>  增大轉(zhuǎn)矩后,可看到轉(zhuǎn)速下降后又恢復</p><p><b>  7.程序;</b></p><p>  1.系統(tǒng)

12、主程序:main.c</p><p>  /******************************************************************************</p><p>  ** 實時微型直流電機PID轉(zhuǎn)速閉環(huán)調(diào)速控制系統(tǒng)程序(基于移植于LPC2106上的uc/cos實時操作系統(tǒng))</p><p>  **

13、 程序編寫者: 吳斌</p><p>  ** 編寫日期: 2007年11月14日</p><p>  ******************************************************************************/&l

14、t;/p><p>  #include "config.h"</p><p>  #include "LCD.h"</p><p>  #define TASK_STK_SIZE 512 //各任務棧大小</p><p>  #define IO_Init()

15、 \</p><p>  PINSEL0= 2; \</p><p>  IODIR|= 0x00007FB0; //P0.4\P0.5\P0.7-P1.4為輸出其他的為輸入</p><p>  #define Umax 1000 //最大調(diào)節(jié)轉(zhuǎn)速</p><p>  #define Kp 0.7

16、 //比例放大系數(shù)</p><p>  #define Ts 0.03 //采樣周期</p><p>  #define t0 4 //積分時間常數(shù)</p><p>  #define td 0.0005 //微分時間常數(shù)</p><p>  #define q0

17、 Kp*(1+Ts*t0+td/Ts)</p><p>  #define q1 -Kp*(1+2*td/Ts) </p><p>  #define q2 Kp*td/Ts</p><p>  #define ADC_DO 0x00000040 //P0.6</p><p>  #define ADC_CS

18、0x00000080 //P0.7</p><p>  #define ADC_CLK 0x00000100 //P0.8</p><p>  #define ADC_DI 0x00000200 //P0.9</p><p>  OS_STK Main_TaskStk[TASK_STK_SIZE];</p

19、><p>  OS_STK Task1_TaskStk[TASK_STK_SIZE];</p><p>  OS_STK Task2_TaskStk[TASK_STK_SIZE];</p><p>  OS_STK Task3_TaskStk[TASK_STK_SIZE];</p><p>  OS_ST

20、K Task4_TaskStk[TASK_STK_SIZE];//各任務棧</p><p>  OS_EVENT *Conbox; //控制信號郵箱</p><p>  float n=0; // 輸入轉(zhuǎn)速</p><p>  float nb=0; // 反饋轉(zhuǎn)速

21、</p><p>  void Main_Task(void *data);</p><p>  void Task1(void *p_arg);</p><p>  void Task2(void *p_arg);</p><p>  void Task3(void *p_arg);</p><p>  void T

22、ask4(void *p_arg); //函數(shù)聲明</p><p>  void PWMInit(void) </p><p><b>  {</b></p><p>  PWMPR = 0x00; // 不分頻,計數(shù)頻率為Fpclk</p><p>  PWMMCR = 0x0

23、2; // 設置PWMMR0匹配時復位PWMTC</p><p>  PWMMR0 = 2765; // 設置PWM周期</p><p>  PWMMR1 = 0; // 設置PWM占空比</p><p>  PWMLER = 0x03; // PWMMR0、PWMMR1鎖存</p><p&g

24、t;  PWMPCR = 0x0200;// 允許PWM1輸出,單邊PWM</p><p>  PWMTCR = 0x09; // 啟動定時器,PWM使能</p><p>  PWMMR0 = 2765; // 設置PWM周期</p><p>  PWMMR1 = 0; // 設置PWM占空比</p>&

25、lt;p>  PWMLER = 0x03; // PWMMR0、PWMMR1鎖存</p><p><b>  }</b></p><p>  /********************************************************************************************************

26、*</p><p>  ** 函數(shù)名稱: main</p><p>  ** 功能描述: c語言的主函數(shù),由它啟動多任務環(huán)境</p><p>  ********************************************************************************************************/</p

27、><p>  int main (void)</p><p><b>  {</b></p><p><b>  OSInit();</b></p><p>  OSTaskCreate(Main_Task, (void*)0, &Main_TaskStk[TASK_STK_SIZE - 1],

28、 0);</p><p>  OSStart();</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  /*****************************************************************

29、*************</p><p>  ** 函數(shù)名稱: Main_Task</p><p>  ** 功能描述: 初始化系統(tǒng)及建立任務</p><p>  ******************************************************************************/</p><p> 

30、 void Main_Task(void *p_arg)</p><p><b>  { </b></p><p>  p_arg = p_arg; // 避免編譯警告 </p><p>  TargetInit();</p><p> 

31、 IO_Init(); </p><p>  Conbox = OSMboxCreate((void*)0);</p><p>  LCD_Main();</p><p>  OSTaskCreate(Task1, (void *)0, &Task1_TaskStk[TASK_ST

32、K_SIZE - 1], 2);</p><p>  OSTaskCreate(Task2, (void *)0, &Task2_TaskStk[TASK_STK_SIZE - 1], 3);</p><p>  OSTaskCreate(Task3, (void *)0, &Task3_TaskStk[TASK_STK_SIZE - 1], 1);</p>

33、<p>  OSTaskCreate(Task4, (void *)0, &Task4_TaskStk[TASK_STK_SIZE - 1], 5);</p><p>  OSTaskSuspend(0);</p><p><b>  }</b></p><p>  /*****************************

34、*************************************************</p><p>  ** 函數(shù)名稱: Task1_Task</p><p>  ** 功能描述: 實時任務,負責采樣和處理數(shù)據(jù)</p><p>  ************************************************************

35、******************/</p><p>  void Task1(void *p_arg) </p><p>  { float us;//上次輸出控制信號</p><p>  float es;//上次采樣誤差信號</p><p>  float es2 = 0;//上次的上次的采樣誤差信號<

36、/p><p>  uint32 nj;//采樣轉(zhuǎn)速信號</p><p>  float u;//此次輸出控制信號</p><p>  float e;//此次采樣誤差信號</p><p>  p_arg = p_arg;</p><p>  PWMInit();//PWM初始化</p&g

37、t;<p><b>  while(1)</b></p><p>  { nj=IOPIN>>16;</p><p>  nb=(float)nj/10;//采樣反饋轉(zhuǎn)速</p><p><b>  e=n-nb;</b></p><p>  u=us+q0*e+q1*

38、es+q2*es2;//PID處理</p><p>  if(u>=Umax)</p><p><b>  u=Umax;</b></p><p><b>  es2=es;</b></p><p><b>  es=e;</b></p><p>

39、;<b>  us=u;</b></p><p>  OSMboxPost(Conbox,(void*)&u); //發(fā)送處理后的信號</p><p>  OSTimeDlyHMSM(0,0,0,30);</p><p><b>  }</b></p><p><b>  } &

40、lt;/b></p><p>  /******************************************************************************</p><p>  ** 函數(shù)名稱: Task2_Task</p><p>  ** 功能描述: 根據(jù)控制信號輸出PWM波</p><p>  

41、******************************************************************************/</p><p>  void Task2(void *p_arg)</p><p>  { uint8 err;</p><p>  float *nh;</p><p>  p_

42、arg = p_arg;</p><p><b>  while(1)</b></p><p>  {nh=(float*)OSMboxPend(Conbox,0,&err);</p><p>  if(*nh>=Umax-0.5)</p><p>  {PWMMR0 = 2765;</p>

43、<p>  PWMMR1= 2764;</p><p>  PWMLER = 0x03;</p><p><b>  }</b></p><p><b>  else</b></p><p>  {PWMMR0 = 2765;</p><p>  PWMMR1=(

44、uint32)(*nh/Umax*2765);</p><p>  PWMLER = 0x03;</p><p>  } </p><p><b>  }</b></p><p><b>  }</b></p><p&

45、gt;  void Delay(uint8 n) //延時函數(shù)</p><p><b>  {uint8 i;</b></p><p>  for(i=1;i<=n;i++);</p><p><b>  }</b></p><p>  /************************

46、******************************************************</p><p>  ** 函數(shù)名稱: Task3_Task</p><p>  ** 功能描述: 定時采樣輸入的轉(zhuǎn)速要求(0832采樣)</p><p>  **************************************************

47、****************************/</p><p>  void Task3(void *p_arg)</p><p>  { uint8 ch,i,flag=0;</p><p>  p_arg=p_arg;</p><p><b>  ch=0;</b></p><p&g

48、t;  IOCLR=ADC_CS;</p><p>  IOCLR=ADC_DI;//片選,DO為高阻態(tài)</p><p>  for(i=0;i<10;i++)</p><p><b>  {;}</b></p><p>  IOCLR=ADC_CLK;</p><p><b> 

49、 Delay(4);</b></p><p>  IOSET=ADC_DI; </p><p>  IOSET=ADC_CLK; </p><p>  Delay(4); //第一個脈沖,起始位 </p><p>  IOCLR=ADC_CLK; </p><p>  Delay(4); </

50、p><p>  IOSET=ADC_DI; </p><p>  IOSET=ADC_CLK;</p><p>  Delay(4); //第二個脈沖,DI=1表示雙通道單極性輸入</p><p>  IOCLR=ADC_CLK;</p><p><b>  Delay(4);</b><

51、/p><p>  IOSET=ADC_DI; </p><p>  IOSET=ADC_CLK;</p><p>  Delay(4); //第三個脈沖,DI=1表示選擇通道1(CH2)</p><p>  IOCLR=ADC_DI; //DI轉(zhuǎn)為高阻態(tài),DO脫離高阻態(tài)為輸出數(shù)據(jù)作準備</p><p>  IOSE

52、T=ADC_CLK;</p><p><b>  Delay(4);</b></p><p>  IOCLR=ADC_CLK; </p><p>  Delay(4); //經(jīng)實驗,這里加一個脈沖AD便能正確讀出數(shù)據(jù)</p><p>  for (i=0; i<8; i++)</p><

53、p>  { IOSET=ADC_CLK; </p><p>  Delay(4); </p><p>  IOCLR=ADC_CLK; </p><p><b>  Delay(4);</b></p><p>  if((IOPIN & ADC_DO)!=0)</p><p>  c

54、h=(ch<<1)|1;//在每個脈沖的下降沿DO輸出一位數(shù)據(jù),最終ch為8位二進制數(shù)</p><p><b>  else</b></p><p>  ch=(ch<<1)|0;</p><p><b>  }</b></p><p>  IOSET=ADC_CS;<

55、/p><p>  n=(float)ch*1000/256;</p><p>  if(flag==0)</p><p><b>  {flag=1;</b></p><p>  OSTaskChangePrio(1,4);</p><p><b>  }</b></p&g

56、t;<p>  OSTimeDlyHMSM(0,0,0,300);</p><p><b>  }</b></p><p>  /******************************************************************************</p><p>  ** 函數(shù)名稱: Tas

57、k4_Task</p><p>  ** 功能描述: 液晶顯示任務</p><p>  ******************************************************************************/</p><p>  void Task4(void *p_arg)</p><p><b&

58、gt;  {</b></p><p>  #if OSCRITICAL_METHOD ==3</p><p>  OS_CPU_SR cpu_sr;</p><p><b>  #endif</b></p><p>  uint16 w,q,k;</p><p><b>  

59、uint8 i;</b></p><p>  uint8 shu1[6],shu2[6];</p><p>  p_arg=p_arg;</p><p><b>  for(;;)</b></p><p>  {shu1[4]=10;</p><p>  w=(uint16)(n*10

60、);</p><p><b>  k=10000;</b></p><p>  for(i=0;i<4;i++)</p><p>  {shu1[i]=(uint8)(w/k);</p><p><b>  w=w%k;</b></p><p><b>  k

61、=k/10;</b></p><p><b>  }</b></p><p>  shu1[5]=(uint8)w;</p><p>  OS_ENTER_CRITICAL();</p><p>  LCD_num(80,2,shu1,6);</p><p>  shu2[4]=10;

62、</p><p>  q=(uint16)(nb*10);</p><p><b>  k=10000;</b></p><p>  for(i=0;i<4;i++)</p><p>  {shu2[i]=(uint8)(q/k);</p><p><b>  q=q%k;<

63、/b></p><p><b>  k=k/10;</b></p><p><b>  }</b></p><p>  shu2[5]=(uint8)q;</p><p>  LCD_num(80,4,shu2,6);</p><p>  OS_EXIT_CRITICA

64、L();</p><p>  OSTimeDlyHMSM(0,0,0,100);</p><p><b>  }</b></p><p><b>  } </b></p><p>  /*********************************************************

65、*********************</p><p>  ** End Of File</p><p>  ******************************************************************************/</p><p>  2.自編的LCD驅(qū)動

66、程序</p><p>  (1)頭文件LCD.h</p><p>  /******************************************************************************</p><p>  ** LCD驅(qū)動頭文件LCD.h(基于LPC21**)</p

67、><p>  ** 程序編寫者: 吳斌</p><p>  ** 編寫日期: 2007年11月12日</p><p>  **************************************************************

68、****************/</p><p>  #ifndef _LCD_H_</p><p>  #define _LCD_H_</p><p>  #include "config.h"</p><p>  #define SPI_CLK0x00000010 //P0.4 </p><

69、;p>  #define SPI_DATA0x00000020 //P0.5 </p><p>  #define RW 0x00000800 //RW</p><p>  #define RS 0x00000400 //RS</p><p>  #define CS1 0x00

70、001000 //CS1</p><p>  #define CS2 0x00002000 //CS2</p><p>  #define E 0x00004000 //E</p><p>  #define Kai 0x3F</p><p>  #def

71、ine Guang 0x3E</p><p>  #define Hang 0xC0</p><p>  #define Ye 0xB8</p><p>  #define Lie 0x40</p><p>  #define Setlie(a) \</p>

72、<p>  IOCLR = RW; \</p><p>  IOCLR = RS; \</p><p>  send(Lie+a);</p><p>  #define Setye(a) \</p><p>  IOCLR = RW; \</p><p>  IOCLR = RS;

73、 \</p><p>  send(Ye+a);</p><p>  #define Setweizi(a,b) \</p><p>  IOCLR = RW;\</p><p>  IOCLR = RS;\</p><p>  send(Lie+a);\</p>

74、<p>  send(Ye+b);</p><p>  #define Write(a) \</p><p>  IOCLR = RW; \</p><p>  IOSET = RS; \</p><p><b>  send(a);</b></p><p>  voi

75、d send(uint8 dat);</p><p>  void LCD_disp(uint8 a,uint8 b,uint8 c,uint8 d,uint8 m,uint8 *shuju);</p><p>  void SetCS(uint8 a);</p><p>  void LCD(uint8 a,uint8 b,uint8 c,uint8 d, ui

76、nt8 *shuju);</p><p>  void LCD_num(uint8 a,uint8 b,uint8 *shuju,uint8 n);</p><p>  void LCD_str(uint8 a,uint8 b,uint8 *strtab,uint8 n);</p><p>  void LCD_hanzi(uint8 a,uint8 b,uint8

77、 *hanzitab,uint8 n);</p><p>  void LCD_xian(uint8 a,uint8 b,uint8 *strtab,uint8 n);</p><p>  void LCD_Main(void);</p><p><b>  #endif</b></p><p>  /*********

78、*********************************************************************</p><p>  ** End Of File</p><p>  ****************************************************************

79、**************/</p><p>  (2)LCD驅(qū)動程序LCD.c</p><p>  /******************************************************************************</p><p>  ** LCD驅(qū)動程序(基于LPC

80、21**)</p><p>  ** 程序編寫者: 吳斌</p><p>  ** 編寫日期: 2007年11月12日</p><p>  ***************************************************

81、***************************/</p><p>  #include"LCD.h"</p><p>  void send(uint8 dat) //用移位寄存器輸出一字節(jié)數(shù)據(jù)</p><p>  { uint8 i;</p><p>  IOSET = E;

82、// E = 1</p><p>  for(i=0; i<8; i++)// 發(fā)送8位數(shù)據(jù)</p><p>  { IOCLR = SPI_CLK;// SPI_CLK = 0</p><p>  if( (dat&0x80)!=0 ) IOSET = SPI_DATA;</p><p>  else IOC

83、LR = SPI_DATA;</p><p>  dat <<= 1;</p><p>  IOSET = SPI_CLK;// SPI_CLK = 1</p><p><b>  }</b></p><p>  IOCLR = E; // E = 0</p><p>

84、;<b>  }</b></p><p>  void LCD_disp(uint8 a,uint8 b,uint8 c,uint8 d,uint8 m,uint8 *shuju)/*LCD顯示函數(shù),在第a列b頁輸出大小為c*d的圖像(只能選擇在左或右屏幕顯示) */</p><p>  {uint8 i,j,f;</p><p><b

85、>  SetCS(m);</b></p><p>  for(j=0;j<d;j++)</p><p>  {Setweizi(a,j+b);</p><p>  for(i=0;i<c;i++)</p><p>  {Write(*(shuju+i));</p><p>  for(f=

86、0;f<0xFF;f++);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void SetCS(uint8 a)</p><p><b>  

87、{if(a==0)</b></p><p>  {IOSET =CS2;</p><p>  IOCLR =CS1;</p><p><b>  }</b></p><p><b>  else</b></p><p>  {IOSET =CS1;</p&g

88、t;<p>  IOCLR =CS2;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void LCD(uint8 a,uint8 b,uint8 c,uint8 d, uint8 *shuju) /*LCD主顯示函數(shù),在第a列b頁輸出大小為c*d的

89、圖像*/</p><p>  {uint8 i,j,m,f,n;</p><p>  uint8 *p=shuju;</p><p>  if(a+c<=64)</p><p>  {SetCS(0);</p><p>  for(j=0;j<d;j++)</p><p>  {Se

90、tweizi(a,j+b);</p><p>  for(i=0;i<c;i++)</p><p>  {Write(*p);</p><p><b>  p++;</b></p><p>  for(f=0;f<0xFF;f++);</p><p><b>  }</

91、b></p><p><b>  }</b></p><p><b>  }</b></p><p>  else if(a<64&&(a+c)>64)</p><p><b>  {m=64-a;</b></p><p&g

92、t;<b>  n=c-m;</b></p><p>  for(j=0;j<d;j++)</p><p>  {SetCS(0);</p><p>  Setweizi(a,j+b);</p><p>  for(i=0;i<m;i++)</p><p>  {Write(*p);&

93、lt;/p><p><b>  p++;</b></p><p>  for(f=0;f<0xFF;f++);</p><p><b>  }</b></p><p><b>  SetCS(1);</b></p><p>  Setweizi(0,j

94、+b);</p><p>  for(i=0;i<n;i++)</p><p>  {Write(*p);</p><p><b>  p++;</b></p><p>  for(f=0;f<0xFF;f++);</p><p><b>  }</b></

95、p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p>  {SetCS(1);</p><p>  for(j=0;j<d;j++)</p><p&

96、gt;  {Setweizi(a-64,j+b);</p><p>  for(i=0;i<c;i++)</p><p>  {Write(*p);</p><p><b>  p++;</b></p><p>  for(f=0;f<0xFF;f++);</p><p><b&

97、gt;  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void LCD_num(uint8 a,uint8 b,uint8 *shuju,uint8 n)/

98、*在第a列b頁顯示shuju數(shù)組的數(shù)字或小數(shù)點和空格*/</p><p>  {uint8 numzimo[192]={0xFF,0x1F,0xEF,0xF7,0xF7,0xEF,0x1F,0xFF,0xFF,0xF0,0xEF,0xDF,0xDF,</p><p>  0xEF,0xF0,0xFF, /*"0",0*/</p><p>  0x

99、FF,0xEF,0xEF,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xDF,0xC0,0xDF,0xDF,0xFF,0xFF,</p><p><b>  /*"1",1*/</b></p><p>  0xFF,0x8F,0xF7,0xF7,0xF7,0x77,0x8F,0xFF,0xFF,0xCF,0xD7,0xD

100、B,0xDD,0xDE,0xCF,0xFF,</p><p><b>  /*"2",2*/</b></p><p>  0xFF,0xCF,0xF7,0x77,0x77,0xB7,0xCF,0xFF,0xFF,0xE7,0xDF,0xDF,0xDF,0xEE,0xF1,0xFF,</p><p><b>  /*

101、"3",3*/</b></p><p>  0xFF,0xFF,0x3F,0xDF,0xEF,0x07,0xFF,0xFF,0xFF,0xF8,0xFB,0xDB,0xDB,0xC0,0xDB,0xFF,</p><p><b>  /*"4",4*/</b></p><p>  0xFF,0

102、x07,0xF7,0x77,0x77,0xF7,0xF7,0xFF,0xFF,0xE6,0xDE,0xDF,0xDF,0xEE,0xF1,0xFF,</p><p><b>  /*"5",5*/</b></p><p>  0xFF,0x1F,0xEF,0x77,0x77,0xE7,0xFF,0xFF,0xFF,0xF0,0xEE,0xDF,0x

103、DF,0xEE,0xF1,0xFF,</p><p><b>  /*"6",6*/</b></p><p>  0xFF,0xC7,0xF7,0xF7,0x37,0xC7,0xF7,0xFF,0xFF,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0xFF,</p><p><b>  /*&quo

104、t;7",7*/</b></p><p>  0xFF,0x8F,0x77,0xF7,0xF7,0x77,0x8F,0xFF,0xFF,0xE3,0xDD,0xDE,0xDE,0xDD,0xE3,0xFF,</p><p><b>  /*"8",8*/</b></p><p>  0xFF,0x1F,

105、0xEF,0xF7,0xF7,0xEF,0x1F,0xFF,0xFF,0xFF,0xCE,0xDD,0xDD,0xEE,0xF0,0xFF,</p><p><b>  /*"9",9*/</b></p><p>  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xCF,0xCF,0xFF,0xFF,0

106、xFF,0xFF,0xFF,</p><p>  /*".",10*/</p><p>  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};</p><p>  /*" ",11*/</p><

107、p>  uint8 i,f;</p><p><b>  uint8 *p;</b></p><p>  for(i=0;i<n;i++)</p><p>  {f=*(shuju++);</p><p>  p=numzimo+f*16;</p><p>  LCD(a,b,8,2,

108、p);</p><p><b>  a=a+8;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void LCD_str(uint8 a,uint8 b,uint8 *strtab,uint8 n) /*在第a列

109、b頁顯示ASCII字符串(要點陣數(shù)據(jù))*/</p><p><b>  {uint8 i;</b></p><p>  for(i=0;i<n;i++)</p><p>  {LCD(a,b,8,2,strtab);</p><p><b>  a=a+8;</b></p>&l

110、t;p>  strtab=strtab+16;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void LCD_hanzi(uint8 a,uint8 b,uint8 *hanzitab,uint8 n) /*在第a列b頁顯示漢字串(要點陣數(shù)據(jù))*/</p

111、><p><b>  {uint8 i;</b></p><p>  for(i=0;i<n;i++)</p><p>  {LCD(a,b,16,2,hanzitab);</p><p><b>  a=a+16;</b></p><p>  hanzitab=hanzi

112、tab+32;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void LCD_xian(uint8 a,uint8 b,uint8 *strtab,uint8 n) //顯示ASCII字符串到頂時換行</p><p><b>  {

113、uint8 m;</b></p><p>  if(a+(n-1)*8<=120)</p><p>  LCD_str(a,b,strtab,n);</p><p><b>  else</b></p><p>  {if(a%8>0)</p><p>  m=a/8+1+

114、n-16;</p><p><b>  else</b></p><p>  m=a/8+n-16;</p><p>  LCD_str(a,b,strtab,n-m);</p><p>  LCD_str(0,b+2,strtab+16*(n-m),m);</p><p><b>  

115、}</b></p><p><b>  }</b></p><p>  void LCD_Main(void) //本系統(tǒng)顯示主界面</p><p><b>  {uint8 i;</b></p><p>  uint8 zifu[80]={0xF7,0x07,0xF7,0xFF

116、,0xFF,0xF7,0x07,0xF7,0xFF,0xE0,0xDF,0xDF,0xDF,0xDF,</p><p>  0xE0,0xFF,/*"U",0*/</p><p>  0xFF,0xFF,0xFF,0xFF,0x7F,0x9F,0xE7,0xFB,0xFF,0x9F,0xE7,0xF9,0xFE,0xFF,0xFF,0xFF,</p>&l

117、t;p><b>  /*"/",1*/</b></p><p>  0xFF,0xFF,0xFF,0x7F,0x7F,0x7F,0xFF,0xFF,0xFF,0xF1,0xEE,0xDF,0xDF,0xDF,0xEE,0xFF,</p><p><b>  /*"c",2*/</b></p>

118、;<p>  0xFF,0xFF,0x7F,0x7F,0x7F,0x7F,0xFF,0xFF,0xFF,0xE0,0xDF,0xDF,0xDF,0xDF,0xE0,0xFF,</p><p><b>  /*"o",3*/</b></p><p>  0xFF,0xFF,0x7F,0x7F,0x7F,0x7F,0x7F,0xFF,0x

119、FF,0xCC,0xDB,0xDB,0xDB,0xDB,0xE6,0xFF};/*"s",4*/</p><p>  uint8 inputn[160]=</p><p>  {0xBB,0x0B,0xB0,0x1B,0xBB,0x9B,0x6F,0x67,0x6B,0x6C,0xEB,0x67,0xF7,0x2F,0xEF,0xFF,</p><p

120、>  0xFB,0xFB,0xFB,0x00,0xFD,0xFD,0x00,0xB5,0x75,0x80,0xFF,0xC0,0x7F,0x00,0xFF,0xFF,</p><p><b>  /*"輸",0*/</b></p><p>  0xFF,0xFF,0xFF,0xFF,0xFE,0x7C,0x89,0xE7,0x9F,0x7F,

121、0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,</p><p>  0xBF,0xDF,0xEF,0xF7,0xF9,0xFE,0xFF,0xFF,0xFF,0xFF,0xFC,0xFB,0xE7,0xCF,0xEF,0xFF,</p><p><b>  /*"入",1*/</b></p><p>  0x3

122、7,0x57,0x63,0x14,0x77,0x77,0x77,0xBF,0xB7,0x07,0xB0,0xB7,0xB7,0xB7,0xBF,0xFF,</p><p>  0xF7,0xF7,0xFB,0x00,0xFB,0xFB,0xFF,0xFD,0xF4,0xED,0xDD,0x2D,0xF1,0xFD,0xFF,0xFF,/*"轉(zhuǎn)",2*/</p><p>

123、  0xBF,0xBD,0x33,0xFF,0xFB,0x1B,0xDB,0xDB,0x0,0xDB,0xDB,0xDB,0x1B,0xFB,0xFF,0xFF,</p><p>  0xBF,0xDF,0xE0,0xDF,0xB7,0xB6,0xBA,0xBC,0x80,0xBE,0xBC,0xBA,0xB2,0xBF,0xBF,</p><p>  0xFF,/*"速&quo

124、t;,3*/</p><p>  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,</p><p>  0xFF,0xFF,0xC9,0xC9,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};</p&

125、gt;<p><b>  /*":",4*/</b></p><p>  uint8 outputn[160]={0xBB,0x0B,0xB0,0x1B,0xBB,0x9B,0x6F,0x67,0x6B,0x6C,0xEB,0x67,0xF7,</p><p>  0x2F,0xEF,0xFF,</p><p>

126、;  0xFB,0xFB,0xFB,0x00,0xFD,0xFD,0x00,0xB5,0x75,0x80,0xFF,0xC0,0x7F,0x00,0xFF,0xFF,</p><p><b>  /*"輸",0*/</b></p><p>  0xFF,0xFF,0x03,0xBF,0xBF,0xBF,0xBF,0x00,0xBF,0xBF,0xB

127、F,0xBF,0xBF,0x03,0xFF,0xFF,</p><p>  0xFF,0xFF,0x81,0xDF,0xDF,0xDF,0xDF,0xC0,0xDF,0xDF,0xDF,0xDF,0xDF,0x81,0xFF,0xFF,</p><p><b>  /*"出",1*/</b></p><p>  0x37,0

128、x57,0x63,0x14,0x77,0x77,0x77,0xBF,0xB7,0x07,0xB0,0xB7,0xB7,0xB7,0xBF,0xFF,</p><p>  0xF7,0xF7,0xFB,0x00,0xFB,0xFB,0xFF,0xFD,0xF4,0xED,0xDD,0x2D,0xF1,0xFD,0xFF,0xFF,/*"轉(zhuǎn)",2*/</p><p>  0

溫馨提示

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

評論

0/150

提交評論