找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 9337|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

TLC1543交流電壓測(cè)試(單片機(jī))教訓(xùn)版

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:71259 發(fā)表于 2014-12-29 00:28 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 daming 于 2014-12-29 00:30 編輯

   (千萬(wàn)注意電壓型電路供流能力問(wèn)題,注意器件屬于電壓輸入型還是電流輸入型)



先說(shuō)一下,交流電壓,搞了我?guī)讉(gè)月,搞死我了,找了好幾種方法轉(zhuǎn)直流,進(jìn)AD,就是不行。NND!!!!
在軟件上仿真了好幾個(gè)電路,都蠻好的波形。焊成板子就是不行,沒(méi)出來(lái)電壓,要么就是不滑,進(jìn)了AD差天上去了,N次想砸了它GOUNIANGYANGDE。。。。!
今天。【驮诮瘢ㄋ穆暎┨欤!!!用的運(yùn)放半波整流加RC濾波,不接入AD,調(diào)放大倍數(shù)后得到對(duì)應(yīng)直流電壓。接入AD后再看,MD!!電壓從珠穆朗瑪都拉到貝加爾湖了!!中間串了個(gè)20K電阻(看TNND還拉低不!!)終于用表在線量OK了,程序OK了。TLC1543。!NNND!!!!讓我一度認(rèn)為運(yùn)放不合適,想換其他運(yùn)放,一度換電路,一度迷!盀槁锓抡娴暮同F(xiàn)實(shí)就不符昵”為嘛現(xiàn)實(shí)和理想差距這么大哩。。。!一度認(rèn)為仿真軟件有問(wèn)題。!
所以:教訓(xùn):(單片機(jī)) 教訓(xùn)版:
       注意電路供流能力,空載和負(fù)載的電壓變化受到什么影響!
       注意器件屬于電壓輸入型還是電流輸入型,要“限流”,還是增大“供流”。!
       不要總是考慮電阻大影響電壓,人家電流小啊。A級(jí)別的,TLC1543就需要限流!!
        以后再不注意這些問(wèn)題!我就不姓少。。。。。。。。。。。!
    還有一個(gè)待解決問(wèn)題:運(yùn)放做的正弦峰值檢測(cè)電路,仿真蠻好的,焊成板子就是不行,電壓直接奔最高了。為嘛。∵@一切都是為嘛。∵\(yùn)放我用的LM358,用單電池供電不行,用倆電池供電,也不行。!
  1. /********多周期測(cè)頻法,精度與晶振和閘門時(shí)間有關(guān)。晶振越大,閘門時(shí)間越長(zhǎng),都可以提高精度。************************/
  2. #include <stc89c52.h>
  3. #include <intrins.h>
  4. #define uchar  unsigned char
  5. #define uint  unsigned int
  6. #define LCD12864_IO    P0
  7. #define CLERADISPLAY   LCD12864_command(0x01);

  8. int a1=0,a2=0,a3=0,a4=0,a5=0,a6=0;//存儲(chǔ)電壓值的每一位,設(shè)計(jì)a4,a5是小數(shù)位.
  9. const uchar num[]="0123456789. ";


  10. //AD轉(zhuǎn)換控制腳

  11. sbit  CLK = P1^0; //TLC1543 18P
  12. sbit  ADDRESS = P1^1; //17P
  13. sbit  SDATA = P1^2; //16P
  14. sbit  CS  = P1^3; //15P

  15. /********************************************************************/

  16. sbit LCD12864_RS=P2^5;  // 12864-st7920 4P RS
  17. sbit LCD12864_RW=P2^6;  //RW(5P)
  18. sbit LCD12864_EN=P2^7;   //E(6P)   
  19. /********************************************************************/
  20. void LCD12864_busy(void);
  21. void LCD12864_command(unsigned char command);
  22. void LCD12864_data(unsigned char dat);
  23. void LCD12864_address(unsigned char row,unsigned char line);
  24. void LCD12864_string(unsigned char row,unsigned char line,unsigned char *s);
  25. void LCD12864_picture(unsigned char *gImage);
  26. void LCD12864_init(void);
  27. void LCD12864_char (unsigned char row,unsigned char line,unsigned char a);
  28. unsigned char LCD12864_ReadData();
  29. void LCD12864_Drawpoint(uchar X,uchar Y);
  30. void LCD12864_LineX(unsigned char X0, unsigned char X1, unsigned char Y);
  31. void LCD12864_LineY( unsigned char X, unsigned char Y0, unsigned char Y1);
  32. void LCD12864_DrawPicture( unsigned char code *pic);
  33. void clrgdram();

  34. /********************************************************************/

  35. //
  36. double DAT[7]={1150.0, 1150.1, 1150.2, 285.0,15000.0, 4000.0,31000.0}; //都放大了10倍   
  37. //       U     V      W      E     N     F   CINT     
  38. // 控制腳

  39. sbit CONTRL=P1^7; //測(cè)頻控制腳

  40. sbit SCANF =P2^0; //鍵盤掃描控制腳
  41. sbit LED2  =P2^1; //狀態(tài)顯示控制腳1
  42. sbit LED1  =P2^2; //狀態(tài)顯示控制腳2
  43. sbit SHUCHU=P2^3; //繼電器輸出控制腳

  44. //
  45. bit FLAG; //測(cè)頻標(biāo)志位
  46. bit xunhuanflag;//顯示方式標(biāo)志位
  47. bit outflag; //允許輸出標(biāo)志
  48. bit  eding;//額定狀態(tài)標(biāo)志   
  49. // 按鍵存儲(chǔ)   
  50. bdata uchar key; //鍵值存儲(chǔ)

  51. sbit key0=key^0;//停機(jī)   
  52. sbit key1=key^1;//啟動(dòng)按鈕
  53. sbit key2=key^2; //顯示方式(高循環(huán))
  54. sbit key3=key^3; //自檢   
  55. sbit key4=key^4;//燈檢   
  56. sbit key5=key^5;//復(fù)位   
  57. sbit key6=key^6;//應(yīng)急  (高應(yīng)急)  
  58. sbit key7=key^7;//油壓(高有油壓)   

  59. uint t1h,t1l,t2h,t2l;//測(cè)頻變量
  60. double cnt1,cnt2;

  61. double AD; //定義為float 類型,可以防止下面做四則運(yùn)算時(shí)每一步的值超出 范圍
  62. unsigned long int  X;

  63. /****************************************************************/         

  64. uint rd1543(uchar address);//AD轉(zhuǎn)換程序
  65. void voltage(); //電壓檢測(cè)
  66. void init();   //初始化
  67. void zhuansu();   //計(jì)算轉(zhuǎn)速
  68. void reset();//測(cè)頻計(jì)數(shù)定時(shí)復(fù)位
  69. uchar scanf(); //鍵盤掃描
  70. void keychuli();  //按鍵處理程序
  71. void baohu();
  72. void display(unsigned long int sx,uchar j); //顯示函數(shù)
  73. void displayFX(unsigned long int sx);
  74. /*************************************************************/
  75. void delayus(uint);
  76. void delayms(uint);
  77. void delays(uint m); //延時(shí)秒


  78. unsigned char code Bmp019[]=
  79. {

  80. /*------------------------------------------------------------------------------
  81. ;  若數(shù)據(jù)亂碼,請(qǐng)檢查字模格式設(shè)置,注意選擇正確的取模方向和字節(jié)位順序。
  82. ;  源文件 / 文字 : C:\Documents and Settings\Administrator\桌面\888.bmp字模
  83. ;  寬×高(像素): 128×64
  84. ;  字模格式/大小 : 單色點(diǎn)陣液晶字模,橫向取模,字節(jié)正序/1024字節(jié)
  85. ;  數(shù)據(jù)轉(zhuǎn)換日期  : 2010-7-26 20:46:48
  86. ------------------------------------------------------------------------------*/
  87. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  88. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  89. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  90. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  91. 0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92. 0x00,0x01,0xF8,0x00,0x00,0x00,0x3E,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93. 0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
  94. 0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x00,0x08,0x00,0x00,0x00,0x08,0x08,0x00,0x00,
  95. 0x00,0x20,0x18,0x00,0x00,0x00,0x08,0x00,0x1F,0x80,0x00,0x00,0x08,0x1F,0x80,0x00,
  96. 0x00,0x3D,0xF8,0x00,0x08,0x00,0x08,0xE0,0x02,0x00,0x00,0x7F,0xFF,0x00,0x80,0x00,
  97. 0x00,0x38,0x38,0x00,0x18,0x00,0x00,0x30,0x02,0x00,0x00,0x80,0x00,0x00,0x80,0x00,
  98. 0x00,0x30,0x08,0x01,0xF0,0x00,0x20,0x30,0x0F,0xF8,0x00,0x80,0x0F,0xE0,0x80,0x00,
  99. 0x00,0x30,0x38,0x00,0xFC,0x30,0x20,0xE0,0x83,0x80,0x00,0x00,0x00,0x20,0x00,0x00,
  100. 0x00,0x3F,0xF8,0x00,0x0C,0x30,0x01,0xE0,0x00,0xF0,0x00,0x02,0x00,0x20,0x00,0x00,
  101. 0x00,0x30,0x18,0x66,0xBF,0xF0,0x00,0xE0,0x0F,0xE0,0x00,0x07,0xFF,0xC0,0x00,0x00,
  102. 0x00,0x30,0x18,0x3F,0xFF,0xF0,0x00,0xC0,0x38,0x20,0x00,0x00,0x22,0x00,0x00,0x00,
  103. 0x00,0x20,0x00,0x00,0x00,0x30,0x00,0x80,0x00,0x00,0x00,0x00,0x83,0x00,0xFC,0x00,
  104. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x00,
  105. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  106. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  107. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  108. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  109. 0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,
  110. 0x03,0xFF,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,
  111. 0x03,0xFF,0xFF,0xFF,0xF0,0x00,0x7F,0xFF,0xFC,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,
  112. 0x03,0xFF,0xFF,0xFF,0xC3,0xF0,0x00,0x03,0xE0,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xC0,
  113. 0x03,0xFF,0xFF,0xFF,0x8C,0x00,0x00,0x00,0x03,0xFF,0x0F,0xFF,0xFF,0xFF,0xFF,0xC0,
  114. 0x03,0xFF,0xFF,0xFE,0x00,0x03,0xFF,0xE0,0x0F,0xFF,0x87,0xFF,0xFF,0xFF,0xFF,0xC0,
  115. 0x03,0xFF,0xFF,0xFE,0x00,0xFF,0xFF,0xFE,0x1F,0xFF,0xC3,0xFF,0xFF,0xFF,0xFF,0xC0,
  116. 0x03,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0x1F,0xFF,0xC3,0xFF,0xFF,0xFF,0xFF,0xC0,
  117. 0x03,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFF,0x1F,0xFF,0xC3,0xFF,0xFF,0xFF,0xFF,0xC0,
  118. 0x03,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x87,0xFF,0xFF,0xFF,0xFF,0xC0,
  119. 0x03,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,0xFF,0xC0,
  120. 0x03,0xFF,0xFF,0xC1,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x81,0xFF,0xFF,0xFF,0xFF,0xC0,
  121. 0x03,0xFF,0xFF,0x83,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0xFF,0xC0,
  122. 0x03,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x7F,0xFF,0xFF,0xFF,0xC0,
  123. 0x03,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xFF,0xC0,
  124. 0x03,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x3F,0xFF,0xFF,0xFF,0xC0,
  125. 0x03,0xFF,0xFC,0x00,0x03,0xFF,0xFF,0xFD,0x80,0x0F,0xF8,0x1F,0xFF,0xFF,0xFF,0xC0,
  126. 0x03,0xFF,0xF8,0x00,0x03,0xFF,0xFF,0xF8,0xFF,0x87,0xFC,0x0F,0xFF,0xFF,0xFF,0xC0,
  127. 0x03,0xFF,0xF8,0x03,0xFF,0xFF,0xFF,0xFF,0x00,0x1F,0xFE,0x0F,0xFF,0xFF,0xFF,0xC0,
  128. 0x03,0xFF,0xF8,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0xC0,
  129. 0x03,0xFF,0xF8,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0xC0,
  130. 0x03,0xFF,0xF8,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0xC0,
  131. 0x03,0xFF,0xF8,0x7F,0xF0,0x0F,0xFF,0xFF,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0xC0,
  132. 0x03,0xFF,0xF8,0x3F,0xF0,0x1F,0xFF,0xFF,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xFF,0xC0,
  133. 0x03,0xFF,0xF8,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFF,0xC0,
  134. 0x03,0xFF,0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFF,0xC0,
  135. 0x03,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xFF,0xC0,
  136. 0x03,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xFF,0xC0,
  137. 0x03,0xFF,0xFF,0x87,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xFF,0xC0,
  138. 0x03,0xFF,0xFF,0xC1,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x83,0xC0,0xFF,0xFF,0xFF,0xC0,
  139. 0x03,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x07,0xFF,0xFF,0xC0,
  140. 0x03,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xC3,0xFF,0xFF,0xC0,
  141. 0x03,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xFF,0xF0,0x3F,0xFF,0xE1,0xFF,0xFF,0xC0,
  142. 0x03,0xFF,0xFF,0xFE,0x00,0x1F,0xFF,0xFF,0xFF,0xC3,0xFF,0xFF,0xE1,0xFF,0xFF,0xC0,
  143. 0x03,0x01,0xFF,0xF0,0x7F,0x03,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x03,0xFF,0xFF,0xC0,
  144. 0x00,0x00,0x00,0x03,0xFD,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x3F,0xFF,0xFF,0xFF,0xC0,
  145. 0x00,0x3F,0x00,0x3F,0x80,0xFF,0xFF,0xFF,0xFF,0x10,0x1F,0xFF,0xFF,0xFF,0xFF,0xC0,
  146. 0x02,0x1F,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xFE,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,
  147. 0x03,0x81,0xF8,0x00,0x03,0xFF,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,
  148. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  149. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  150. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

  151. };

  152. //
  153. void delayms(uint k)
  154. {
  155. uint data i,j;
  156. for(i=0;i<k;i++)
  157.   {
  158.     for(j=0;j<121;j++)
  159.      {;}
  160.    }
  161. }
  162. //
  163. void delayus(uint x)      
  164. {
  165.     while(--x);
  166. }
  167. /***********************/
  168. void delays(uint m)
  169. {
  170. uint i,j;
  171. for(i=0;i<m;i++)
  172.   {
  173.    for(i=0;i<1000;i++)
  174.   {
  175.     for(j=0;j<121;j++)
  176.      {;}
  177.    }
  178.    }
  179. }




  180. void Mcu_init(void)
  181. {

  182. LCD12864_init();


  183. CLERADISPLAY  
  184. CLERADISPLAY  
  185. LCD12864_init();
  186. }


  187. /*******************************************************************/
  188. void LCD12864_busy(void)
  189. {
  190.     bit BF = 0;
  191.     LCD12864_EN=0;
  192.     LCD12864_RS=0;
  193.     LCD12864_RW=1;
  194.     LCD12864_IO=0xff;  //單片機(jī)讀數(shù)據(jù)之前必須先置高位
  195.     do
  196.     {
  197.      LCD12864_EN=1;
  198.         BF=LCD12864_IO&0x80;
  199.         LCD12864_EN=0;
  200.     } while(BF);
  201.    
  202. }
  203. /*******************************************************************/
  204. //          寫入命令  
  205. /*******************************************************************/
  206. void LCD12864_command(unsigned char command)
  207. {
  208.     LCD12864_busy();
  209.     LCD12864_EN=0;
  210.     LCD12864_RS=0;
  211.     LCD12864_RW=0;  
  212.    LCD12864_IO=0xff;
  213.     LCD12864_EN=1;
  214.     LCD12864_IO=command;
  215.     LCD12864_EN=0;
  216. }


  217. //讀數(shù)據(jù)函數(shù)
  218. unsigned char LCD12864_ReadData()
  219. {
  220.   unsigned char read_data;
  221.    LCD12864_busy();
  222.     LCD12864_IO=0xff;
  223. LCD12864_RS=1;
  224. LCD12864_RW=1;
  225. LCD12864_EN=0;
  226. LCD12864_EN=1;
  227. read_data=LCD12864_IO;
  228.     LCD12864_EN=0;
  229.    
  230. return(read_data);
  231. }

  232. /*******************************************************************/
  233. //          寫入一字節(jié)數(shù)據(jù)
  234. /*******************************************************************/
  235. void LCD12864_data(unsigned char dat)
  236. {
  237.    
  238.     LCD12864_busy();
  239.     LCD12864_EN=0;
  240.     LCD12864_RS=1;
  241.     LCD12864_RW=0;
  242.     LCD12864_IO=0xff;
  243.     LCD12864_EN=1;
  244.     LCD12864_IO=dat;
  245.     LCD12864_EN=0;
  246. }


  247. /*******************************************************************/
  248. //          設(shè)置顯示位置    row(1~4),line(1~8)
  249. /*******************************************************************/
  250. void LCD12864_address(unsigned char row,unsigned char line)
  251. {
  252.     switch(row)
  253.     {
  254.         case 1:LCD12864_command(0x7f + line);
  255.         break;
  256.         case 2:LCD12864_command(0x8f + line);
  257.         break;
  258.         case 3:LCD12864_command(0x87 + line);
  259.         break;
  260.         case 4:LCD12864_command(0x97 + line);
  261.         default:
  262.         break;
  263.     }
  264. }

  265. /*****************顯示 一個(gè) 字符  **************/

  266.   void LCD12864_char (unsigned char row,unsigned char line,unsigned char a)
  267. {

  268.     LCD12864_address(row,line);
  269.     LCD12864_data(a);
  270. }

  271. /*******************************************************************/
  272. //          在指定位置顯示字符串
  273. /*******************************************************************/
  274. void LCD12864_string(unsigned char row,unsigned char line,unsigned char *s)
  275. {
  276.     unsigned char LCD12864_temp;
  277.     LCD12864_address(row,line);
  278.     LCD12864_temp=*s;
  279.     while(LCD12864_temp != 0x00)
  280.     {
  281.         LCD12864_data(LCD12864_temp);
  282.         LCD12864_temp=*(++s);
  283.     }  
  284. }

  285. /****************************
  286. 0x80 0x81 0x82 0x83 0x84 0x85 0x86 0x87 上半屏行坐標(biāo),表示的是多少列

  287. 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 下半屏行坐標(biāo),每組8列,每列16位,共128位,

  288. 0x80
  289. 0x81
  290. 0x82
  291. 0x83
  292. ........
  293. 0x9f    //列坐標(biāo),共32個(gè),表示的是行數(shù) ,分兩個(gè)半屏,每個(gè)32行,共64行
  294.          //Y坐標(biāo) 只是用來(lái)確定具體坐標(biāo),在哪一行   
  295.    功能:圖形模式下,顯示(X,Y)點(diǎn)   
  296.         輸入:X(0~127) Y(0~63) 相對(duì)屏幕坐標(biāo)  
  297.         輸出:無(wú)
  298. 點(diǎn)亮某一點(diǎn)的操作步驟: 1.求出水平坐標(biāo)X對(duì)應(yīng)的地址和是哪一位  0x80-----0x8f  (范圍0-15) X/16求地址 X%16求該地址哪一位
  299.          2.求垂直坐標(biāo)Y對(duì)應(yīng)的地址和上下半屏  0x80------0x9f(范圍0-63) Y本身就是8位地址,Y=63-Y ,Y--(0-31)
  300.          3.寫入行列地址(Y是行X是列),0x80+Y  ,0X80+X/16
  301.                        4.讀要顯示的數(shù)據(jù) DAT
  302.                        5.區(qū)分上下半屏(X%16<=7&&X%16>=0是上半屏)寫入數(shù)據(jù)每一位 DAT|0x80 ;DAT<<1
  303.              注意:這個(gè)函數(shù)顯示某一點(diǎn)時(shí),可能會(huì)把上次顯示的處于同一地址的其他位的點(diǎn)擦掉,所以先保存所有數(shù)據(jù),最后顯示,就連貫起來(lái)了


  304. *******************************/
  305. /*******************************************************************/
  306.   /**************************************************************/
  307. //------------------清整個(gè)GDRAM空間----------------------------
  308. /**************************************************************/
  309. void clrgdram()
  310. {
  311.     unsigned char x,y ;
  312.     for(y=0;y<64;y++)
  313.     for(x=0;x<16;x++)
  314.     {
  315.        LCD12864_command(0x34);
  316.        LCD12864_command(y+0x80);
  317.        LCD12864_command(x+0x80);
  318.        LCD12864_command(0x30);
  319.       LCD12864_data(0x00);
  320.       LCD12864_data(0x00);
  321.     }
  322. }

  323. /******************************************/

  324. /*******8==========================================================================
  325. 功能:圖形模式下,顯示(X,Y)點(diǎn)   
  326. 輸入:X(0~127) Y(0~63)     
  327. 輸出:無(wú)  

  328. 0x80 0x81 0x82 0x83 0x84 0x85 0x86 0x87 上半屏行坐標(biāo),表示的是多少列,X地址

  329. 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 下半屏行坐標(biāo),X地址 (水平地址 )     
  330. 0x80  (垂直地址)
  331. 0x81
  332. 0x82
  333. 0x83
  334. ........
  335. 0x9f    //列坐標(biāo),共32個(gè),表示的是行數(shù) ,分兩個(gè)半屏,每個(gè)32行,共64行
  336. ====================================================================**********/   

  337. void LCD12864_Drawpoint(uchar X,uchar Y)
  338. {
  339.      uchar i= 0, j = 0,ok=0;
  340.      uchar temp1 = 0x00,temp2 = 0x00;   
  341.      LCD12864_command(0x34);  //8位,擴(kuò)充指令,繪圖關(guān)
  342.      LCD12864_command(0x36);  //8位,擴(kuò)充指令,繪圖開
  343.      i = X/16;  //計(jì)算出X字節(jié)地址(0X80-0X8F)
  344.      j = X%16;  //計(jì)算出該字節(jié)的具體位(0-15)      
  345.      //Y = 63 - Y;
  346.    if(Y>=0 && Y<=31)//判斷上下半屏
  347.       {
  348.         ok=1;
  349.       }

  350.    else if(Y>=32 && Y<=63)//下半屏
  351.      {
  352.        Y = Y - 32;//Y只有0-31共32個(gè) 地址
  353.        i = i + 8;//X地址進(jìn)入下半屏 (0X88-0X8F)
  354.     ok=1;
  355.      }
  356.       
  357.    if(ok)
  358.     {
  359.      //讀數(shù)據(jù)操作
  360.         LCD12864_command(0x80+Y);   //第一步:設(shè)置Y坐標(biāo),讀數(shù)據(jù)先寫地址,寫GDRAM時(shí)先寫垂直地址(0X80-0X9F)
  361.         LCD12864_command(0x80+i);  //第二步:設(shè)置X坐標(biāo)   

  362.         LCD12864_ReadData();    //第三步:空讀取一次   
  363.         temp1 =LCD12864_ReadData();    //第四步:讀取高字節(jié),先讀高字節(jié)
  364.         temp2 =LCD12864_ReadData();   //第五步:讀取低字節(jié)   

  365.           //圖形模式下的寫數(shù)據(jù)操作   
  366.         LCD12864_command(0x80+Y);    //第一步:設(shè)置Y坐標(biāo)  
  367.         LCD12864_command(0x80+i);   //第二步:設(shè)置X坐標(biāo)  

  368.          if(j>=0 && j<=7)   //判斷是高字節(jié)
  369.           {  
  370.          LCD12864_data(temp1|(0x80>>j));  //第三步:寫高字節(jié)數(shù)據(jù)  
  371.          LCD12864_data(temp2);      //第四步:寫低字節(jié)數(shù)據(jù)     
  372.           }
  373.          else if(j>7 && j<=15)   //判斷是低字節(jié)
  374.            {   
  375.               j = j - 8;  
  376.             LCD12864_data(temp1);
  377.             LCD12864_data(temp2|(0x80>>j));  //改變字節(jié)里的位   
  378.            }   
  379.       }


  380.       
  381.    
  382. }
  383. /******************************************/
  384. //畫線
  385. /********************************************/
  386. //畫水平線
  387. void LCD12864_LineX(unsigned char X0, unsigned char X1, unsigned char Y)
  388. {
  389. unsigned char Temp ;
  390. if( X0 > X1 )
  391. {
  392. Temp = X1 ;    //交換X0 X1值  
  393. X1 = X0 ;     //大數(shù)存入X1
  394. X0 = Temp;   //小數(shù)存入X0
  395. }

  396. for( ; X0 <= X1 ; X0++ )
  397. LCD12864_Drawpoint(X0,Y);
  398. }
  399. //畫垂直線  
  400. void LCD12864_LineY( unsigned char X, unsigned char Y0, unsigned char Y1)
  401. {
  402. unsigned char Temp ;
  403. if( Y0 > Y1 )//交換大小值
  404. {
  405. Temp = Y1 ;
  406. Y1 = Y0 ;
  407. Y0 = Temp ;
  408. }
  409. for(; Y0 <= Y1 ; Y0++)
  410. LCD12864_Drawpoint( X, Y0) ;
  411. }


  412. /******************************************/
  413. /**************畫圖************************/


  414.   void LCD12864_DrawPicture( unsigned char code *pic)
  415. {
  416.     unsigned char i, j, k ;
  417.         LCD12864_command(0x34);//開擴(kuò)充指令
  418.         LCD12864_command(0x36);//開繪圖功能   

  419. for( i = 0 ; i < 2 ; i++ )//分上下兩屏寫   
  420. {
  421. for( j = 0 ; j < 32 ; j++)//垂直地址遞加 ,行掃方式
  422. {
  423.   LCD12864_command( 0x80 + j ) ;//寫Y坐標(biāo)(Y的范圍: 0X80-0X9F )
  424. if( i == 0 ) //寫X坐標(biāo)
  425. {
  426. LCD12864_command(0x80);//上半屏
  427. }
  428. else
  429. {
  430. LCD12864_command(0x88);//下半屏開始地址
  431. }

  432. for( k = 0 ; k < 16 ; k++ ) //寫一整行數(shù)據(jù)
  433. {
  434. LCD12864_data( *pic++ );//前面只寫入首地址,后面依次寫入數(shù)據(jù),地址會(huì)自動(dòng)遞增  
  435. }

  436. }
  437. }
  438. LCD12864_command( 0x30);//恢復(fù)到一般模式
  439. }


  440. //          初始化設(shè)置
  441. /*******************************************************************/
  442. void LCD12864_init(void)
  443. {
  444.     CLERADISPLAY      //  clear DDRAM
  445.     LCD12864_command(0x30);     //  8 bits unsigned interface,basic instrument
  446.     LCD12864_command(0x02);     //  cursor return
  447.     LCD12864_command(0x0c);     //  display,cursor on
  448.     LCD12864_command(0x03);   
  449.     LCD12864_command(0x06);
  450.     CLERADISPLAY       //  clear DDRAM
  451. }

  452. //
  453. //顯示函數(shù)
  454. void display(unsigned long int sx,uchar j)
  455. {

  456.       a1=sx/100000;
  457.       a2=sx%100000/10000;
  458.       a3=sx%10000/1000;//千位
  459.       a4=sx%1000/100;//百位
  460.       a5=sx%100/10;//十位
  461.    a6=sx%10;//個(gè)位

  462.    switch(j)
  463. {
  464.     case 0x00: LCD12864_string(2,5,"  Ua    ");break;
  465.     case 0x01: LCD12864_string(2,5,"  Ub    ");break;
  466.     case 0x02: LCD12864_string(2,5,"  Uc    ");break;
  467.     case 0x03: LCD12864_string(2,5,"  E     ");break;
  468.     case 0x04: LCD12864_string(2,5,"  轉(zhuǎn)速  ");break;
  469. case 0x05: LCD12864_string(2,5,"  頻率  ");break;
  470. case 0x06: LCD12864_string(2,5,"脈沖計(jì)數(shù)");break;
  471. case 0x07: LCD12864_string(2,5,"        ");break;
  472.   default :break;
  473. }
  474. LCD12864_command(0x90); //指定顯示位置
  475. LCD12864_data(num[a1]); //從最高位開始顯示
  476. LCD12864_data(num[a2]);
  477. LCD12864_data(num[a3]);
  478. LCD12864_data(num[a4]);
  479. LCD12864_data(num[a5]);
  480. LCD12864_data(num[10]);//小數(shù)點(diǎn),前面測(cè)量計(jì)算時(shí)擴(kuò)大了10倍,這里縮小回來(lái)
  481. LCD12864_data(num[a6]);

  482. }


  483. /*********************************
  484.                        主函數(shù)入口
  485. /********************************************/
  486. //主函數(shù)入口
  487. //
  488. main()
  489. {

  490. uchar ii=0;
  491. CONTRL=0;
  492. FLAG=0;
  493. P0=0x00;
  494. LED1=0;
  495. LED1=1;
  496. P0=0x00;
  497. LED2=0;
  498. LED2=1;
  499. P0=0x00;
  500. SHUCHU=0;//打開閘門
  501. SHUCHU=1;
  502. baohu();//判斷采樣數(shù)據(jù)保護(hù)
  503. Mcu_init();

  504. CLERADISPLAY
  505. delays(1);
  506. display(100000,7);
  507. LCD12864_char(1,2,'A');

  508. LCD12864_string(1,2,"shaozhanyu");
  509. delays(2);
  510. clrgdram();

  511. CLERADISPLAY
  512. delays(1);
  513. clrgdram();
  514. delays(1);
  515. LCD12864_LineX(8,113,25);
  516. clrgdram();

  517. CLERADISPLAY
  518. delays(2);
  519. clrgdram();
  520. LCD12864_LineY(55,29,57);
  521. delays(2);

  522. clrgdram();
  523. delays(1);

  524. LCD12864_DrawPicture(Bmp019);
  525. delays(3);


  526. Mcu_init();

  527. CLERADISPLAY

  528. LCD12864_string(3,1,"U V W E SP F CT");
  529. LCD12864_char(2,1,'D');
  530. LCD12864_string(4,1,"計(jì)數(shù)");
  531. LCD12864_string(1,2,"少占魚做");
  532. delays(1);
  533. /***************8888
  534.     P0=0x10;//怠速,準(zhǔn)備打開K5繼電器,關(guān)閉其他輸出繼電器
  535.    SHUCHU=0;//打開輸出閘門
  536. SHUCHU=1;//關(guān)閉閘門
  537. outflag=0;//輸出標(biāo)志位
  538. ******************/
  539.   AD=0.0;
  540. LCD12864_string(1,2,"燈光測(cè)試");

  541. P0=0x41;
  542. LED1=0;
  543. LED1=1;
  544. delayms(1000);
  545. P0=0x42;
  546. LED1=0;
  547. LED1=1;
  548. delayms(1000);
  549. P0=0x44;
  550. LED1=0;
  551. LED1=1;
  552. delayms(1000);
  553. P0=0x48;
  554. LED1=0;
  555. LED1=1;
  556. delayms(1000);
  557. P0=0x50;
  558. LED1=0;
  559. LED1=1;
  560. delayms(1000);
  561. P0=0x60;
  562. LED1=0;
  563. LED1=1;
  564. delayms(1000);

  565. P0=0x41;
  566. LED2=0;
  567. LED2=1;
  568. delayms(1000);

  569. P0=0x42;
  570. LED2=0;
  571. LED2=1;
  572. delayms(1000);
  573. P0=0x44;
  574. LED2=0;
  575. LED2=1;
  576. delayms(1000);
  577. P0=0x48;
  578. LED2=0;
  579. LED2=1;
  580. delayms(1000);
  581. P0=0x50;
  582. LED2=0;
  583. LED2=1;
  584. delayms(1000);
  585. P0=0x60;
  586. LED2=0;
  587. LED2=1;
  588. delayms(1000);
  589. P0=0x00;
  590. LED1=0;
  591. LED1=1;
  592. P0=0x00;
  593. LED2=0;
  594. LED2=1;
  595. delayms(500);
  596. LCD12864_string(1,2,"測(cè)繼電器");


  597. P0=0x04;//啟動(dòng)
  598. SHUCHU=0;//打開閘門
  599. delays(3);
  600. SHUCHU=1;

  601.   P0=0x18;//停機(jī)
  602. SHUCHU=0;//打開閘門
  603. delays(3);
  604. SHUCHU=1;

  605. P0=0x40;//怠速,準(zhǔn)備打開K5繼電器,關(guān)閉其他輸出繼電器
  606. SHUCHU=0;//打開輸出閘門

  607. delays(3);
  608.   SHUCHU=1;//關(guān)閉閘門
  609. P0=0xa0;//準(zhǔn)備合閘(交流,直流 內(nèi)控制 )   
  610. SHUCHU=0;

  611.   delays(3);
  612.    SHUCHU=1;
  613.   P0=0x00;
  614. SHUCHU=0;//打開閘門
  615. SHUCHU=1;


  616. keychuli(); //掃描并處理按鍵
  617. delayms(600);
  618. voltage();
  619. LCD12864_string(3,1,"U V W E SP F ");
  620. LCD12864_char(2,1,'D');
  621. LCD12864_string(1,2,"少氏出品");
  622. delays(11);
  623. ///初始化
  624. LCD12864_string(4,1,"直流正常");
  625. init();

  626. while(1)

  627. {
  628.    while(!FLAG); //等待頻率測(cè)出
  629.   
  630.   keychuli(); //掃描并處理按鍵
  631. LCD12864_string(1,2,"測(cè)量電壓");
  632. delayms(500);
  633. voltage();  //采樣電壓

  634. LCD12864_string(1,2,"轉(zhuǎn)換完成");
  635. delayms(600);
  636. baohu();//判斷采樣數(shù)據(jù)保護(hù)

  637.   for(;ii<6;)
  638.      {
  639. if(xunhuanflag==0)  //定點(diǎn)
  640. {display(DAT[ii],ii);
  641.   LCD12864_string(1,2,"定點(diǎn)顯示");
  642.   break;
  643.   }  
  644.   display(DAT[ii],ii);
  645.   LCD12864_string(1,2,"循環(huán)顯示");
  646.      
  647.   delayms(2200);
  648.   keychuli();
  649.   ii++;

  650. }//循環(huán) 顯示結(jié)束
  651.   if(ii==6)
  652.   ii=0;

  653. LCD12864_string(1,2,"下輪復(fù)位");
  654.    delayms(700);
  655.    init();

  656. }
  657. }
  658. /*************************************/
  659. //初始化函數(shù)  
  660. void init()

  661. {  
  662. /******T1定時(shí)器模式,外部INT1控制開啟,T0計(jì)數(shù)器不允許中斷,外部控制

  663. INTO開啟,外部中斷0允許(EX0=1),   
  664.      定時(shí)器T2中斷允許 (ET2=1) ************/  
  665.    CONTRL=0;
  666.       FLAG=0;
  667.    EX0=0;
  668.       ET2=0;
  669.       //三個(gè)定時(shí)器方式設(shè)置
  670.       TMOD=0x9d; //T0T1方式控制   
  671.       T2MOD=0x00;
  672.       T2CON=0x00;//定時(shí)器2,16位定時(shí)方式,自動(dòng)重裝。      
  673.    
  674.       TH0= 0x00; // T0高8位
  675.       TL0= 0x00; // T0低8位
  676.                      
  677.       TH1= 0x00; // T1高8位
  678.       TL1= 0x00; // T1低8位
  679.    EXEN2=0;  
  680.       TH2=256/256;
  681.       TL2=256%256;
  682.    RCAP2H=256/256;
  683.    RCAP2L=256%256;

  684.       //中斷設(shè)置        5
  685.       EX0=1;//允許外部0輸入中斷(INT0引腳)
  686.       ET2=1; //開定時(shí)中斷2
  687.       IT0=1; //外部中斷0邊沿觸發(fā),下降沿到來(lái)觸發(fā)
  688.       //優(yōu)先級(jí)設(shè)置
  689.    PX0=1;
  690.       //預(yù)置T0,T1
  691.       TR1=1;//先允許T1定時(shí),因T1的GATE=1,還要等外部INT1高電平才計(jì)數(shù)
  692.       TR0=1;//先允許T0計(jì)數(shù) ,同T1一樣,等待INTO高電平     
  693.       TR2=1;//啟動(dòng)T2定時(shí),不用外部控制,直接啟動(dòng)   
  694.       EA=1; //開全局中斷
  695.    CONTRL=1;

  696.       //初始化完成......
  697. }
  698. /**********************************
  699. void reset()
  700. {
  701.   CONTRL=0;
  702.   FLAG=0;
  703.   TL0=0x00;
  704.   TH0=0x00;
  705.   TL1=0x00;
  706.   TH1=0x00;
  707.   TF2=0;
  708.   TH2=256/256;
  709.   TL2=256%256;
  710.   TR1=1;//先允許T1定時(shí),因T1的GATE=1,還要等外部INT1高電平才計(jì)數(shù)
  711.   TR0=1;//先允許T0計(jì)數(shù) ,同T1一樣,等待INTO高電平     
  712.   TR2=1;//啟動(dòng)T2定時(shí),不用外部控制,直接啟動(dòng)     
  713.   EA=1; //開全局中斷
  714.   CONTRL=1;
  715.   
  716. }
  717. *******************************/
  718. //鍵盤掃描
  719. uchar scanf()
  720. {
  721.   uchar value;
  722.   P0=0xff;
  723.   delayms(1);
  724.   SCANF=0;//打開鍵掃閘門
  725.   value=P0;
  726.   delayms(2);
  727.   value=P0;
  728.   SCANF=1;
  729.   return  value;
  730. }

  731. /********************************/
  732. //鍵處理
  733. void keychuli()
  734. {
  735.    uchar k;

  736.    //關(guān)于指示燈,交流是一組,直流是一組,其他狀態(tài)用液晶顯示
  737.     /***************************************/

  738.    /******************/
  739.    key=scanf();
  740.    /******************/
  741.    //啟動(dòng)鍵判斷
  742.    if(key1==0&&key7==0&&DAT[4]==0)//啟動(dòng)位 ,油壓和轉(zhuǎn)速為0
  743. {
  744. for(k=0;k<3;k++)//三次啟動(dòng)循環(huán)
  745. {
  746.      P0=0x04;//準(zhǔn)備 輸出K6繼電器
  747.      SHUCHU=0;//打開閘門
  748. delays(3);//隔三秒響應(yīng)一次停機(jī)鍵   
  749. //響應(yīng)停機(jī)鍵     
  750.   key=scanf();
  751.      if(key0==0&&key7==1&&DAT[4]>500)//停機(jī)開關(guān)狀態(tài),油壓高,轉(zhuǎn)速達(dá)到500,其他繼電器都停止工作 ,所以 ,P0=0x08
  752.    {
  753.     P0=0x18;//準(zhǔn)備輸出K0,K9繼電器
  754.    SHUCHU=0;//打開輸出閘門
  755. SHUCHU=1;//關(guān)閉閘門
  756. outflag=0;//輸出標(biāo)志位
  757. }
  758. if(key1==0&&key7==1&&DAT[4]>430) //每啟動(dòng)一次都判斷是否成功,成功直接跳出
  759. break ; //判斷啟動(dòng)成功,立即跳出啟動(dòng)for 循環(huán)

  760.   delays(3);//沒(méi)有啟動(dòng)成功,繼續(xù)啟動(dòng)3秒
  761.   key=scanf();
  762.      if(key1==0&&key0==0&&key7==1&&DAT[4]>500)//停機(jī),油壓高,轉(zhuǎn)速達(dá)到500,其他繼電器都停止工作 ,所以 ,P0=0x08
  763.    {
  764.     P0=0x18;//準(zhǔn)備輸出K0,K9繼電器
  765.    SHUCHU=0;//打開輸出閘門
  766. SHUCHU=1;//關(guān)閉閘門
  767. outflag=0;//輸出標(biāo)志位
  768. }
  769.   if(key1==0&&key7==1&&DAT[4]>430) //每啟動(dòng)一次都判斷是否成功,成功直接跳出
  770. break ;
  771.   delays(3);
  772.   key=scanf();
  773.      if(key0==0&&key7==1&&DAT[4]>500)//停機(jī),油壓高,轉(zhuǎn)速達(dá)到500,其他繼電器都停止工作 ,所以 ,P0=0x08
  774.    {
  775.     P0=0x18;//準(zhǔn)備輸出K0,K9繼電器
  776.    SHUCHU=0;//打開輸出閘門
  777. SHUCHU=1;//關(guān)閉閘門
  778. outflag=0;//輸出標(biāo)志位
  779. }
  780.      if(key1==0&&key7==1&&DAT[4]>430) //每啟動(dòng)一次都判斷是否成功,成功直接跳出
  781. break ;
  782.    
  783.   P0=0x18;//停止
  784.   SHUCHU=0;
  785.   SHUCHU=1;
  786.   delays(9);
  787. }//for啟動(dòng)循環(huán)結(jié)束
  788.      SHUCHU=1;//關(guān)閉閘門

  789.    /**********************/
  790.    //啟動(dòng)失敗判斷
  791.     if(key7==0) //油壓低
  792.     if(DAT[4]<440)
  793.      {
  794. P0=0x01;//點(diǎn)亮啟動(dòng)失敗燈
  795. LED1=0;//開啟573輸入
  796. LED1=1;//關(guān)閉使能,74HC573鎖定狀態(tài)
  797. outflag=0;//輸出標(biāo)志位清0,表示輸出未允許
  798.      }
  799. }

  800.    //停機(jī)鍵判斷
  801.   /********************/
  802.    if(key0==0&&key7==1&&DAT[4]>500)//停機(jī),油壓高,轉(zhuǎn)速達(dá)到500,其他繼電器都停止工作 ,所以 ,P0=0x08
  803.    {
  804.      P0=0x00;//準(zhǔn)備交直流斷閘(交流,直流 內(nèi)控制 )   
  805.   SHUCHU=0;
  806.   SHUCHU=1;
  807.   delayms(3);
  808.         P0=0x40;//怠速,準(zhǔn)備打開K5繼電器,關(guān)閉其他輸出繼電器
  809.        SHUCHU=0;//打開輸出閘門
  810.      SHUCHU=1;//關(guān)閉閘門
  811.      outflag=0;
  812.   delays(29);
  813.     P0=0x18;//準(zhǔn)備 輸出K0和K9停油繼電器
  814.    SHUCHU=0;//打開輸出閘門
  815. SHUCHU=1;//關(guān)閉閘門
  816. outflag=0;//輸出標(biāo)志位
  817. }

  818. /*****************/
  819. //應(yīng)急鍵判斷
  820.        if(key6==1)//應(yīng)急/正常,高電位應(yīng)急
  821.        {
  822.     eding=1;//應(yīng)急標(biāo)志

  823.        }
  824.      else if(key6==0) //進(jìn)入怠速
  825.           {
  826.         eding=0;//怠速標(biāo)志
  827.           }
  828.    if(eding==0)//對(duì)怠速的處理
  829.     {
  830.         P0=0x40;//怠速,準(zhǔn)備打開K5繼電器,關(guān)閉其他輸出繼電器
  831.        SHUCHU=0;//
  832.      SHUCHU=1;//關(guān)閉閘門
  833.      outflag=0;
  834.        }
  835.   if(eding==1&&outflag==0)//對(duì)額定的處理
  836.     {
  837. P0=0x00;//額定,準(zhǔn)備關(guān)閉K5繼電器,進(jìn)入額定,其他繼電器都停止工作 ,所以 ,P0=0x00
  838.    SHUCHU=0;//打開輸出閘門
  839. SHUCHU=1;//關(guān)閉閘門
  840. delayms(2);

  841. if(DAT[0]>110&&DAT[1]>110&&DAT[2]>110&&DAT[5]>390)//三相交流大于110 ,頻率大于390
  842.      {
  843.   P0=0xa0;//準(zhǔn)備合閘(交流,直流 內(nèi)控制 )   
  844.   SHUCHU=0;
  845.   SHUCHU=1;
  846.   outflag=1;//合閘后,輸出標(biāo)志位置1
  847.      }
  848.      }
  849. /******************************/
  850. //循環(huán)鍵
  851. if(key2==1) //處理循環(huán)定點(diǎn)顯示標(biāo)志位
  852. xunhuanflag=1;
  853. else if(key2==0)
  854. xunhuanflag=0;

  855.    /*********************/
  856. //燈光檢查鍵
  857.    if(key4==0)//燈光檢查
  858.    {
  859.     LED1=1;
  860. LED2=1;
  861.     P0=0x7f;
  862.     LED1=0;
  863. delayus(10);
  864. LED1=1;
  865. delayms(1000);
  866. P0=0x7f;
  867. LED2=0;
  868. delayus(10);
  869. LED2=1;
  870. }

  871. /************************/
  872. //復(fù)位鍵
  873.    if(key5==0)//復(fù)位
  874.    {
  875.     P0=0x00;
  876.     LED1=0;
  877. delayus(10);

  878. LED1=1;
  879. P0=0x00;
  880. LED2=0;
  881. delayus(10);
  882. LED2=1;
  883. }

  884.    /****************/
  885.    //自檢鍵
  886.    if(key3==0) //自檢
  887.    { }

  888. }

  889. /**********保護(hù)函數(shù)*****************/
  890. void baohu()
  891. {
  892. if(outflag==1)//前提是已經(jīng)輸出
  893. {
  894. //立即保護(hù)值
  895. if((DAT[0]<800||DAT[1]<800||DAT[2]<800) || (DAT[0]>1800||DAT[1]>1800||DAT[2]>1800) || DAT[5]>4450||DAT[5]<3200)//立即斷閘保護(hù)
  896.   {

  897.   P0=0x00;//準(zhǔn)備斷閘(交流,直流 內(nèi)控制 )   
  898.   SHUCHU=0;
  899.   SHUCHU=1;
  900.   outflag=0;//斷閘后,輸出標(biāo)志位清0
  901.   
  902.   if(DAT[0]>1800||DAT[1]>1800||DAT[2]>1800)
  903.   {
  904.   P0=0x80;//過(guò)壓
  905.   LED1=0;
  906.   LED1=1;
  907.   }
  908.    if(DAT[5]>4450)
  909.   {
  910.   P0=0x80;//過(guò)頻燈
  911.   LED2=0;
  912.   LED2=1;
  913.   }
  914.   if(DAT[0]<800||DAT[1]<800||DAT[2]<800)
  915.   {
  916.   P0=0x40;//欠壓
  917.   LED1=0;
  918.   LED1=1;
  919.   }
  920.   if(DAT[5]<3200)
  921.   {
  922.   P0=0x40;//欠頻燈
  923.   LED2=0;
  924.   LED2=1;
  925.   }

  926.    }//立即保護(hù)結(jié)束

  927.   // 延時(shí)保護(hù)值     
  928. if(DAT[0]<1000||DAT[1]<1000||DAT[2]<1000|| DAT[0]>1270||DAT[1]>1270||DAT[2]>1270|| DAT[5]>4300||DAT[5]<3700)
  929.    {  

  930.   if(DAT[0]>1270||DAT[1]>1270||DAT[2]>1270)
  931.   {

  932.   P0=0x80;//過(guò)壓
  933.   LED1=0;
  934.   LED1=1;


  935.   }
  936.    if(DAT[5]>4300)
  937.   {
  938.   P0=0x80;//過(guò)頻
  939.   LED2=0;
  940.   LED2=1;
  941.   }
  942.   if(DAT[0]<1000||DAT[1]<1000||DAT[2]<1000)
  943.   {

  944.   P0=0x40;//欠壓
  945.   LED1=0;
  946.   LED1=1;
  947.   }
  948.   if(DAT[5]<3700)
  949.   {
  950.   
  951.   P0=0x40;//欠頻
  952.   LED2=0;
  953.   LED2=1;
  954.   }
  955.   delays(4);//等待交流恢復(fù)
  956.   voltage();

  957. if(DAT[0]>1100&&DAT[1]>1100&&DAT[2]>1100&&DAT[5]>3900)//三相交流大于110 ,頻率大于390
  958.      {
  959.   P0=0x00;
  960.   LED1=0;
  961.   LED1=1;
  962.   P0=0x00;
  963.   LED2=0;
  964.   LED2=1;
  965.   P0=0xa0;//準(zhǔn)備合閘(交流直流內(nèi)控制 )   
  966.   SHUCHU=0;
  967.   SHUCHU=1;
  968.   outflag=1;//合閘后,輸出標(biāo)志位置1     
  969.         }
  970. else
  971. {

  972.   P0=0x00;//準(zhǔn)備斷閘(交流,直流 內(nèi)控制 )   
  973.   SHUCHU=0;
  974.   SHUCHU=1;
  975.   outflag=0;
  976. }

  977.    }//交流和頻率保護(hù)結(jié)束
  978. //直流電壓延時(shí)保護(hù)
  979.    if(DAT[3]>320||DAT[3]<170)
  980.    {if(DAT[3]>320)
  981.   {
  982.   LCD12864_string(4,1,"直流過(guò)壓");
  983.   }
  984.   delays(4);//等待直流過(guò)壓恢復(fù)
  985.   voltage();
  986. if(DAT[3]>170&&DAT[3]<320)
  987. {
  988.   LCD12864_string(4,1,"直流正常");
  989. }
  990. else
  991. {P0=0x80;//關(guān)閉直流只開交流,因?yàn)榍懊嬉呀?jīng)檢測(cè)過(guò)交流了,這里就不管了,當(dāng)他正常   
  992.   SHUCHU=0;
  993.   SHUCHU=1;
  994.   outflag=1;
  995.   LCD12864_string(4,1,"直流故障");
  996. }
  997.    if(DAT[3]<170)
  998.   {
  999.   LCD12864_string(4,1,"直流欠壓");
  1000.   }
  1001.    delays(2);//等待直流 欠壓恢復(fù)
  1002.    voltage();
  1003. if(DAT[3]>170&&DAT[3]<320)
  1004. {
  1005.   LCD12864_string(4,1,"直流正常");
  1006. }
  1007. else
  1008. {P0=0x80;//關(guān)閉直流只開交流,因?yàn)榍懊嬉呀?jīng)檢測(cè)過(guò)交流了,這里就不管了,當(dāng)他正常   
  1009.   SHUCHU=0;
  1010.   SHUCHU=1;
  1011.   outflag=1;
  1012.   LCD12864_string(4,1,"直流故障");
  1013. }
  1014.    }//直流延時(shí)保護(hù)結(jié)束
  1015. }//總 保護(hù)結(jié)束
  1016. }//總函數(shù)結(jié)束
  1017. /*******************************/
  1018. //轉(zhuǎn)速計(jì)算  ,頻率計(jì)算
  1019. void zhuansu()
  1020. {
  1021. t1h=TH0;
  1022. t1l=TL0;
  1023. t2h=TH1;
  1024. t2l=TL1;
  1025. cnt1=t1l+(t1h<<8);
  1026. cnt2=t2l+(t2h<<8);
  1027. DAT[6]=cnt1/cnt2*1000000.20*10.00;//計(jì)數(shù)值
  1028. DAT[4]=cnt1/cnt2*1000000.200/124.00*600.00*10.0; //計(jì)算轉(zhuǎn)速,信號(hào)頻率就是單片機(jī)計(jì)數(shù)頻率的整數(shù)倍   ,這里這樣寫是怕cnt1 cnt2 超出范圍
  1029. //注意這里: cnt1 cnt2  的類型不能是 uint 否則第一步計(jì)算除法會(huì)得0 , 如果你要先乘1000000.0,也不行。因?yàn)槌隽藆int 范圍
  1030. DAT[5]=DAT[4]*16.00/60.000*10.0;//電壓頻率計(jì)算

  1031. }

  1032. /******************************/
  1033. //外部中斷0,調(diào)用轉(zhuǎn)速計(jì)算
  1034. void interint0()  interrupt 0 //using **
  1035.       //外部中斷0處理      
  1036. {
  1037. EA=0;
  1038. zhuansu();//調(diào)用轉(zhuǎn)速函數(shù)
  1039.   FLAG=1;
  1040. /***注意:因?yàn)門O T1是外部引腳控制的,所以,這時(shí)外部低電平,自動(dòng)停止。不用軟件停止**/  
  1041. }     
  1042. void intertimer2()  interrupt 5 //using **
  1043.       //T2定時(shí)中斷處理      
  1044. {  
  1045.   TR2=0;
  1046.   CONTRL=0;//關(guān)閉閘門信號(hào)   
  1047. }     

  1048. /*******************************/
  1049. //AD轉(zhuǎn)換程序

  1050. /************************************************/
  1051. //常測(cè)數(shù)據(jù)函數(shù)
  1052. void voltage() //電壓測(cè)量
  1053. {
  1054. uchar i;

  1055. AD=0.00;
  1056. X=0;

  1057. for(i=0;i<10;i++)
  1058. {
  1059. AD+=rd1543(0x08); //讀取AD值
  1060. }
  1061. //
  1062. AD=AD/10.0;
  1063. X=AD*46.0001*50.00/1023.00;//轉(zhuǎn)換成電壓值 ,分辨率是10位
  1064. DAT[0]=X;

  1065. AD=0.00;

  1066. //
  1067. for(i=0;i<10;i++)
  1068. {
  1069. AD+=rd1543(0x08); //讀取AD值
  1070. }
  1071. //
  1072. AD=AD/10.0;
  1073. X=AD*46.0001*50.00/1023.00;//轉(zhuǎn)換成電壓值 ,分辨率是10位
  1074. DAT[1]=X;
  1075. //
  1076. AD=0.00;

  1077. //
  1078. for(i=0;i<10;i++)
  1079. {
  1080. AD+=rd1543(0x08); //讀取AD值
  1081. }
  1082. //
  1083. AD=AD/10.0;
  1084. X=AD*46.0001*50.00/1023.00;//轉(zhuǎn)換成電壓值 ,分辨率是10位
  1085. DAT[2]=X;
  1086. //
  1087. /*********
  1088. for(i=0;i<20;i++)
  1089. {
  1090. AD+=rd1543(0x07); //讀取AD值

  1091. }
  1092. //
  1093. AD=AD/20;
  1094. X=AD*50.000/1023.000*28.500/4.000;
  1095. DAT[3]=X;
  1096. //
  1097. **********/
  1098. }
  1099. /***********************************************/


  1100. //TLC1543輸入模擬電壓范圍: 0-4.9152 V
  1101. //TLC1543AD 10個(gè)時(shí)鐘方式  方式1 。 LC1543 有四位精度 。  輸入 0.0024v 時(shí),AD值為0000000001  
  1102. //0.0048時(shí),還為1。  0.0072為 2    也就是0.0048 為一個(gè) 寬度  0.0048*AD 就是電壓值 .

  1103. uint rd1543(uchar addr)
  1104. {
  1105.      uint date_out=0;
  1106.   uchar k;
  1107.    
  1108.     // uchar j;
  1109.      CLK=0;
  1110.      CS=0;

  1111.           ADDRESS=(bit)(addr&0x08); //用這種愚蠢的方法比用FOR循環(huán)快的多 。
  1112.     CLK=1;
  1113.     CLK=0;
  1114.           addr=addr*2; //用乘法比用左移快
  1115.      
  1116.           ADDRESS=(bit)(addr&0x08);
  1117.     CLK=1;
  1118.     CLK=0;
  1119.           addr=addr*2; //用乘法比用左移快
  1120.     ADDRESS=(bit)(addr&0x08);
  1121.     CLK=1;
  1122.     CLK=0;
  1123.           addr=addr*2; //用乘法比用左移快
  1124.     ADDRESS=(bit)(addr&0x08);
  1125.     CLK=1;
  1126.     CLK=0;
  1127.           addr=addr*2; //用乘法比用左移快
  1128.       
  1129.   

  1130. // for (j=0;j<6;j++)     //填充6 個(gè)CLOCK     
  1131.    // {
  1132.       CLK=1;CLK=0;   //這里不用循環(huán),省時(shí)間
  1133.    CLK=1;CLK=0;
  1134.    CLK=1;CLK=0;
  1135.    CLK=1;CLK=0;
  1136.    CLK=1;CLK=0;
  1137.    CLK=1;CLK=0;
  1138.       CLK=0;
  1139.    // }
  1140.       CS=1;
  1141.       delayus(8);  //等待AD 轉(zhuǎn)換
  1142.       CS=0;                  
  1143.   for(k=0;k<10;k++)
  1144.      {
  1145.     SDATA=1;                 //非P0口作為數(shù)據(jù)總線使用時(shí),讀入數(shù)據(jù)前要賦值1,特別
  1146.        CLK = 1;         //是既用于寫有用于讀的情況下.
  1147.        date_out<<=1;
  1148.        if(SDATA) date_out += 1;  //這樣寫法比下面的方法速度快(5us)
  1149.   // date_out=date_out|SDATA;//用時(shí)6US
  1150.        CLK = 0;
  1151.      }
  1152.      return(date_out);
  1153. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:70172 發(fā)表于 2014-12-31 22:33 | 只看該作者
樓租啊,絲天津人!
回復(fù)

使用道具 舉報(bào)

板凳
ID:72128 發(fā)表于 2015-1-13 17:37 | 只看該作者
很好的資料
回復(fù)

使用道具 舉報(bào)

地板
ID:72128 發(fā)表于 2015-1-13 17:38 | 只看該作者
沒(méi)有原理圖啊
回復(fù)

使用道具 舉報(bào)

5#
ID:60306 發(fā)表于 2016-5-20 14:36 | 只看該作者
兄弟 你的電路挑出來(lái)了沒(méi)  你看看我這圖與你哪個(gè)有啥區(qū)別[

設(shè)計(jì)總圖.jpg (1.52 MB, 下載次數(shù): 209)

測(cè)Voltage current

測(cè)Voltage current
回復(fù)

使用道具 舉報(bào)

6#
ID:236666 發(fā)表于 2019-1-2 14:19 | 只看該作者
1000多行程序。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表