本帖最后由 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,用單電池供電不行,用倆電池供電,也不行。! - /********多周期測(cè)頻法,精度與晶振和閘門時(shí)間有關(guān)。晶振越大,閘門時(shí)間越長(zhǎng),都可以提高精度。************************/
- #include <stc89c52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define LCD12864_IO P0
- #define CLERADISPLAY LCD12864_command(0x01);
- int a1=0,a2=0,a3=0,a4=0,a5=0,a6=0;//存儲(chǔ)電壓值的每一位,設(shè)計(jì)a4,a5是小數(shù)位.
- const uchar num[]="0123456789. ";
- //AD轉(zhuǎn)換控制腳
- sbit CLK = P1^0; //TLC1543 18P
- sbit ADDRESS = P1^1; //17P
- sbit SDATA = P1^2; //16P
- sbit CS = P1^3; //15P
- /********************************************************************/
- sbit LCD12864_RS=P2^5; // 12864-st7920 4P RS
- sbit LCD12864_RW=P2^6; //RW(5P)
- sbit LCD12864_EN=P2^7; //E(6P)
- /********************************************************************/
- void LCD12864_busy(void);
- void LCD12864_command(unsigned char command);
- void LCD12864_data(unsigned char dat);
- void LCD12864_address(unsigned char row,unsigned char line);
- void LCD12864_string(unsigned char row,unsigned char line,unsigned char *s);
- void LCD12864_picture(unsigned char *gImage);
- void LCD12864_init(void);
- void LCD12864_char (unsigned char row,unsigned char line,unsigned char a);
- unsigned char LCD12864_ReadData();
- void LCD12864_Drawpoint(uchar X,uchar Y);
- void LCD12864_LineX(unsigned char X0, unsigned char X1, unsigned char Y);
- void LCD12864_LineY( unsigned char X, unsigned char Y0, unsigned char Y1);
- void LCD12864_DrawPicture( unsigned char code *pic);
- void clrgdram();
- /********************************************************************/
- //
- double DAT[7]={1150.0, 1150.1, 1150.2, 285.0,15000.0, 4000.0,31000.0}; //都放大了10倍
- // U V W E N F CINT
- // 控制腳
- sbit CONTRL=P1^7; //測(cè)頻控制腳
- sbit SCANF =P2^0; //鍵盤掃描控制腳
- sbit LED2 =P2^1; //狀態(tài)顯示控制腳1
- sbit LED1 =P2^2; //狀態(tài)顯示控制腳2
- sbit SHUCHU=P2^3; //繼電器輸出控制腳
- //
- bit FLAG; //測(cè)頻標(biāo)志位
- bit xunhuanflag;//顯示方式標(biāo)志位
- bit outflag; //允許輸出標(biāo)志
- bit eding;//額定狀態(tài)標(biāo)志
- // 按鍵存儲(chǔ)
- bdata uchar key; //鍵值存儲(chǔ)
- sbit key0=key^0;//停機(jī)
- sbit key1=key^1;//啟動(dòng)按鈕
- sbit key2=key^2; //顯示方式(高循環(huán))
- sbit key3=key^3; //自檢
- sbit key4=key^4;//燈檢
- sbit key5=key^5;//復(fù)位
- sbit key6=key^6;//應(yīng)急 (高應(yīng)急)
- sbit key7=key^7;//油壓(高有油壓)
- uint t1h,t1l,t2h,t2l;//測(cè)頻變量
- double cnt1,cnt2;
- double AD; //定義為float 類型,可以防止下面做四則運(yùn)算時(shí)每一步的值超出 范圍
- unsigned long int X;
- /****************************************************************/
- uint rd1543(uchar address);//AD轉(zhuǎn)換程序
- void voltage(); //電壓檢測(cè)
- void init(); //初始化
- void zhuansu(); //計(jì)算轉(zhuǎn)速
- void reset();//測(cè)頻計(jì)數(shù)定時(shí)復(fù)位
- uchar scanf(); //鍵盤掃描
- void keychuli(); //按鍵處理程序
- void baohu();
- void display(unsigned long int sx,uchar j); //顯示函數(shù)
- void displayFX(unsigned long int sx);
- /*************************************************************/
- void delayus(uint);
- void delayms(uint);
- void delays(uint m); //延時(shí)秒
- unsigned char code Bmp019[]=
- {
- /*------------------------------------------------------------------------------
- ; 若數(shù)據(jù)亂碼,請(qǐng)檢查字模格式設(shè)置,注意選擇正確的取模方向和字節(jié)位順序。
- ; 源文件 / 文字 : C:\Documents and Settings\Administrator\桌面\888.bmp字模
- ; 寬×高(像素): 128×64
- ; 字模格式/大小 : 單色點(diǎn)陣液晶字模,橫向取模,字節(jié)正序/1024字節(jié)
- ; 數(shù)據(jù)轉(zhuǎn)換日期 : 2010-7-26 20:46:48
- ------------------------------------------------------------------------------*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x01,0xF8,0x00,0x00,0x00,0x3E,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
- 0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x00,0x08,0x00,0x00,0x00,0x08,0x08,0x00,0x00,
- 0x00,0x20,0x18,0x00,0x00,0x00,0x08,0x00,0x1F,0x80,0x00,0x00,0x08,0x1F,0x80,0x00,
- 0x00,0x3D,0xF8,0x00,0x08,0x00,0x08,0xE0,0x02,0x00,0x00,0x7F,0xFF,0x00,0x80,0x00,
- 0x00,0x38,0x38,0x00,0x18,0x00,0x00,0x30,0x02,0x00,0x00,0x80,0x00,0x00,0x80,0x00,
- 0x00,0x30,0x08,0x01,0xF0,0x00,0x20,0x30,0x0F,0xF8,0x00,0x80,0x0F,0xE0,0x80,0x00,
- 0x00,0x30,0x38,0x00,0xFC,0x30,0x20,0xE0,0x83,0x80,0x00,0x00,0x00,0x20,0x00,0x00,
- 0x00,0x3F,0xF8,0x00,0x0C,0x30,0x01,0xE0,0x00,0xF0,0x00,0x02,0x00,0x20,0x00,0x00,
- 0x00,0x30,0x18,0x66,0xBF,0xF0,0x00,0xE0,0x0F,0xE0,0x00,0x07,0xFF,0xC0,0x00,0x00,
- 0x00,0x30,0x18,0x3F,0xFF,0xF0,0x00,0xC0,0x38,0x20,0x00,0x00,0x22,0x00,0x00,0x00,
- 0x00,0x20,0x00,0x00,0x00,0x30,0x00,0x80,0x00,0x00,0x00,0x00,0x83,0x00,0xFC,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFF,0xFF,0xF0,0x00,0x7F,0xFF,0xFC,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFF,0xFF,0xC3,0xF0,0x00,0x03,0xE0,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFF,0xFF,0x8C,0x00,0x00,0x00,0x03,0xFF,0x0F,0xFF,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFF,0xFE,0x00,0x03,0xFF,0xE0,0x0F,0xFF,0x87,0xFF,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFF,0xFE,0x00,0xFF,0xFF,0xFE,0x1F,0xFF,0xC3,0xFF,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0x1F,0xFF,0xC3,0xFF,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFF,0x1F,0xFF,0xC3,0xFF,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x87,0xFF,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFF,0xC1,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x81,0xFF,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFF,0x83,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x7F,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x3F,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFC,0x00,0x03,0xFF,0xFF,0xFD,0x80,0x0F,0xF8,0x1F,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xF8,0x00,0x03,0xFF,0xFF,0xF8,0xFF,0x87,0xFC,0x0F,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xF8,0x03,0xFF,0xFF,0xFF,0xFF,0x00,0x1F,0xFE,0x0F,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xF8,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xF8,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xF8,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xF8,0x7F,0xF0,0x0F,0xFF,0xFF,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xF8,0x3F,0xF0,0x1F,0xFF,0xFF,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xF8,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFF,0x87,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFF,0xC1,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x83,0xC0,0xFF,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x07,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xC3,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xFF,0xF0,0x3F,0xFF,0xE1,0xFF,0xFF,0xC0,
- 0x03,0xFF,0xFF,0xFE,0x00,0x1F,0xFF,0xFF,0xFF,0xC3,0xFF,0xFF,0xE1,0xFF,0xFF,0xC0,
- 0x03,0x01,0xFF,0xF0,0x7F,0x03,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x03,0xFF,0xFF,0xC0,
- 0x00,0x00,0x00,0x03,0xFD,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x3F,0xFF,0xFF,0xFF,0xC0,
- 0x00,0x3F,0x00,0x3F,0x80,0xFF,0xFF,0xFF,0xFF,0x10,0x1F,0xFF,0xFF,0xFF,0xFF,0xC0,
- 0x02,0x1F,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xFE,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,
- 0x03,0x81,0xF8,0x00,0x03,0xFF,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- };
- //
- void delayms(uint k)
- {
- uint data i,j;
- for(i=0;i<k;i++)
- {
- for(j=0;j<121;j++)
- {;}
- }
- }
- //
- void delayus(uint x)
- {
- while(--x);
- }
- /***********************/
- void delays(uint m)
- {
- uint i,j;
- for(i=0;i<m;i++)
- {
- for(i=0;i<1000;i++)
- {
- for(j=0;j<121;j++)
- {;}
- }
- }
- }
-
- void Mcu_init(void)
- {
-
- LCD12864_init();
-
-
- CLERADISPLAY
- CLERADISPLAY
- LCD12864_init();
- }
- /*******************************************************************/
- void LCD12864_busy(void)
- {
- bit BF = 0;
- LCD12864_EN=0;
- LCD12864_RS=0;
- LCD12864_RW=1;
- LCD12864_IO=0xff; //單片機(jī)讀數(shù)據(jù)之前必須先置高位
- do
- {
- LCD12864_EN=1;
- BF=LCD12864_IO&0x80;
- LCD12864_EN=0;
- } while(BF);
-
- }
- /*******************************************************************/
- // 寫入命令
- /*******************************************************************/
- void LCD12864_command(unsigned char command)
- {
- LCD12864_busy();
- LCD12864_EN=0;
- LCD12864_RS=0;
- LCD12864_RW=0;
- LCD12864_IO=0xff;
- LCD12864_EN=1;
- LCD12864_IO=command;
- LCD12864_EN=0;
- }
- //讀數(shù)據(jù)函數(shù)
- unsigned char LCD12864_ReadData()
- {
- unsigned char read_data;
- LCD12864_busy();
- LCD12864_IO=0xff;
- LCD12864_RS=1;
- LCD12864_RW=1;
- LCD12864_EN=0;
- LCD12864_EN=1;
- read_data=LCD12864_IO;
- LCD12864_EN=0;
-
- return(read_data);
- }
- /*******************************************************************/
- // 寫入一字節(jié)數(shù)據(jù)
- /*******************************************************************/
- void LCD12864_data(unsigned char dat)
- {
-
- LCD12864_busy();
- LCD12864_EN=0;
- LCD12864_RS=1;
- LCD12864_RW=0;
- LCD12864_IO=0xff;
- LCD12864_EN=1;
- LCD12864_IO=dat;
- LCD12864_EN=0;
- }
- /*******************************************************************/
- // 設(shè)置顯示位置 row(1~4),line(1~8)
- /*******************************************************************/
- void LCD12864_address(unsigned char row,unsigned char line)
- {
- switch(row)
- {
- case 1:LCD12864_command(0x7f + line);
- break;
- case 2:LCD12864_command(0x8f + line);
- break;
- case 3:LCD12864_command(0x87 + line);
- break;
- case 4:LCD12864_command(0x97 + line);
- default:
- break;
- }
- }
- /*****************顯示 一個(gè) 字符 **************/
- void LCD12864_char (unsigned char row,unsigned char line,unsigned char a)
- {
-
- LCD12864_address(row,line);
- LCD12864_data(a);
- }
- /*******************************************************************/
- // 在指定位置顯示字符串
- /*******************************************************************/
- void LCD12864_string(unsigned char row,unsigned char line,unsigned char *s)
- {
- unsigned char LCD12864_temp;
- LCD12864_address(row,line);
- LCD12864_temp=*s;
- while(LCD12864_temp != 0x00)
- {
- LCD12864_data(LCD12864_temp);
- LCD12864_temp=*(++s);
- }
- }
- /****************************
- 0x80 0x81 0x82 0x83 0x84 0x85 0x86 0x87 上半屏行坐標(biāo),表示的是多少列
- 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 下半屏行坐標(biāo),每組8列,每列16位,共128位,
- 0x80
- 0x81
- 0x82
- 0x83
- ........
- 0x9f //列坐標(biāo),共32個(gè),表示的是行數(shù) ,分兩個(gè)半屏,每個(gè)32行,共64行
- //Y坐標(biāo) 只是用來(lái)確定具體坐標(biāo),在哪一行
- 功能:圖形模式下,顯示(X,Y)點(diǎn)
- 輸入:X(0~127) Y(0~63) 相對(duì)屏幕坐標(biāo)
- 輸出:無(wú)
- 點(diǎn)亮某一點(diǎn)的操作步驟: 1.求出水平坐標(biāo)X對(duì)應(yīng)的地址和是哪一位 0x80-----0x8f (范圍0-15) X/16求地址 X%16求該地址哪一位
- 2.求垂直坐標(biāo)Y對(duì)應(yīng)的地址和上下半屏 0x80------0x9f(范圍0-63) Y本身就是8位地址,Y=63-Y ,Y--(0-31)
- 3.寫入行列地址(Y是行X是列),0x80+Y ,0X80+X/16
- 4.讀要顯示的數(shù)據(jù) DAT
- 5.區(qū)分上下半屏(X%16<=7&&X%16>=0是上半屏)寫入數(shù)據(jù)每一位 DAT|0x80 ;DAT<<1
- 注意:這個(gè)函數(shù)顯示某一點(diǎn)時(shí),可能會(huì)把上次顯示的處于同一地址的其他位的點(diǎn)擦掉,所以先保存所有數(shù)據(jù),最后顯示,就連貫起來(lái)了
- *******************************/
- /*******************************************************************/
- /**************************************************************/
- //------------------清整個(gè)GDRAM空間----------------------------
- /**************************************************************/
- void clrgdram()
- {
- unsigned char x,y ;
- for(y=0;y<64;y++)
- for(x=0;x<16;x++)
- {
- LCD12864_command(0x34);
- LCD12864_command(y+0x80);
- LCD12864_command(x+0x80);
- LCD12864_command(0x30);
- LCD12864_data(0x00);
- LCD12864_data(0x00);
- }
- }
- /******************************************/
- /*******8==========================================================================
- 功能:圖形模式下,顯示(X,Y)點(diǎn)
- 輸入:X(0~127) Y(0~63)
- 輸出:無(wú)
- 0x80 0x81 0x82 0x83 0x84 0x85 0x86 0x87 上半屏行坐標(biāo),表示的是多少列,X地址
- 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 下半屏行坐標(biāo),X地址 (水平地址 )
- 0x80 (垂直地址)
- 0x81
- 0x82
- 0x83
- ........
- 0x9f //列坐標(biāo),共32個(gè),表示的是行數(shù) ,分兩個(gè)半屏,每個(gè)32行,共64行
- ====================================================================**********/
- void LCD12864_Drawpoint(uchar X,uchar Y)
- {
- uchar i= 0, j = 0,ok=0;
- uchar temp1 = 0x00,temp2 = 0x00;
- LCD12864_command(0x34); //8位,擴(kuò)充指令,繪圖關(guān)
- LCD12864_command(0x36); //8位,擴(kuò)充指令,繪圖開
- i = X/16; //計(jì)算出X字節(jié)地址(0X80-0X8F)
- j = X%16; //計(jì)算出該字節(jié)的具體位(0-15)
- //Y = 63 - Y;
- if(Y>=0 && Y<=31)//判斷上下半屏
- {
- ok=1;
- }
- else if(Y>=32 && Y<=63)//下半屏
- {
- Y = Y - 32;//Y只有0-31共32個(gè) 地址
- i = i + 8;//X地址進(jìn)入下半屏 (0X88-0X8F)
- ok=1;
- }
-
- if(ok)
- {
- //讀數(shù)據(jù)操作
- LCD12864_command(0x80+Y); //第一步:設(shè)置Y坐標(biāo),讀數(shù)據(jù)先寫地址,寫GDRAM時(shí)先寫垂直地址(0X80-0X9F)
- LCD12864_command(0x80+i); //第二步:設(shè)置X坐標(biāo)
- LCD12864_ReadData(); //第三步:空讀取一次
- temp1 =LCD12864_ReadData(); //第四步:讀取高字節(jié),先讀高字節(jié)
- temp2 =LCD12864_ReadData(); //第五步:讀取低字節(jié)
- //圖形模式下的寫數(shù)據(jù)操作
- LCD12864_command(0x80+Y); //第一步:設(shè)置Y坐標(biāo)
- LCD12864_command(0x80+i); //第二步:設(shè)置X坐標(biāo)
- if(j>=0 && j<=7) //判斷是高字節(jié)
- {
- LCD12864_data(temp1|(0x80>>j)); //第三步:寫高字節(jié)數(shù)據(jù)
- LCD12864_data(temp2); //第四步:寫低字節(jié)數(shù)據(jù)
- }
- else if(j>7 && j<=15) //判斷是低字節(jié)
- {
- j = j - 8;
- LCD12864_data(temp1);
- LCD12864_data(temp2|(0x80>>j)); //改變字節(jié)里的位
- }
- }
-
-
- }
- /******************************************/
- //畫線
- /********************************************/
- //畫水平線
- void LCD12864_LineX(unsigned char X0, unsigned char X1, unsigned char Y)
- {
- unsigned char Temp ;
- if( X0 > X1 )
- {
- Temp = X1 ; //交換X0 X1值
- X1 = X0 ; //大數(shù)存入X1
- X0 = Temp; //小數(shù)存入X0
- }
- for( ; X0 <= X1 ; X0++ )
- LCD12864_Drawpoint(X0,Y);
- }
- //畫垂直線
- void LCD12864_LineY( unsigned char X, unsigned char Y0, unsigned char Y1)
- {
- unsigned char Temp ;
- if( Y0 > Y1 )//交換大小值
- {
- Temp = Y1 ;
- Y1 = Y0 ;
- Y0 = Temp ;
- }
- for(; Y0 <= Y1 ; Y0++)
- LCD12864_Drawpoint( X, Y0) ;
- }
- /******************************************/
- /**************畫圖************************/
- void LCD12864_DrawPicture( unsigned char code *pic)
- {
- unsigned char i, j, k ;
- LCD12864_command(0x34);//開擴(kuò)充指令
- LCD12864_command(0x36);//開繪圖功能
- for( i = 0 ; i < 2 ; i++ )//分上下兩屏寫
- {
- for( j = 0 ; j < 32 ; j++)//垂直地址遞加 ,行掃方式
- {
- LCD12864_command( 0x80 + j ) ;//寫Y坐標(biāo)(Y的范圍: 0X80-0X9F )
- if( i == 0 ) //寫X坐標(biāo)
- {
- LCD12864_command(0x80);//上半屏
- }
- else
- {
- LCD12864_command(0x88);//下半屏開始地址
- }
- for( k = 0 ; k < 16 ; k++ ) //寫一整行數(shù)據(jù)
- {
- LCD12864_data( *pic++ );//前面只寫入首地址,后面依次寫入數(shù)據(jù),地址會(huì)自動(dòng)遞增
- }
- }
- }
- LCD12864_command( 0x30);//恢復(fù)到一般模式
- }
- // 初始化設(shè)置
- /*******************************************************************/
- void LCD12864_init(void)
- {
- CLERADISPLAY // clear DDRAM
- LCD12864_command(0x30); // 8 bits unsigned interface,basic instrument
- LCD12864_command(0x02); // cursor return
- LCD12864_command(0x0c); // display,cursor on
- LCD12864_command(0x03);
- LCD12864_command(0x06);
- CLERADISPLAY // clear DDRAM
- }
- //
- //顯示函數(shù)
- void display(unsigned long int sx,uchar j)
- {
- a1=sx/100000;
- a2=sx%100000/10000;
- a3=sx%10000/1000;//千位
- a4=sx%1000/100;//百位
- a5=sx%100/10;//十位
- a6=sx%10;//個(gè)位
-
- switch(j)
- {
- case 0x00: LCD12864_string(2,5," Ua ");break;
- case 0x01: LCD12864_string(2,5," Ub ");break;
- case 0x02: LCD12864_string(2,5," Uc ");break;
- case 0x03: LCD12864_string(2,5," E ");break;
- case 0x04: LCD12864_string(2,5," 轉(zhuǎn)速 ");break;
- case 0x05: LCD12864_string(2,5," 頻率 ");break;
- case 0x06: LCD12864_string(2,5,"脈沖計(jì)數(shù)");break;
- case 0x07: LCD12864_string(2,5," ");break;
- default :break;
- }
- LCD12864_command(0x90); //指定顯示位置
- LCD12864_data(num[a1]); //從最高位開始顯示
- LCD12864_data(num[a2]);
- LCD12864_data(num[a3]);
- LCD12864_data(num[a4]);
- LCD12864_data(num[a5]);
- LCD12864_data(num[10]);//小數(shù)點(diǎn),前面測(cè)量計(jì)算時(shí)擴(kuò)大了10倍,這里縮小回來(lái)
- LCD12864_data(num[a6]);
- }
- /*********************************
- 主函數(shù)入口
- /********************************************/
- //主函數(shù)入口
- //
- main()
- {
-
- uchar ii=0;
- CONTRL=0;
- FLAG=0;
- P0=0x00;
- LED1=0;
- LED1=1;
- P0=0x00;
- LED2=0;
- LED2=1;
- P0=0x00;
- SHUCHU=0;//打開閘門
- SHUCHU=1;
- baohu();//判斷采樣數(shù)據(jù)保護(hù)
- Mcu_init();
- CLERADISPLAY
- delays(1);
- display(100000,7);
- LCD12864_char(1,2,'A');
- LCD12864_string(1,2,"shaozhanyu");
- delays(2);
- clrgdram();
- CLERADISPLAY
- delays(1);
- clrgdram();
- delays(1);
- LCD12864_LineX(8,113,25);
- clrgdram();
- CLERADISPLAY
- delays(2);
- clrgdram();
- LCD12864_LineY(55,29,57);
- delays(2);
- clrgdram();
- delays(1);
- LCD12864_DrawPicture(Bmp019);
- delays(3);
- Mcu_init();
- CLERADISPLAY
- LCD12864_string(3,1,"U V W E SP F CT");
- LCD12864_char(2,1,'D');
- LCD12864_string(4,1,"計(jì)數(shù)");
- LCD12864_string(1,2,"少占魚做");
- delays(1);
- /***************8888
- P0=0x10;//怠速,準(zhǔn)備打開K5繼電器,關(guān)閉其他輸出繼電器
- SHUCHU=0;//打開輸出閘門
- SHUCHU=1;//關(guān)閉閘門
- outflag=0;//輸出標(biāo)志位
- ******************/
- AD=0.0;
- LCD12864_string(1,2,"燈光測(cè)試");
- P0=0x41;
- LED1=0;
- LED1=1;
- delayms(1000);
- P0=0x42;
- LED1=0;
- LED1=1;
- delayms(1000);
- P0=0x44;
- LED1=0;
- LED1=1;
- delayms(1000);
- P0=0x48;
- LED1=0;
- LED1=1;
- delayms(1000);
- P0=0x50;
- LED1=0;
- LED1=1;
- delayms(1000);
- P0=0x60;
- LED1=0;
- LED1=1;
- delayms(1000);
- P0=0x41;
- LED2=0;
- LED2=1;
- delayms(1000);
- P0=0x42;
- LED2=0;
- LED2=1;
- delayms(1000);
- P0=0x44;
- LED2=0;
- LED2=1;
- delayms(1000);
- P0=0x48;
- LED2=0;
- LED2=1;
- delayms(1000);
- P0=0x50;
- LED2=0;
- LED2=1;
- delayms(1000);
- P0=0x60;
- LED2=0;
- LED2=1;
- delayms(1000);
- P0=0x00;
- LED1=0;
- LED1=1;
- P0=0x00;
- LED2=0;
- LED2=1;
- delayms(500);
- LCD12864_string(1,2,"測(cè)繼電器");
- P0=0x04;//啟動(dòng)
- SHUCHU=0;//打開閘門
- delays(3);
- SHUCHU=1;
- P0=0x18;//停機(jī)
- SHUCHU=0;//打開閘門
- delays(3);
- SHUCHU=1;
- P0=0x40;//怠速,準(zhǔn)備打開K5繼電器,關(guān)閉其他輸出繼電器
- SHUCHU=0;//打開輸出閘門
- delays(3);
- SHUCHU=1;//關(guān)閉閘門
- P0=0xa0;//準(zhǔn)備合閘(交流,直流 內(nèi)控制 )
- SHUCHU=0;
- delays(3);
- SHUCHU=1;
- P0=0x00;
- SHUCHU=0;//打開閘門
- SHUCHU=1;
- keychuli(); //掃描并處理按鍵
- delayms(600);
- voltage();
- LCD12864_string(3,1,"U V W E SP F ");
- LCD12864_char(2,1,'D');
- LCD12864_string(1,2,"少氏出品");
- delays(11);
- ///初始化
- LCD12864_string(4,1,"直流正常");
- init();
- while(1)
- {
- while(!FLAG); //等待頻率測(cè)出
-
- keychuli(); //掃描并處理按鍵
- LCD12864_string(1,2,"測(cè)量電壓");
- delayms(500);
- voltage(); //采樣電壓
- LCD12864_string(1,2,"轉(zhuǎn)換完成");
- delayms(600);
- baohu();//判斷采樣數(shù)據(jù)保護(hù)
-
- for(;ii<6;)
- {
- if(xunhuanflag==0) //定點(diǎn)
- {display(DAT[ii],ii);
- LCD12864_string(1,2,"定點(diǎn)顯示");
- break;
- }
- display(DAT[ii],ii);
- LCD12864_string(1,2,"循環(huán)顯示");
-
- delayms(2200);
- keychuli();
- ii++;
- }//循環(huán) 顯示結(jié)束
- if(ii==6)
- ii=0;
- LCD12864_string(1,2,"下輪復(fù)位");
- delayms(700);
- init();
-
- }
- }
- /*************************************/
- //初始化函數(shù)
- void init()
- {
- /******T1定時(shí)器模式,外部INT1控制開啟,T0計(jì)數(shù)器不允許中斷,外部控制
- INTO開啟,外部中斷0允許(EX0=1),
- 定時(shí)器T2中斷允許 (ET2=1) ************/
- CONTRL=0;
- FLAG=0;
- EX0=0;
- ET2=0;
- //三個(gè)定時(shí)器方式設(shè)置
- TMOD=0x9d; //T0T1方式控制
- T2MOD=0x00;
- T2CON=0x00;//定時(shí)器2,16位定時(shí)方式,自動(dòng)重裝。
-
- TH0= 0x00; // T0高8位
- TL0= 0x00; // T0低8位
-
- TH1= 0x00; // T1高8位
- TL1= 0x00; // T1低8位
- EXEN2=0;
- TH2=256/256;
- TL2=256%256;
- RCAP2H=256/256;
- RCAP2L=256%256;
- //中斷設(shè)置 5
- EX0=1;//允許外部0輸入中斷(INT0引腳)
- ET2=1; //開定時(shí)中斷2
- IT0=1; //外部中斷0邊沿觸發(fā),下降沿到來(lái)觸發(fā)
- //優(yōu)先級(jí)設(shè)置
- PX0=1;
- //預(yù)置T0,T1
- TR1=1;//先允許T1定時(shí),因T1的GATE=1,還要等外部INT1高電平才計(jì)數(shù)
- TR0=1;//先允許T0計(jì)數(shù) ,同T1一樣,等待INTO高電平
- TR2=1;//啟動(dòng)T2定時(shí),不用外部控制,直接啟動(dòng)
- EA=1; //開全局中斷
- CONTRL=1;
-
- //初始化完成......
- }
- /**********************************
- void reset()
- {
- CONTRL=0;
- FLAG=0;
- TL0=0x00;
- TH0=0x00;
- TL1=0x00;
- TH1=0x00;
- TF2=0;
- TH2=256/256;
- TL2=256%256;
- TR1=1;//先允許T1定時(shí),因T1的GATE=1,還要等外部INT1高電平才計(jì)數(shù)
- TR0=1;//先允許T0計(jì)數(shù) ,同T1一樣,等待INTO高電平
- TR2=1;//啟動(dòng)T2定時(shí),不用外部控制,直接啟動(dòng)
- EA=1; //開全局中斷
- CONTRL=1;
-
- }
- *******************************/
- //鍵盤掃描
- uchar scanf()
- {
- uchar value;
- P0=0xff;
- delayms(1);
- SCANF=0;//打開鍵掃閘門
- value=P0;
- delayms(2);
- value=P0;
- SCANF=1;
- return value;
- }
- /********************************/
- //鍵處理
- void keychuli()
- {
- uchar k;
- //關(guān)于指示燈,交流是一組,直流是一組,其他狀態(tài)用液晶顯示
- /***************************************/
- /******************/
- key=scanf();
- /******************/
- //啟動(dòng)鍵判斷
- if(key1==0&&key7==0&&DAT[4]==0)//啟動(dòng)位 ,油壓和轉(zhuǎn)速為0
- {
- for(k=0;k<3;k++)//三次啟動(dòng)循環(huán)
- {
- P0=0x04;//準(zhǔn)備 輸出K6繼電器
- SHUCHU=0;//打開閘門
- delays(3);//隔三秒響應(yīng)一次停機(jī)鍵
- //響應(yīng)停機(jī)鍵
- key=scanf();
- if(key0==0&&key7==1&&DAT[4]>500)//停機(jī)開關(guān)狀態(tài),油壓高,轉(zhuǎn)速達(dá)到500,其他繼電器都停止工作 ,所以 ,P0=0x08
- {
- P0=0x18;//準(zhǔn)備輸出K0,K9繼電器
- SHUCHU=0;//打開輸出閘門
- SHUCHU=1;//關(guān)閉閘門
- outflag=0;//輸出標(biāo)志位
- }
- if(key1==0&&key7==1&&DAT[4]>430) //每啟動(dòng)一次都判斷是否成功,成功直接跳出
- break ; //判斷啟動(dòng)成功,立即跳出啟動(dòng)for 循環(huán)
- delays(3);//沒(méi)有啟動(dòng)成功,繼續(xù)啟動(dòng)3秒
- key=scanf();
- if(key1==0&&key0==0&&key7==1&&DAT[4]>500)//停機(jī),油壓高,轉(zhuǎn)速達(dá)到500,其他繼電器都停止工作 ,所以 ,P0=0x08
- {
- P0=0x18;//準(zhǔn)備輸出K0,K9繼電器
- SHUCHU=0;//打開輸出閘門
- SHUCHU=1;//關(guān)閉閘門
- outflag=0;//輸出標(biāo)志位
- }
- if(key1==0&&key7==1&&DAT[4]>430) //每啟動(dòng)一次都判斷是否成功,成功直接跳出
- break ;
- delays(3);
- key=scanf();
- if(key0==0&&key7==1&&DAT[4]>500)//停機(jī),油壓高,轉(zhuǎn)速達(dá)到500,其他繼電器都停止工作 ,所以 ,P0=0x08
- {
- P0=0x18;//準(zhǔn)備輸出K0,K9繼電器
- SHUCHU=0;//打開輸出閘門
- SHUCHU=1;//關(guān)閉閘門
- outflag=0;//輸出標(biāo)志位
- }
- if(key1==0&&key7==1&&DAT[4]>430) //每啟動(dòng)一次都判斷是否成功,成功直接跳出
- break ;
-
- P0=0x18;//停止
- SHUCHU=0;
- SHUCHU=1;
- delays(9);
- }//for啟動(dòng)循環(huán)結(jié)束
- SHUCHU=1;//關(guān)閉閘門
-
- /**********************/
- //啟動(dòng)失敗判斷
- if(key7==0) //油壓低
- if(DAT[4]<440)
- {
- P0=0x01;//點(diǎn)亮啟動(dòng)失敗燈
- LED1=0;//開啟573輸入
- LED1=1;//關(guān)閉使能,74HC573鎖定狀態(tài)
- outflag=0;//輸出標(biāo)志位清0,表示輸出未允許
- }
- }
- //停機(jī)鍵判斷
- /********************/
- if(key0==0&&key7==1&&DAT[4]>500)//停機(jī),油壓高,轉(zhuǎn)速達(dá)到500,其他繼電器都停止工作 ,所以 ,P0=0x08
- {
- P0=0x00;//準(zhǔn)備交直流斷閘(交流,直流 內(nèi)控制 )
- SHUCHU=0;
- SHUCHU=1;
- delayms(3);
- P0=0x40;//怠速,準(zhǔn)備打開K5繼電器,關(guān)閉其他輸出繼電器
- SHUCHU=0;//打開輸出閘門
- SHUCHU=1;//關(guān)閉閘門
- outflag=0;
- delays(29);
- P0=0x18;//準(zhǔn)備 輸出K0和K9停油繼電器
- SHUCHU=0;//打開輸出閘門
- SHUCHU=1;//關(guān)閉閘門
- outflag=0;//輸出標(biāo)志位
- }
- /*****************/
- //應(yīng)急鍵判斷
- if(key6==1)//應(yīng)急/正常,高電位應(yīng)急
- {
- eding=1;//應(yīng)急標(biāo)志
- }
- else if(key6==0) //進(jìn)入怠速
- {
- eding=0;//怠速標(biāo)志
- }
- if(eding==0)//對(duì)怠速的處理
- {
- P0=0x40;//怠速,準(zhǔn)備打開K5繼電器,關(guān)閉其他輸出繼電器
- SHUCHU=0;//
- SHUCHU=1;//關(guān)閉閘門
- outflag=0;
- }
- if(eding==1&&outflag==0)//對(duì)額定的處理
- {
- P0=0x00;//額定,準(zhǔn)備關(guān)閉K5繼電器,進(jìn)入額定,其他繼電器都停止工作 ,所以 ,P0=0x00
- SHUCHU=0;//打開輸出閘門
- SHUCHU=1;//關(guān)閉閘門
- delayms(2);
- if(DAT[0]>110&&DAT[1]>110&&DAT[2]>110&&DAT[5]>390)//三相交流大于110 ,頻率大于390
- {
- P0=0xa0;//準(zhǔn)備合閘(交流,直流 內(nèi)控制 )
- SHUCHU=0;
- SHUCHU=1;
- outflag=1;//合閘后,輸出標(biāo)志位置1
- }
- }
- /******************************/
- //循環(huán)鍵
- if(key2==1) //處理循環(huán)定點(diǎn)顯示標(biāo)志位
- xunhuanflag=1;
- else if(key2==0)
- xunhuanflag=0;
- /*********************/
- //燈光檢查鍵
- if(key4==0)//燈光檢查
- {
- LED1=1;
- LED2=1;
- P0=0x7f;
- LED1=0;
- delayus(10);
- LED1=1;
- delayms(1000);
- P0=0x7f;
- LED2=0;
- delayus(10);
- LED2=1;
- }
- /************************/
- //復(fù)位鍵
- if(key5==0)//復(fù)位
- {
- P0=0x00;
- LED1=0;
- delayus(10);
- LED1=1;
- P0=0x00;
- LED2=0;
- delayus(10);
- LED2=1;
- }
- /****************/
- //自檢鍵
- if(key3==0) //自檢
- { }
-
- }
- /**********保護(hù)函數(shù)*****************/
- void baohu()
- {
- if(outflag==1)//前提是已經(jīng)輸出
- {
- //立即保護(hù)值
- 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ù)
- {
-
- P0=0x00;//準(zhǔn)備斷閘(交流,直流 內(nèi)控制 )
- SHUCHU=0;
- SHUCHU=1;
- outflag=0;//斷閘后,輸出標(biāo)志位清0
-
- if(DAT[0]>1800||DAT[1]>1800||DAT[2]>1800)
- {
- P0=0x80;//過(guò)壓
- LED1=0;
- LED1=1;
- }
- if(DAT[5]>4450)
- {
- P0=0x80;//過(guò)頻燈
- LED2=0;
- LED2=1;
- }
- if(DAT[0]<800||DAT[1]<800||DAT[2]<800)
- {
- P0=0x40;//欠壓
- LED1=0;
- LED1=1;
- }
- if(DAT[5]<3200)
- {
- P0=0x40;//欠頻燈
- LED2=0;
- LED2=1;
- }
- }//立即保護(hù)結(jié)束
- // 延時(shí)保護(hù)值
- 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)
- {
-
- if(DAT[0]>1270||DAT[1]>1270||DAT[2]>1270)
- {
- P0=0x80;//過(guò)壓
- LED1=0;
- LED1=1;
- }
- if(DAT[5]>4300)
- {
- P0=0x80;//過(guò)頻
- LED2=0;
- LED2=1;
- }
- if(DAT[0]<1000||DAT[1]<1000||DAT[2]<1000)
- {
-
- P0=0x40;//欠壓
- LED1=0;
- LED1=1;
- }
- if(DAT[5]<3700)
- {
-
- P0=0x40;//欠頻
- LED2=0;
- LED2=1;
- }
- delays(4);//等待交流恢復(fù)
- voltage();
- if(DAT[0]>1100&&DAT[1]>1100&&DAT[2]>1100&&DAT[5]>3900)//三相交流大于110 ,頻率大于390
- {
- P0=0x00;
- LED1=0;
- LED1=1;
- P0=0x00;
- LED2=0;
- LED2=1;
- P0=0xa0;//準(zhǔn)備合閘(交流直流內(nèi)控制 )
- SHUCHU=0;
- SHUCHU=1;
- outflag=1;//合閘后,輸出標(biāo)志位置1
- }
- else
- {
-
- P0=0x00;//準(zhǔn)備斷閘(交流,直流 內(nèi)控制 )
- SHUCHU=0;
- SHUCHU=1;
- outflag=0;
- }
- }//交流和頻率保護(hù)結(jié)束
- //直流電壓延時(shí)保護(hù)
- if(DAT[3]>320||DAT[3]<170)
- {if(DAT[3]>320)
- {
- LCD12864_string(4,1,"直流過(guò)壓");
- }
- delays(4);//等待直流過(guò)壓恢復(fù)
- voltage();
- if(DAT[3]>170&&DAT[3]<320)
- {
- LCD12864_string(4,1,"直流正常");
- }
- else
- {P0=0x80;//關(guān)閉直流只開交流,因?yàn)榍懊嬉呀?jīng)檢測(cè)過(guò)交流了,這里就不管了,當(dāng)他正常
- SHUCHU=0;
- SHUCHU=1;
- outflag=1;
- LCD12864_string(4,1,"直流故障");
- }
- if(DAT[3]<170)
- {
- LCD12864_string(4,1,"直流欠壓");
- }
- delays(2);//等待直流 欠壓恢復(fù)
- voltage();
- if(DAT[3]>170&&DAT[3]<320)
- {
- LCD12864_string(4,1,"直流正常");
- }
- else
- {P0=0x80;//關(guān)閉直流只開交流,因?yàn)榍懊嬉呀?jīng)檢測(cè)過(guò)交流了,這里就不管了,當(dāng)他正常
- SHUCHU=0;
- SHUCHU=1;
- outflag=1;
- LCD12864_string(4,1,"直流故障");
- }
- }//直流延時(shí)保護(hù)結(jié)束
- }//總 保護(hù)結(jié)束
- }//總函數(shù)結(jié)束
- /*******************************/
- //轉(zhuǎn)速計(jì)算 ,頻率計(jì)算
- void zhuansu()
- {
- t1h=TH0;
- t1l=TL0;
- t2h=TH1;
- t2l=TL1;
- cnt1=t1l+(t1h<<8);
- cnt2=t2l+(t2h<<8);
- DAT[6]=cnt1/cnt2*1000000.20*10.00;//計(jì)數(shù)值
- DAT[4]=cnt1/cnt2*1000000.200/124.00*600.00*10.0; //計(jì)算轉(zhuǎn)速,信號(hào)頻率就是單片機(jī)計(jì)數(shù)頻率的整數(shù)倍 ,這里這樣寫是怕cnt1 cnt2 超出范圍
- //注意這里: cnt1 cnt2 的類型不能是 uint 否則第一步計(jì)算除法會(huì)得0 , 如果你要先乘1000000.0,也不行。因?yàn)槌隽藆int 范圍
- DAT[5]=DAT[4]*16.00/60.000*10.0;//電壓頻率計(jì)算
- }
- /******************************/
- //外部中斷0,調(diào)用轉(zhuǎn)速計(jì)算
- void interint0() interrupt 0 //using **
- //外部中斷0處理
- {
- EA=0;
- zhuansu();//調(diào)用轉(zhuǎn)速函數(shù)
- FLAG=1;
- /***注意:因?yàn)門O T1是外部引腳控制的,所以,這時(shí)外部低電平,自動(dòng)停止。不用軟件停止**/
- }
- void intertimer2() interrupt 5 //using **
- //T2定時(shí)中斷處理
- {
- TR2=0;
- CONTRL=0;//關(guān)閉閘門信號(hào)
- }
- /*******************************/
- //AD轉(zhuǎn)換程序
- /************************************************/
- //常測(cè)數(shù)據(jù)函數(shù)
- void voltage() //電壓測(cè)量
- {
- uchar i;
- AD=0.00;
- X=0;
- for(i=0;i<10;i++)
- {
- AD+=rd1543(0x08); //讀取AD值
- }
- //
- AD=AD/10.0;
- X=AD*46.0001*50.00/1023.00;//轉(zhuǎn)換成電壓值 ,分辨率是10位
- DAT[0]=X;
- AD=0.00;
- //
- for(i=0;i<10;i++)
- {
- AD+=rd1543(0x08); //讀取AD值
- }
- //
- AD=AD/10.0;
- X=AD*46.0001*50.00/1023.00;//轉(zhuǎn)換成電壓值 ,分辨率是10位
- DAT[1]=X;
- //
- AD=0.00;
- //
- for(i=0;i<10;i++)
- {
- AD+=rd1543(0x08); //讀取AD值
- }
- //
- AD=AD/10.0;
- X=AD*46.0001*50.00/1023.00;//轉(zhuǎn)換成電壓值 ,分辨率是10位
- DAT[2]=X;
- //
- /*********
- for(i=0;i<20;i++)
- {
- AD+=rd1543(0x07); //讀取AD值
- }
- //
- AD=AD/20;
- X=AD*50.000/1023.000*28.500/4.000;
- DAT[3]=X;
- //
- **********/
- }
- /***********************************************/
- //TLC1543輸入模擬電壓范圍: 0-4.9152 V
- //TLC1543AD 10個(gè)時(shí)鐘方式 方式1 。 LC1543 有四位精度 。 輸入 0.0024v 時(shí),AD值為0000000001
- //0.0048時(shí),還為1。 0.0072為 2 也就是0.0048 為一個(gè) 寬度 0.0048*AD 就是電壓值 .
- uint rd1543(uchar addr)
- {
- uint date_out=0;
- uchar k;
-
- // uchar j;
- CLK=0;
- CS=0;
-
- ADDRESS=(bit)(addr&0x08); //用這種愚蠢的方法比用FOR循環(huán)快的多 。
- CLK=1;
- CLK=0;
- addr=addr*2; //用乘法比用左移快
-
- ADDRESS=(bit)(addr&0x08);
- CLK=1;
- CLK=0;
- addr=addr*2; //用乘法比用左移快
- ADDRESS=(bit)(addr&0x08);
- CLK=1;
- CLK=0;
- addr=addr*2; //用乘法比用左移快
- ADDRESS=(bit)(addr&0x08);
- CLK=1;
- CLK=0;
- addr=addr*2; //用乘法比用左移快
-
-
- // for (j=0;j<6;j++) //填充6 個(gè)CLOCK
- // {
- CLK=1;CLK=0; //這里不用循環(huán),省時(shí)間
- CLK=1;CLK=0;
- CLK=1;CLK=0;
- CLK=1;CLK=0;
- CLK=1;CLK=0;
- CLK=1;CLK=0;
- CLK=0;
- // }
- CS=1;
- delayus(8); //等待AD 轉(zhuǎn)換
- CS=0;
- for(k=0;k<10;k++)
- {
- SDATA=1; //非P0口作為數(shù)據(jù)總線使用時(shí),讀入數(shù)據(jù)前要賦值1,特別
- CLK = 1; //是既用于寫有用于讀的情況下.
- date_out<<=1;
- if(SDATA) date_out += 1; //這樣寫法比下面的方法速度快(5us)
- // date_out=date_out|SDATA;//用時(shí)6US
- CLK = 0;
- }
- return(date_out);
- }
復(fù)制代碼
|