欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9435|回復: 5
打印 上一主題 下一主題
收起左側

TLC1543交流電壓測試(單片機)教訓版

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 daming 于 2014-12-29 00:30 編輯

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



先說一下,交流電壓,搞了我幾個月,搞死我了,找了好幾種方法轉直流,進AD,就是不行。NND!!!!
在軟件上仿真了好幾個電路,都蠻好的波形。焊成板子就是不行,沒出來電壓,要么就是不滑,進了AD差天上去了,N次想砸了它GOUNIANGYANGDE!!!!!!
今天!!就在今(四聲)天!!!!用的運放半波整流加RC濾波,不接入AD,調放大倍數后得到對應直流電壓。接入AD后再看,MD!!!電壓從珠穆朗瑪都拉到貝加爾湖了!!中間串了個20K電阻(看TNND還拉低不!!)終于用表在線量OK了,程序OK了。TLC1543啊!!NNND!!!!讓我一度認為運放不合適,想換其他運放,一度換電路,一度迷茫“為嘛仿真的和現實就不符昵”為嘛現實和理想差距這么大哩!!!!!一度認為仿真軟件有問題!!!
所以:教訓:(單片機) 教訓版:
       注意電路供流能力,空載和負載的電壓變化受到什么影響!
       注意器件屬于電壓輸入型還是電流輸入型,要“限流”,還是增大“供流”!!!
       不要總是考慮電阻大影響電壓,人家電流小啊!!uA級別的,TLC1543就需要限流!!!
        以后再不注意這些問題!我就不姓少!!!!!!!!!!!!!
    還有一個待解決問題:運放做的正弦峰值檢測電路,仿真蠻好的,焊成板子就是不行,電壓直接奔最高了。為嘛!!這一切都是為嘛!!運放我用的LM358,用單電池供電不行,用倆電池供電,也不行!!!
  1. /********多周期測頻法,精度與晶振和閘門時間有關。晶振越大,閘門時間越長,都可以提高精度。************************/
  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;//存儲電壓值的每一位,設計a4,a5是小數位.
  9. const uchar num[]="0123456789. ";


  10. //AD轉換控制腳

  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; //測頻控制腳

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

  44. //
  45. bit FLAG; //測頻標志位
  46. bit xunhuanflag;//顯示方式標志位
  47. bit outflag; //允許輸出標志
  48. bit  eding;//額定狀態標志   
  49. // 按鍵存儲   
  50. bdata uchar key; //鍵值存儲

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

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

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

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

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


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

  80. /*------------------------------------------------------------------------------
  81. ;  若數據亂碼,請檢查字模格式設置,注意選擇正確的取模方向和字節位順序。
  82. ;  源文件 / 文字 : C:\Documents and Settings\Administrator\桌面\888.bmp字模
  83. ;  寬×高(像素): 128×64
  84. ;  字模格式/大小 : 單色點陣液晶字模,橫向取模,字節正序/1024字節
  85. ;  數據轉換日期  : 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;  //單片機讀數據之前必須先置高位
  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. //讀數據函數
  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. //          寫入一字節數據
  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. //          設置顯示位置    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. /*****************顯示 一個 字符  **************/

  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 上半屏行坐標,表示的是多少列

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

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


  304. *******************************/
  305. /*******************************************************************/
  306.   /**************************************************************/
  307. //------------------清整個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)點   
  326. 輸入:X(0~127) Y(0~63)     
  327. 輸出:無  

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

  329. 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 下半屏行坐標,X地址 (水平地址 )     
  330. 0x80  (垂直地址)
  331. 0x81
  332. 0x82
  333. 0x83
  334. ........
  335. 0x9f    //列坐標,共32個,表示的是行數 ,分兩個半屏,每個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位,擴充指令,繪圖關
  342.      LCD12864_command(0x36);  //8位,擴充指令,繪圖開
  343.      i = X/16;  //計算出X字節地址(0X80-0X8F)
  344.      j = X%16;  //計算出該字節的具體位(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個 地址
  353.        i = i + 8;//X地址進入下半屏 (0X88-0X8F)
  354.     ok=1;
  355.      }
  356.       
  357.    if(ok)
  358.     {
  359.      //讀數據操作
  360.         LCD12864_command(0x80+Y);   //第一步:設置Y坐標,讀數據先寫地址,寫GDRAM時先寫垂直地址(0X80-0X9F)
  361.         LCD12864_command(0x80+i);  //第二步:設置X坐標   

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

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

  368.          if(j>=0 && j<=7)   //判斷是高字節
  369.           {  
  370.          LCD12864_data(temp1|(0x80>>j));  //第三步:寫高字節數據  
  371.          LCD12864_data(temp2);      //第四步:寫低字節數據     
  372.           }
  373.          else if(j>7 && j<=15)   //判斷是低字節
  374.            {   
  375.               j = j - 8;  
  376.             LCD12864_data(temp1);
  377.             LCD12864_data(temp2|(0x80>>j));  //改變字節里的位   
  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 ;     //大數存入X1
  394. X0 = Temp;   //小數存入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);//開擴充指令
  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坐標(Y的范圍: 0X80-0X9F )
  424. if( i == 0 ) //寫X坐標
  425. {
  426. LCD12864_command(0x80);//上半屏
  427. }
  428. else
  429. {
  430. LCD12864_command(0x88);//下半屏開始地址
  431. }

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

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


  440. //          初始化設置
  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. //顯示函數
  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;//個位

  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,"  轉速  ");break;
  469. case 0x05: LCD12864_string(2,5,"  頻率  ");break;
  470. case 0x06: LCD12864_string(2,5,"脈沖計數");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]);//小數點,前面測量計算時擴大了10倍,這里縮小回來
  481. LCD12864_data(num[a6]);

  482. }


  483. /*********************************
  484.                        主函數入口
  485. /********************************************/
  486. //主函數入口
  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();//判斷采樣數據保護
  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,"計數");
  531. LCD12864_string(1,2,"少占魚做");
  532. delays(1);
  533. /***************8888
  534.     P0=0x10;//怠速,準備打開K5繼電器,關閉其他輸出繼電器
  535.    SHUCHU=0;//打開輸出閘門
  536. SHUCHU=1;//關閉閘門
  537. outflag=0;//輸出標志位
  538. ******************/
  539.   AD=0.0;
  540. LCD12864_string(1,2,"燈光測試");

  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,"測繼電器");


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

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

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

  607. delays(3);
  608.   SHUCHU=1;//關閉閘門
  609. P0=0xa0;//準備合閘(交流,直流 內控制 )   
  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); //等待頻率測出
  629.   
  630.   keychuli(); //掃描并處理按鍵
  631. LCD12864_string(1,2,"測量電壓");
  632. delayms(500);
  633. voltage();  //采樣電壓

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

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

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

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

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

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

  663. INTO開啟,外部中斷0允許(EX0=1),   
  664.      定時器T2中斷允許 (ET2=1) ************/  
  665.    CONTRL=0;
  666.       FLAG=0;
  667.    EX0=0;
  668.       ET2=0;
  669.       //三個定時器方式設置
  670.       TMOD=0x9d; //T0T1方式控制   
  671.       T2MOD=0x00;
  672.       T2CON=0x00;//定時器2,16位定時方式,自動重裝。      
  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.       //中斷設置        5
  685.       EX0=1;//允許外部0輸入中斷(INT0引腳)
  686.       ET2=1; //開定時中斷2
  687.       IT0=1; //外部中斷0邊沿觸發,下降沿到來觸發
  688.       //優先級設置
  689.    PX0=1;
  690.       //預置T0,T1
  691.       TR1=1;//先允許T1定時,因T1的GATE=1,還要等外部INT1高電平才計數
  692.       TR0=1;//先允許T0計數 ,同T1一樣,等待INTO高電平     
  693.       TR2=1;//啟動T2定時,不用外部控制,直接啟動   
  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定時,因T1的GATE=1,還要等外部INT1高電平才計數
  711.   TR0=1;//先允許T0計數 ,同T1一樣,等待INTO高電平     
  712.   TR2=1;//啟動T2定時,不用外部控制,直接啟動     
  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.    //關于指示燈,交流是一組,直流是一組,其他狀態用液晶顯示
  737.     /***************************************/

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

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

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

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

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

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

  841. if(DAT[0]>110&&DAT[1]>110&&DAT[2]>110&&DAT[5]>390)//三相交流大于110 ,頻率大于390
  842.      {
  843.   P0=0xa0;//準備合閘(交流,直流 內控制 )   
  844.   SHUCHU=0;
  845.   SHUCHU=1;
  846.   outflag=1;//合閘后,輸出標志位置1
  847.      }
  848.      }
  849. /******************************/
  850. //循環鍵
  851. if(key2==1) //處理循環定點顯示標志位
  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. //復位鍵
  873.    if(key5==0)//復位
  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. /**********保護函數*****************/
  890. void baohu()
  891. {
  892. if(outflag==1)//前提是已經輸出
  893. {
  894. //立即保護值
  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)//立即斷閘保護
  896.   {

  897.   P0=0x00;//準備斷閘(交流,直流 內控制 )   
  898.   SHUCHU=0;
  899.   SHUCHU=1;
  900.   outflag=0;//斷閘后,輸出標志位清0
  901.   
  902.   if(DAT[0]>1800||DAT[1]>1800||DAT[2]>1800)
  903.   {
  904.   P0=0x80;//過壓
  905.   LED1=0;
  906.   LED1=1;
  907.   }
  908.    if(DAT[5]>4450)
  909.   {
  910.   P0=0x80;//過頻燈
  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.    }//立即保護結束

  927.   // 延時保護值     
  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;//過壓
  933.   LED1=0;
  934.   LED1=1;


  935.   }
  936.    if(DAT[5]>4300)
  937.   {
  938.   P0=0x80;//過頻
  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);//等待交流恢復
  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;//準備合閘(交流直流內控制 )   
  966.   SHUCHU=0;
  967.   SHUCHU=1;
  968.   outflag=1;//合閘后,輸出標志位置1     
  969.         }
  970. else
  971. {

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

  977.    }//交流和頻率保護結束
  978. //直流電壓延時保護
  979.    if(DAT[3]>320||DAT[3]<170)
  980.    {if(DAT[3]>320)
  981.   {
  982.   LCD12864_string(4,1,"直流過壓");
  983.   }
  984.   delays(4);//等待直流過壓恢復
  985.   voltage();
  986. if(DAT[3]>170&&DAT[3]<320)
  987. {
  988.   LCD12864_string(4,1,"直流正常");
  989. }
  990. else
  991. {P0=0x80;//關閉直流只開交流,因為前面已經檢測過交流了,這里就不管了,當他正常   
  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);//等待直流 欠壓恢復
  1002.    voltage();
  1003. if(DAT[3]>170&&DAT[3]<320)
  1004. {
  1005.   LCD12864_string(4,1,"直流正常");
  1006. }
  1007. else
  1008. {P0=0x80;//關閉直流只開交流,因為前面已經檢測過交流了,這里就不管了,當他正常   
  1009.   SHUCHU=0;
  1010.   SHUCHU=1;
  1011.   outflag=1;
  1012.   LCD12864_string(4,1,"直流故障");
  1013. }
  1014.    }//直流延時保護結束
  1015. }//總 保護結束
  1016. }//總函數結束
  1017. /*******************************/
  1018. //轉速計算  ,頻率計算
  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;//計數值
  1028. DAT[4]=cnt1/cnt2*1000000.200/124.00*600.00*10.0; //計算轉速,信號頻率就是單片機計數頻率的整數倍   ,這里這樣寫是怕cnt1 cnt2 超出范圍
  1029. //注意這里: cnt1 cnt2  的類型不能是 uint 否則第一步計算除法會得0 , 如果你要先乘1000000.0,也不行。因為超出了uint 范圍
  1030. DAT[5]=DAT[4]*16.00/60.000*10.0;//電壓頻率計算

  1031. }

  1032. /******************************/
  1033. //外部中斷0,調用轉速計算
  1034. void interint0()  interrupt 0 //using **
  1035.       //外部中斷0處理      
  1036. {
  1037. EA=0;
  1038. zhuansu();//調用轉速函數
  1039.   FLAG=1;
  1040. /***注意:因為TO T1是外部引腳控制的,所以,這時外部低電平,自動停止。不用軟件停止**/  
  1041. }     
  1042. void intertimer2()  interrupt 5 //using **
  1043.       //T2定時中斷處理      
  1044. {  
  1045.   TR2=0;
  1046.   CONTRL=0;//關閉閘門信號   
  1047. }     

  1048. /*******************************/
  1049. //AD轉換程序

  1050. /************************************************/
  1051. //常測數據函數
  1052. void voltage() //電壓測量
  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;//轉換成電壓值 ,分辨率是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;//轉換成電壓值 ,分辨率是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;//轉換成電壓值 ,分辨率是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個時鐘方式  方式1 。 LC1543 有四位精度 。  輸入 0.0024v 時,AD值為0000000001  
  1102. //0.0048時,還為1。  0.0072為 2    也就是0.0048 為一個 寬度  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循環快的多 。
  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 個CLOCK     
  1131.    // {
  1132.       CLK=1;CLK=0;   //這里不用循環,省時間
  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 轉換
  1142.       CS=0;                  
  1143.   for(k=0;k<10;k++)
  1144.      {
  1145.     SDATA=1;                 //非P0口作為數據總線使用時,讀入數據前要賦值1,特別
  1146.        CLK = 1;         //是既用于寫有用于讀的情況下.
  1147.        date_out<<=1;
  1148.        if(SDATA) date_out += 1;  //這樣寫法比下面的方法速度快(5us)
  1149.   // date_out=date_out|SDATA;//用時6US
  1150.        CLK = 0;
  1151.      }
  1152.      return(date_out);
  1153. }
復制代碼


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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

地板
ID:72128 發表于 2015-1-13 17:38 | 只看該作者
沒有原理圖啊
回復

使用道具 舉報

5#
ID:60306 發表于 2016-5-20 14:36 | 只看該作者
兄弟 你的電路挑出來了沒  你看看我這圖與你哪個有啥區別[

設計總圖.jpg (1.52 MB, 下載次數: 209)

測Voltage current

測Voltage current
回復

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表