wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

標題: 單片機LCR電橋程序 許老師多年前的作品 [打印本頁]

作者: lzc123456789    時間: 2021-10-21 08:33
標題: 單片機LCR電橋程序 許老師多年前的作品
該電橋,具有價格便宜,性能精度能滿足一般電子愛好者的使用,電路方面許老師的自述文件里都有介紹,現提供熱心網友提供的更新程序,最后聲明:所有文件的所有權益歸原作者許老師所有.

單片機源程序如下:
  1. //==========================================================================
  2. //  LCR表驅動程序 V2.0
  3. //  許劍偉 于莆田 2012.01
  4. //==========================================================================
  5. //==========================================================================
  6. #define uchar unsigned char
  7. #define uint  unsigned int
  8. #define ulong  unsigned long
  9. #include <reg52.h>
  10. #include <math.h>

  11. //==========================================================================
  12. // 項目:LCD1602 四線驅動程序
  13. // 設計要點:
  14. //     LCD1602 的運行速度慢,而單片機運行的速度快,因此容易因為速度不
  15. //     匹配造成調試失敗。因此,調試之前應準確測試lcd_delay() 延時函數
  16. //     準確的延時量,如果不能滿足注釋中的要求,則應調整循次數。每步操
  17. //     作所需的延時量,按照數據手冊指標指行,同時留下足夠的時間余量。
  18. // 硬件連接:
  19. //     至少需要9條線,電源線2條,7條信號線。信號線詳見程序中的接口定義。
  20. //     清注意對LCD1602對比度的調節,否則無顯示。
  21. // 設計:許劍偉,于莆田,2010.12
  22. //==========================================================================
  23. sbit lcd_RS = P0^6; //數據命令控制位,0命令1數據
  24. sbit lcd_RW = P0^5; //讀寫位,0寫1讀
  25. sbit lcd_EN = P0^4; //使能位,下降沿觸發
  26. sbit lcd_D4 = P0^3; //數據端口D4
  27. sbit lcd_D5 = P0^2; //數據端口D5
  28. sbit lcd_D6 = P0^1; //數據端口D6
  29. sbit lcd_D7 = P0^0; //數據端口D7
  30. //==========================================================================
  31. code char path[32]={
  32. 0x00,0x00,0x0e,0x11,0x11,0x0a,0x1b,0x00,
  33. 0x00,0x11,0x11,0x13,0x1d,0x10,0x10,0x10,
  34. 0x0e,0x11,0x1f,0x11,0x11,0x0e,0x00,0x00,
  35. 0x1C,0x10,0x1B,0x12,0x1B,0x01,0x07,0x00
  36. };//自定義符號
  37. char binLian=0,ATA=0,ATB=1;
  38. char OX[8]={0,0,0,0,0,0,8,0};
  39. int DDS3=1, c3 = 0; //交替顯示變量
  40. char digW=4; //數字顯示位數宏
  41. code uchar abc[][5]={
  42. "  err","   40","  120","  360"," 1080","   1K","   3K","   9K","  27K","  10K",
  43. "  30K","  90K"," 270K"," 100K"," 300K"," 900K"," 2.7M","   13","  4.5","  1.5"
  44. };

  45. void lcd_delay(int n){ //LCD專用延時函數
  46.   //32MHz鐘頻下,約循環3000次延遲1毫秒
  47.   int i,j;
  48.   if(n<0)    { for(i=0;i< 30;i++); return; } //10us
  49.   if(n== 0)  { for(i=0;i<150;i++); return; } //50us
  50.   for(;n;n--){ for(j=0;j<3000;j++);        } //n毫秒
  51. }
  52. //==========================================================================
  53. void lcd_B(char f, uchar c, char t){ //控制四線式接口LCD的7個腳
  54.   //f=0寫命令字, f=1寫RAM數據, f=2讀地址(或讀忙), f=3讀RAM數據
  55.   lcd_EN = 0;
  56.   lcd_RS = f%2;
  57.   lcd_RW = f/2%2;
  58.   //移入高四位
  59.   lcd_D4 = c & 16;
  60.   lcd_D5 = c & 32;
  61.   lcd_D6 = c & 64;
  62.   lcd_D7 = c & 128;
  63.   lcd_EN = 1;  lcd_delay(-1);  lcd_EN = 0; //使能脈沖
  64.   if(f==4) { lcd_delay(t); return; }
  65.   //移入低四位
  66.   lcd_D4 = c & 1;
  67.   lcd_D5 = c & 2;
  68.   lcd_D6 = c & 4;
  69.   lcd_D7 = c & 8;
  70.   lcd_EN = 1;  lcd_delay(-1);  lcd_EN = 0; //使能脈沖
  71.   lcd_delay(t);  //不同的命令,響應時間不同,清零命令需要2ms
  72. }
  73. //==========================================================================
  74. void lcd_init(){ //LCD1602 初始化
  75.   //啟動四線模式須勢行9個步驟,初始化所須耗時較長,約65ms,時限不可減
  76.   lcd_delay(20); //啟動lcd之前須延時大于15ms,直到VDD大于4.5V
  77.   lcd_B(4, 0x30, 9); //置8線模式,須延時大于4.1ms
  78.   lcd_B(4, 0x30, 5); //置8線模式,須延時大于100us
  79.   lcd_B(4, 0x30, 5); //置8線模式,手冊中未指定延時
  80.   lcd_B(4, 0x20, 5); //進入四線模式
  81.   lcd_B(0, 0x28, 5); //四線模式雙行顯示
  82.   lcd_B(0, 0x0C, 5); //打開顯示器
  83.   lcd_B(0, 0x80, 5); //RAM指針定位
  84.   lcd_B(0, 0x01, 5); //啟動清屏命初始化LCD
  85. }
  86. //==========================================================================
  87. //=========================幾個功能常用函數=================================
  88. void lcd_cls()         { lcd_B(0, 0x01+0, 2);  } //清屏
  89. void lcd_cur0()        { lcd_B(0, 0x0C+0, 0);  } //隱藏光標
  90. void lcd_goto1(uchar x){if(ATB) lcd_B(0, 0x80+x, 0); else lcd_B(0, 0x94+x, 0);} //設置DDRAM地址,第1行x位
  91. void lcd_goto2(uchar x){if(ATB) lcd_B(0, 0xC0+x, 0); else lcd_B(0, 0xD4+x, 0);} //設置DDRAM地址,第2行x位
  92. void lcd_goto3(uchar x){if(ATB) lcd_B(0, 0x94+x, 0); else lcd_B(0, 0x80+x, 0);} //設置DDRAM地址,第3行x位
  93. void lcd_goto4(uchar x){if(ATB) lcd_B(0, 0xD4+x, 0); else lcd_B(0, 0xC0+x, 0);} //設置DDRAM地址,第4行x位
  94. void lcd_putc(uchar d) { lcd_B(1, 0x00+d, 0);  } //字符輸出
  95. void lcd_puts(uchar *s){ for(; *s; s++) lcd_B(1,*s,0); } //字串輸出
  96. //==============字符顯示函數====================

  97. void lcd_putp(float a,float b,char bo,char n, float qmin){ //帶單位顯示復數,n是單位下限,qmin是最小位權值(用于限定有效數字)
  98.   code uchar dwB[] = {'p','n','u','m',' ','k','M','G'}; //單位表
  99.   char i,j, c=0, h=digW-1, fh[2]={' ','+'};
  100.   long d,q,qm,Q=1; //最高位權
  101.   float f,g=1;
  102.   if(a<0) fh[0] = '-', a = -a;
  103.   if(b<0) fh[1] = '-', b = -b;
  104.   if(a>b) f = a; else f = b;
  105.   for(i=1;i<digW;i++) Q *= 10;
  106.   for(i=0;i<3;i++){ if(f*g >= 1000) g/=1000, c++; } //以3位為單位移動小數點,右移
  107.   for(i=0;i<n;i++){ if(f*g < 1)     g*=1000, c--; } //以3位為單位移動小數點,左移
  108. if ((n==1)&&(c==-1)){
  109.   for(i=1;i<2 && f*g<Q;i++) g*=10,h--;           //繼續移動小數點,使之滿字
  110. }else if ((n==2)&&(c==-2)){
  111.   for(i=1;i<3 && f*g<Q;i++) g*=10,h--;           //繼續移動小數點,使之滿字
  112. }else if ((n==4)&&(c==-4)){
  113.   for(i=1;i<2 && f*g<Q;i++) g*=10,h--;           //繼續移動小數點,使之滿字
  114. }else{
  115.   for(i=1;i<digW && f*g<Q;i++) g*=10,h--;        //繼續移動小數點,使之滿字
  116. }
  117.   qm = g*qmin;
  118.   for(i=0;i<2;i++){
  119.    if(i) d = b*g;      //取出實部
  120.    else  d = a*g;      //取出虛部
  121.    if(qm) d+=qm/2, d-=d%qm;//去除小于qmin的尾數
  122.    q = Q;
  123.    lcd_putc(fh[i]);        //顯示符號
  124.    for(j=0; j<digW; j++){  //數字輸出
  125.     lcd_putc(d/q+48);      //數字
  126.     if(j==h) lcd_putc('.');//小數點
  127.     d %= q, q /= 10;  
  128.    }
  129.    if(!bo) break;     //不顯示虛部
  130.   }
  131.   //lcd_putc(dwB[c+4]); //單位
  132. if(dwB[c+4]=='u') { lcd_putc(9);} else {
  133. if(n==1){
  134. if(dwB[c+4]==' ') { lcd_putc(8); OX[6]=32; } else { lcd_putc(dwB[c+4]); OX[6]=8; } //自動單位
  135. }
  136. else { lcd_putc(dwB[c+4]); OX[6]=8; }
  137. } //符號

  138. }
  139. void lcd_putf(float a, char n, float qmin) //帶單位顯示浮點數,n是單位下限
  140.   { lcd_putp(a,0,0,n,qmin); }
  141. void lcd_int(int a,char w){ //定寬顯示正整數
  142.   char i=0, s[5] = {' ',' ',' ',' ',' '};
  143.   if(a<0) { a=-a; lcd_puts("-"); }
  144.   else    lcd_puts(" ");
  145.   do{
  146.    s[i++] = a%10+48;
  147.    a /= 10;
  148.   }while(a);
  149.   for(;w;w--) lcd_putc(s[w-1]);
  150. }

  151. //==========================================================================
  152. //===============================延時函數===================================
  153. void delay(uint loop) { uint i; for(i=0;i<loop;i++); } //延時函數
  154. void delay2(uint k)   { for(;k>0;k--) delay(10000);  } //長延時,k=100大約對應1秒

  155. //==========================================================================
  156. //=================================AD轉換===================================
  157. sfr P1ASF = 0x9D;     //將P1置為模擬口寄存器(使能),各位中為1的有效
  158. sfr ADC_CONTR = 0xBC; //A/D轉換控制寄存器
  159. sfr ADC_res   = 0xBD; //A/D轉換結果寄存器
  160. sfr ADC_resl  = 0xBE; //A/D轉換結果寄存器

  161. void set_channel(char channel){
  162. P1ASF = 1<<channel;
  163. ADC_CONTR = channel+128; //最高位是電源開關,低3位通道選擇
  164. delay(1); //首次打開電源應延遲,使輸入穩定
  165. }
  166. uint getAD2(){
  167. ADC_CONTR |= 0x08;             //00001000,置ADC_START=1啟動A/D 轉換
  168. while ( !(ADC_CONTR & 0x10) ); //等待A/D轉換結束(ADC_FLAG==0)
  169. ADC_CONTR &= 0xE7;             //11100111,置ADC_FLAG=0清除結束標記, 置ADC_START=0關閉A/D 轉換
  170. return ADC_res*4 + ADC_resl;
  171. }
  172. /*
  173. uchar get_AD(){
  174. ADC_CONTR |= 0x08;             //00001000,置ADC_START=1啟動A/D 轉換
  175. while( !(ADC_CONTR & 0x10) );  //等待A/D轉換結束(ADC_FLAG==0)
  176. ADC_CONTR &= 0xE7;             //11100111,置ADC_FLAG=0清除結束標記, 置ADC_START=0關閉A/D 轉換
  177. return ADC_res;
  178. }
  179. */


  180. //==========================================================================
  181. //==================================EEPROW偏程==============================
  182. sfr IAP_data  = 0xC2;
  183. sfr IAP_addrH = 0xC3;
  184. sfr IAP_addrL = 0xC4;
  185. sfr IAP_cmd   = 0xC5;
  186. sfr IAP_trig  = 0xC6;
  187. sfr IAP_contr = 0xC7;
  188. /********************
  189. 寫字節時,可以將原有數據中的1改為0,無法將0改為1,只能使用擦除命令將0改為1
  190. 應注意,擦除命令會將整個扇區擦除
  191. *********************/
  192. int eepEn = 0;
  193. void saEEP(){ //觸發并EEP保護
  194. if(eepEn==12345) IAP_trig = 0x5A;  //先送5A
  195. if(eepEn==12345) IAP_trig = 0xA5;  //先送5A再送A5立即觸發
  196. IAP_cmd = 0;      //關閉令,保護
  197. IAP_contr = 0;    //關EEPROM,保護
  198. IAP_trig = 0;
  199. IAP_addrL = 255; //設置讀取地址的低字節,地址改變才需要設置
  200. IAP_addrH = 255; //設置讀取地址的高字節,地址改變才需要設置
  201. }
  202. uchar readEEP(uint k){ //讀取
  203. IAP_addrL = k;    //設置讀取地址的低字節,地址改變才需要設置
  204. IAP_addrH = k>>8; //設置讀取地址的高字節,地址改變才需要設置
  205. IAP_contr = 0x81; //設置等待時間,1MHz以下取7,2M以下取6,3M取5,6M取4,12M取3,20M取2,24M取1,30M取0,前導1表示許檔IAP
  206. IAP_cmd = 1;      //讀取值1,寫取2,擦除取3,擦除時按所在字節整個扇區攛除
  207. saEEP(); //觸發并保護
  208. return IAP_data;
  209. }
  210. void writeEEP(uint k, uchar da){ //寫入
  211. IAP_data = da;    //傳入數據
  212. IAP_addrL = k;    //設置讀取地址的低字節,地址改變才需要設置
  213. IAP_addrH = k>>8; //設置讀取地址的高字節,地址改變才需要設置
  214. IAP_contr = 0x81; //設置等待時間,1MHz以下取7,2M以下取6,3M取5,6M取4,12M取3,20M取2,24M取1,30M取0,前導1表示許檔IAP
  215. IAP_cmd = 2;      //讀取值1,寫取2,擦除取3,擦除時按所在字節整個扇區攛除
  216. saEEP(); //觸發并保護
  217. }
  218. void eraseEEP(uint k){ //擦除
  219. IAP_addrL = k;    //設置讀取地址的低字節,地址改變才需要設置
  220. IAP_addrH = k>>8; //設置讀取地址的高字節,地址改變才需要設置
  221. IAP_contr = 0x81; //設置等待時間,1MHz以下取7,2M以下取6,3M取5,6M取4,12M取3,20M取2,24M取1,30M取0,前導1表示許檔IAP
  222. IAP_cmd = 3;      //讀取值1,寫取2,擦除取3,擦除時按所在字節整個扇區攛除
  223. saEEP(); //觸發并保護
  224. }


  225. xdata struct Ida{
  226. char zo[3];//三個頻率下的零點改正值
  227. char j1;   //相位補償(3倍檔)
  228. char j2;   //相位補償(10倍檔)
  229. char J[4];  //相位補償(V/I變換器)
  230. char R[4]; //下臂電阻修正(40,1k,10k,100k)
  231. char g1;   //增益修正(3倍檔)
  232. char g2;   //增益修正(10倍檔)
  233. char phx; //1kHz以下相位改正
  234. char R4b; //100k檔7.8kHz頻率下的幅度補償
  235. char G2b; //9倍檔7.8kHz頻率下的幅度補償
  236. char feq; //頻率修正
  237. char ak;  //AD斜率修正
  238. float QRs[3],QXs[3]; //短路清零數據
  239. float QRo[3],QXo[3]; //開路清零數據
  240. } cs;

  241. void cs_RW(char rw){
  242. uchar i,*p = &cs;
  243. const int offs=512;
  244. if(rw){
  245.   delay2(10); //等待(防止掉電誤識別鍵盤而調用本函數)
  246.   eraseEEP(offs);
  247.   for(i=0;i<sizeof(cs);i++) writeEEP(i+offs,p[i]);
  248. }else{
  249.   for(i=0;i<sizeof(cs);i++) p[i]=readEEP(i+offs);
  250. }
  251. }

  252. //==========================================================================
  253. //==================================LCR主程序===============================
  254. //==========================================================================
  255. sfr P1M1=0x91; //P1端口設置寄存器
  256. sfr P1M0=0x92; //P1端口設置寄存器
  257. sfr P0M1=0x93; //P0端口設置寄存器
  258. sfr P0M0=0x94; //P0端口設置寄存器
  259. sfr P2M1=0x95; //P2端口設置寄存器
  260. sfr P2M0=0x96; //P2端口設置寄存器
  261. sfr P3M1=0xB1; //P3端口設置寄存器
  262. sfr P3M0=0xB2; //P3端口設置寄存器


  263. sbit spk=P2^3; //蜂鳴器
  264. sbit Kb=P2^1;  //量程開關B
  265. sbit Ka=P2^2;  //量程開關A
  266. sbit DDS2=P1^2;//移相方波輸出口
  267. sbit K3=P1^7;
  268. sbit K4=P1^6;
  269. sbit K5=P1^5;  //7.8kHz濾波開關
  270. sbit K6=P1^4;
  271. sbit K8=P2^0;  //100Hz濾波開關
  272. sbit K32=P1^1; //32kHz發生器
  273. xdata uchar menu=1,menu2=0; //菜單變量

  274. //==============低頻信號DDS相關參數====================
  275. //PCA相關寄存器
  276. sfr CMOD = 0xD9;   //鐘源選擇控制等
  277. sfr CH = 0xF9;     //PCA的計數器
  278. sfr CL = 0xE9;     //PCA的計數器
  279. sfr CCON = 0xD8;   //PCA控制寄存器
  280. sfr CCPAM0 = 0xDA; //PCA模塊0工作模式寄存器
  281. sfr CCPAM1 = 0xDB; //PCA模塊1工作模式寄存器
  282. sfr CCAP0L = 0xEA; //模塊0捕獲寄存器低位
  283. sfr CCAP0H = 0xFA; //模塊0捕獲寄存器高位
  284. sfr IPH = 0xB7;

  285. sbit PPCA  = IP^7;   //PCA的中斷優先級設置
  286. sbit CCF0  = CCON^0; //PCA的模塊0中斷標志
  287. sbit CCF1  = CCON^1; //PCA的模塊1中斷標志
  288. sbit CR = CCON^6;    //PCA計數器使能

  289. uint ph=0, phM=256, feq=977; //相位,phM相位步進值
  290. uchar *ph8 = (char*)&ph;    //ph的高8位地址
  291. xdata float feqX=976.6; //實際輸出頻率
  292. uchar code sinB[256]={
  293. //查詢表中不可裝載零值,否則會造成無中斷產生
  294. 255,255,255,255,255,255,254,254,253,252,252,251,250,249,248,247,246,245,243,242,240,239,237,236,234,232,230,229,227,225,222,220,
  295. .......
  296. uchar chuX=0; //方波DDS初相
  297. //==============低頻信號DDS函數====================
  298. void PWM_init(){ //把PCA置為PWM
  299.   CMOD = 2;   //0000 0010 計數源選擇,鐘源取fosc/2
  300.   CL = CH = 0;
  301.   CCAP0L = CCAP0H = 192; //占空比為25%
  302.   //CCPAM0=0x42;//0100 0010,PCA的模塊0設置為PWM模式,無中斷
  303.   CCPAM0=0x53;//0101 0011,PCA的模塊0設置為PWM模式,有中斷,下降沿中斷
  304.   PPCA = 1;   //優先中斷
  305.   IPH |= 128;
  306.   //CR = 1;   //開始計數
  307.   EA = 1;     //開總中斷
  308. }

  309. void PCAinter(void) interrupt 7 {//PCA中斷
  310.   uchar x,y;
  311.   CCF0=0; //清除中斷請求,以免反復中斷
  312.   x = *ph8;        //截斷正弦相位累加器,取高8位
  313.   y = x + chuX;    //方波相位
  314.   CCAP0H = sinB[x];//正弦DDS輸出
  315. if(DDS3) {  DDS2 = fbB[y];   //方波DDS輸出
  316. }else {DDS2 = 0;}
  317.   ph += phM;       //相位累加
  318.   K32 = ~K32;
  319. }
  320. void setDDS(uint f){ //參考時鐘是c=(fosc/2)/256=32000000/2/256=62500,頻率f=c*phM/2^16
  321. feq = f;
  322. phM=f*65536.0/62500; //phM=f*2^16/62500
  323. feqX = 62500.0*phM/65536*(1+cs.feq/10000.0); //實際輸出頻率
  324. ph = 0;              //高頻時,使波形對稱
  325. if(!f) CR=0; else CR=1;
  326. }

  327. //相位控制函數
  328. xdata char xw=0; //相位
  329. void set90(char k){ //設置方波的相位差
  330.   k %= 4;
  331.   if(k<0) k += 4;
  332.   if(k==0) chuX=0;   //移相0度
  333.   if(k==1) chuX=64;  //移相90度
  334.   if(k==2) chuX=128; //移相180度
  335.   if(k==3) chuX=192; //移相270度
  336.   xw = k;
  337. }
  338. void set902() { set90(xw+1); } //相位步進

  339. //==============量程控制函數====================
  340. xdata char rng=1; //量程
  341. void setRng(char k){//切換量程
  342. if(k>3) k=3;
  343. if(k<0) k=0;
  344. if(k==0) Ka=0,Kb=0; //40歐
  345. if(k==1) Ka=0,Kb=1; //1k歐
  346. if(k==2) Ka=1,Kb=0; //10k歐
  347. if(k==3) Ka=1,Kb=1; //100k歐
  348. rng = k;
  349. }
  350. void setRng2(){ setRng( (rng+1)%4); } //量程步進

  351. //==============增益控制函數====================
  352. char curGain=1; //當前增益索引號
  353. void setGain(char k){ //設置電路增益
  354.   if(k>3) k=3;
  355.   if(k<0) k=0;
  356.   if(k==0) K4=0,K6=0; //1倍
  357.   if(k==1) K4=0,K6=1; //3倍
  358.   if(k==2) K4=1,K6=0; //9倍
  359.   if(k==3) K4=1,K6=1; //27倍
  360.   curGain = k;
  361. }
  362. void setGain2(){ setGain((curGain+1)%4); }


  363. //==============AD非線性改正與過采樣=================
  364. uint getAD10(){ //120次采樣,用reentrant申明,有的單片機無法運行
  365. int i;
  366. long c;
  367. for(i=0;i<250;i++) c += getAD2();
  368. return (c+12)/25;
  369. }
  370. uint getAD10b(){ //120次采樣,用reentrant申明,有的單片機無法運行
  371. xdata long c = 0, c2 = 0;
  372. int i;
  373. for(i=0;i<250;i++){
  374.   ADC_CONTR |= 0x08;             //00001000,置ADC_START=1啟動A/D 轉換
  375.   while ( !(ADC_CONTR & 0x10) ); //等待A/D轉換結束(ADC_FLAG==0)
  376.   ADC_CONTR &= 0xE7;             //11100111,置ADC_FLAG=0清除結束標記, 置ADC_START=0關閉A/D 轉換
  377.   c  += ADC_resl;
  378.   c2 += ADC_res;
  379. }
  380. c3 = c;
  381. c = ( c2*4L + c )/25;
  382. c3= ( c2*4L + c3 ) -c*25;
  383. return c;
  384. }



  385. //==============LCR測量====================
  386. code float ga[4] =  {  1,   3,   9,  27 }; //增益表
  387. code float dwR[4] = { 40, 1e3, 1e4, 1e5 }; //各檔電阻表
  388. xdata int Vxy[12]={0,0,0,0,1,1}; //Vxy[Vx1,Vy1,Vx2,Vy2,g1,g2]
  389. xdata char Sxw[4]={0,1,0,1};    //保存正確相位
  390. xdata int Vz[24];               //LCR測量結果隊
  391. xdata uchar tim=0,tims=0;
  392. xdata char pau=0; //暫停坐標自動旋轉
  393. xdata char isQ=1;

  394. #define Vfull 9600
  395. #define gad (9600/30)
  396. uchar mT = 6; //測量速度,mT取值為6或12或24時,可以消除數字噪聲,尾數不動,但不利于于取平均
  397. //==============設置頻率====================
  398. xdata char feqK=1; //頻率索引號
  399. void setF(char k){
  400.   if(k==-1) k = (feqK+1)%3; //步進
  401.   feqK = k;
  402.   if(k==0) { setDDS(100);   K5=0; K8=1; mT=12; } //置為100Hz
  403.   if(k==1) { setDDS(977);   K5=0; K8=0; mT=6;  } //置為1kHz
  404.   if(k==2) { setDDS(7813);  K5=1; K8=0; mT=6;  } //置為7.8125kHz
  405.   TH1 = 150, TL1 = 171; //置為20ms
  406.   tims = 0;
  407.   tim = 0;
  408.   ph = 0;
  409. }
  410. int absMax(int a,int b){ //取兩個數絕對值最大者
  411.   if(a<0) a = -a;
  412.   if(b<0) b = -b;
  413.   if(b>a) a = b;
  414.   return a;
  415. }

  416. char yc1=0,yc2=0; //溢出標識
  417. char slw = 1; //降速倍率
  418. char chg=0;   //量程切換標記
  419. void timerInter1(void) interrupt 3 {//T1中斷,LCR數據采集
  420. code int y[5]={0,-15,30,24,0}; //滿度用30
  421. code int x[5]={4900,5090,5140,5500,6120};
  422.   char g,gb,Rb,i; int c=0,cc=0;
  423.   tims++;
  424.   if(tims>=mT/slw) tims = 0, tim++, c = 1;
  425.   if(tim>=4) tim=0;
  426.   if(pau) return;
  427.   if(!c) return; //tim未進位觸發
  428.   c = getAD10b();   //讀取電壓值
  429.   cc= c3;
  430.   c -= cs.zo[feqK];
  431. if(cs.ak>0){
  432. for(i=0;i<4;i++){ //非線性改正
  433.   if(c<x[i]||c>=x[i+1]) continue;
  434.   c += cs.ak*( y[i] + (y[i+1]-y[i]) * ((int)(c-x[i])) / (x[i+1]-x[i]) ) / 30;
  435.   break;
  436. }
  437. }
  438.   
  439.   Vxy[tim] = xw<2 ? c : -c;  //保存當前電壓
  440.   Vxy[tim+6] = xw<2 ? cc : -cc;  //保存當前電壓
  441.   Vxy[tim/2+4] = curGain;    //保存當前增益
  442.   Sxw[tim] = ( Sxw[tim]+(c<0 ? 2 : 0) )%4;  //相位翻轉(預測下次的相位采用值)
  443.   if(tim==1||tim==3){ //上下臂切換
  444.     if(tim==1) { K3=1, c = absMax(Vxy[2],Vxy[3]), g=Vxy[5]; yc2 = c>Vfull ? 1:0; }//切換到下臂
  445.     if(tim==3) { K3=0, c = absMax(Vxy[0],Vxy[1]), g=Vxy[4]; yc1 = c>Vfull ? 1:0; }//切換到上臂
  446.     gb=g, Rb=rng;
  447.     if(c>Vfull){ if(g==0&&rng>0&&K3&&isQ) Rb=rng-1; gb=0; }
  448.     else if(c<gad*1 ) gb = g+3; //增加27倍
  449.     else if(c<gad*3 ){ gb = g+2;if(c<gad*2&&rng>=1&&rng<=2&&K3&&isQ ) { gb=0; Rb=rng+1; }} //增加9倍
  450.     else if(c<gad*9)  gb = g+1; //增加3倍
  451.         if(gb>3) gb = 3;
  452.     if(g==3&&rng<3&&K3&&isQ) { gb=0; Rb=rng+1; }
  453.     if(g==0&&c<gad*1&&rng<3&&K3&&isQ) { gb=0; Rb=rng+1; }

  454.         setRng(Rb); setGain(gb); //置量程
  455.     if(gb!=g || Rb!=rng) slw = 2, chg++; //量程正在改變,則加速測量
  456.     if(tim==3){ if(!chg) slw=1; chg=0; }
  457.   }
  458.   set90( Sxw[ (tim+1)%4 ] ); //相位旋轉
  459.   if(tim==3){ for(i=0;i<12;i++) Vz[i+12]=Vz[i], Vz[i]=Vxy[i]; }
  460. }


  461. void showR(char binLian, char showk){ //顯示LCR
  462.   xdata float a=0,b=0,c=0,qq=0,dd=0,e,w,L,C;
  463.   xdata int gr=cs.R[rng], g1=cs.g1, g2=cs.g2;
  464.   xdata int g12 = g1 + g2;          //增益最大補償
  465.   xdata int j12 = (int)cs.j1+cs.j2; //相位最大補償
  466.   xdata float JD = 0, G = 0, cJD;   //補償變量
  467.   xdata float v[4];
  468.   xdata char ATC=0,d3=1;

  469.   //LCR計算
  470.   if(feqK<0||feqK>2) return;
  471.   if(feq==7813&&rng==3) gr += cs.R4b; //7.8kHz時下臂修正量
  472.   //可控增益單元的增益修正、相位補償量
  473.   if(feq==7813) g2 += cs.G2b;  //7.8kHz時9倍檔修正量
  474. ……………………

  475. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei附件下載:
2004程序_3.0_全自動電橋V1.rar (28.53 KB, 下載次數: 470)
LCR數字電橋自制方案.pdf (1.39 MB, 下載次數: 412)
LCR數字電橋.docx (257.25 KB, 下載次數: 337)

作者: 雪玉寐影    時間: 2021-12-7 02:53
許老師把資料公開了?怪不得某寶多出來很多套件!
作者: jsh560    時間: 2021-12-11 09:18
吃透了嗎?可以一起討論學習下嗎

作者: dhbt2021    時間: 2021-12-11 19:02
置量程不懂!!!!!!
作者: tanguoyong    時間: 2022-1-1 20:58
置量程不懂!!!!!!
作者: luckzsh    時間: 2022-3-2 00:10
一起討論學習下
作者: n0si9na1    時間: 2022-3-3 17:15
感謝分享,過了這么多年,許老師這個電橋還是很給力啊,DIY者樂此不疲
作者: youlinys    時間: 2022-3-13 15:08
感謝許老師的無私奉獻。
作者: 18201700208    時間: 2022-4-8 15:43
high,供電不足
作者: lao4jiadian    時間: 2022-4-13 13:53
哪位壇友能把徐老師電橋的硬件資料發上來啊,學習一下
作者: 看看再說吧    時間: 2022-6-28 05:37
這個固件在2004屏幕上顯示不完整。
作者: xiaoyuxinke    時間: 2022-6-28 21:30
固件其實是LCD1602的,但寫的用2004的屏,會導致顯示不完整,
作者: angmall    時間: 2022-7-30 13:48
lao4jiadian 發表于 2022-4-13 13:53
哪位壇友能把徐老師電橋的硬件資料發上來啊,學習一下

XJW01許老師 LCR數字電橋板原理圖




作者: ywcffc    時間: 2022-9-8 11:07
有沒有全套2004LCD可以完全使用的固件和硬件,網上找的都不是很全
作者: 我欠你錢么    時間: 2023-4-18 16:50
研究研究代碼,看看能不能搞懂
作者: heizelalala    時間: 2023-8-5 02:55
太有用啦
作者: 1045964948    時間: 2023-9-7 16:59
我想問一下樓主能理解這個程序的意思嗎,我最近在搞電橋,想移植程序到stm32無奈看不懂許老師這個stc的程序,如果知道可以回復我一下我最近都在線
作者: mafeimafei_2012    時間: 2023-12-25 16:30
感謝老師的無私奉獻。
作者: zyfzyf007    時間: 2024-2-23 20:26

感謝老師的無私奉獻。
作者: Su_xin    時間: 2024-3-1 15:17
12864版嗎?
作者: 還沒想好名字啊    時間: 2024-3-2 09:47
1045964948 發表于 2023-9-7 16:59
我想問一下樓主能理解這個程序的意思嗎,我最近在搞電橋,想移植程序到stm32無奈看不懂許老師這個stc的程序 ...

我也學不會,期待許老師出山答疑。STC的程序,有幾個小伙伴在學習  STC官方也在折騰好像
作者: 1109    時間: 2024-3-8 21:07
哪里有這個電橋的PCB文件,我想去打個板子調試下效果。
作者: paladina    時間: 2024-5-7 17:12
好東西,學習。能有大拿解釋一下程序就更好了
作者: daxia7203    時間: 2024-11-30 17:53
不錯不錯
作者: STC莊偉    時間: 2024-12-4 09:21
LCR 電橋,移植,辛苦費RMB2000
===12C5A60S2實現,許老師
立創開源:LCR測量@8051U, 參考許老師原創
用管腳兼容的 8051USB 實現后開源許老師,公布了 LCR 電橋開源資料
歡迎學習許老師的大作 !
8H8K64U / 32G12K128片內的 ADC就是真12位ADC
===能準確的測量 0 ~ 4095 體現的外部真實模擬電壓
2024年,8051U推出, 管腳基本兼容 12C5A60S2
作者: lzxxx588    時間: 2025-1-1 20:20
雪玉寐影 發表于 2021-12-7 02:53
許老師把資料公開了?怪不得某寶多出來很多套件!

想自己搞一個玩玩不知道好搞不
作者: 1109    時間: 2025-1-2 09:41
STC莊偉 發表于 2024-12-4 09:21
LCR 電橋,移植,辛苦費RMB2000
===12C5A60S2實現,許老師
立創開源:LCR測量@8051U, 參考許老師原創

方便給個開源鏈接嗎?我在立創開源沒有搜到。
作者: 2048858214    時間: 2025-4-17 08:09
新版本stm32的 100Khz 不好弄啊 許老師聯系不到了
作者: 荒野ac    時間: 2025-4-18 12:34
置量程不懂!!!!
作者: 荒野ac    時間: 2025-4-18 12:34

置量程不懂!!!!
作者: hu2018y    時間: 2025-4-20 08:29
我有片1604可以派上用場了,好像最新的STC8051U這芯片很牛逼的樣子,期待大神把它玩出花樣來。
作者: wkman    時間: 2025-4-21 17:05
  買成品套件,不折騰
作者: llflvleifeng    時間: 2025-7-6 13:39
感謝分享,學習下
作者: xyqahzw    時間: 2025-7-13 21:04
學習一下,看看能不能復制出來,大不了代碼自己重編
作者: 單片機重購    時間: 2025-7-14 22:21
像這種的呢我們之前也是經常去看呢我覺得這種單片機的東西呢也是比較簡單的呢。
作者: 盛世游龍    時間: 2025-7-16 10:13
有人復刻成功的嗎?
作者: 盛世游龍    時間: 2025-7-16 10:27
xyqahzw 發表于 2025-7-13 21:04
學習一下,看看能不能復制出來,大不了代碼自己重編

像這種,如果自己完全能編,就不用看別人的復刻了。單片機硬件和軟件一直都是相互配合的,能搞定軟件,必然也要懂硬件。硬件不了解,軟件就無從可編的。了解硬件,也就可以根據軟件特性設計硬件。如果說,你一定要借助別人設計的硬件才能編其程序。那么說你能適度修改原作者提供的源代碼,我信。說自己從頭編,我不太信。
作者: 盛世游龍    時間: 2025-7-16 10:32
單片機重購 發表于 2025-7-14 22:21
像這種的呢我們之前也是經常去看呢我覺得這種單片機的東西呢也是比較簡單的呢。

很多東西,看起來簡單。但真要自己動手去做,需要了解的東西,可真不少。很多東西,就算依葫蘆畫瓢,做出了,效果也不一定會好。很多細節如果對相關原理了解不足,問題出在哪里都不知道!
作者: wkman    時間: 2025-7-18 16:43
tb上有成品賣的吧




歡迎光臨 (http://m.izizhuan.cn/bbs/) Powered by Discuz! X3.1
免费成人深夜天涯网站| 99免费看香蕉视频| 加勒比精品视频| 亚洲一区三区| 久久久久九九九九| 色女孩综合影院| 不卡av在线网| 女同性一区二区三区人了人一| 色偷偷色偷偷色偷偷在线视频| jizzjizz免费大全| 国产黄色片网站| 熟女少妇a性色生活片毛片| 免费无码不卡视频在线观看| 成人国产精品一区二区| 一区二区三区亚洲| 欧美色中文字幕| 国产精品天美传媒| 蜜臀精品久久久久久蜜臀| 日韩中文av| 极品视频在线| 免费毛片在线| aaaaa级片| av中文字幕网| 中文字幕一区二区人妻痴汉电车| 日韩av免费在线看| 亚洲精品99久久久久| 五月婷婷激情综合网| 91在线porny国产在线看| 中文亚洲欧美| 日韩极品一区| 爱高潮www亚洲精品| 成入视频在线观看| 中文字幕在线免费| 992tv在线观看| 老师我好爽再深一点的视频| 免费不卡中文字幕视频| 天天天天天天天干| 欧美xxxooo| 日本少妇一级片| 欧美成人三级在线视频| 日韩电影在线播放| 97视频热人人精品| 97人人模人人爽人人喊中文字 | 播播国产欧美激情| 欧美一激情一区二区三区| 亚洲成av人片一区二区三区 | 欧美日韩国产成人在线观看| 日韩视频在线一区二区| 欧美色欧美亚洲高清在线视频| 久久久久久久综合狠狠综合| 国产麻豆精品视频| 狂野欧美性猛交xxxx巴西| 日本一区二区在线看| 日本一区二区三区视频在线看| 自拍网站在线观看| 91jq激情在线观看| dy888亚洲精品一区二区三区| 小水嫩精品福利视频导航| 涩涩漫画在线观看| wwwwww色| 嫩草影院在线观看未满十八| 国产精品亚洲电影久久成人影院| 亚洲 国产 欧美 日韩| 国产男女猛烈无遮挡| 日韩黄色片网站| 天堂网视频在线| 日本三级视频在线| 青青青在线免费观看| 韩国女同性做爰三级| 91精品人妻一区二区| 亚洲在线观看视频| 57pao精品| 欧美在线视频a| 青青草成人在线| 国产精品久久久久久久午夜| 国产ts一区二区| 欧美一区二三区| 欧美在线日韩在线| 国产欧美日韩精品在线观看 | 日韩二区三区| 亚洲一区在线日韩在线深爱| 美女网站在线| 色视频www在线播放| 亚洲男人天堂| 久久精品蜜桃| h视频在线免费| 国产激情视频在线| 欧美a级在线观看| 欧美日韩激情电影| 日本成人精品| 综合亚洲自拍| 这里只有精品在线| 99热在线精品观看| 久国产精品韩国三级视频| 久久99久久99精品免视看婷婷| 久久精品国产99| 粉嫩高潮美女一区二区三区 | 国内精品视频| 精品国产18久久久久久洗澡| 欧美极品中文字幕| 欧美在线三级| 日韩av中文在线观看| 国产精品一区二区三区乱码| 97精品国产97久久久久久久久久久久| 久久久久久麻豆| 亚洲午夜精品在线| 欧美裸体bbwbbwbbw| 国产午夜精品麻豆| 欧美华人在线视频| 国产欧美一区二区三区在线看| 成人资源av| 手机在线观看国产精品| 日韩激情视频一区二区| 国产精品自拍视频在线| 好男人香蕉影院| 欧美久久久久久久久久久久| 国产精品欧美亚洲| 欧美野外性xxxxfeexxxx| 超碰在线91| 日本一级黄色录像| 国产伦精品一区二区三区视频网站| 国产精品久久久久久久成人午夜| 天天操天天爱天天干| 2021最新国产精品一区| 女人体1963| 秋霞影院午夜丰满少妇在线视频| 高清成人在线| 成人精品影院| 精品一区免费av| 亚洲色图第一区| 日韩三级在线免费观看| 欧美寡妇偷汉性猛交| 99久热re在线精品视频| www.男人天堂网| 国产精品入口麻豆| 一级黄色免费网站| 欧美性猛交xxxxbbb| 麻豆一区二区三区四区精品蜜桃| 欧美成人三区| 日本亚洲视频| 麻豆九一精品爱看视频在线观看免费| 久久香蕉国产线看观看99| 色国产综合视频| 日韩亚洲成人av在线| 成人自拍网站| 日本中文字幕片| 国精产品一区一区二区三区mba| 精品国产av一区二区| 啦啦啦高清在线观看www| 免费在线看黄网站| 你懂的在线观看一区二区| 亚洲欧美久久| 亚洲欧美色综合| 国产亚洲一区二区在线| 国产精品乱码| 在线观看视频在线观看| 可以免费在线观看的av| 日本卡一卡2卡3卡4精品卡网站| 一级黄色在线| 高清久久精品| 日本亚洲三级在线| 婷婷激情综合网| 久久久精品视频在线观看| 欧美日韩在线一二三 | 久草中文视频| 国产在线观看免费| 色爱av综合网| 岛国精品在线播放| 欧美日韩精选| 中文字幕日本不卡| 在线播放国产一区二区三区| 亚洲tv在线观看| 国产九九在线观看| 国产一区免费看| 成人网免费视频| 日韩成人综合网站| 美女诱惑一区二区| 欧美精品久久99| 国产精品免费看久久久香蕉 | 亚洲天天综合| 亚洲视频在线观看三级| 国产一区二区久久精品| 日本黑人久久| 国产黄色大片免费看| 亚洲男人天堂2017| 黄网站免费在线播放| 日韩在线观看| 亚洲色图20p| 欧美丰满老妇厨房牲生活| 亚洲五码在线观看视频| 欧美色图亚洲天堂| 黄色免费网站视频| 国产精品高潮久久| 国产一区欧美一区| 亚洲国产精品99久久| 免费看成人av| 色婷婷国产精品免| 欧洲毛片视频| 亚洲精品毛片| 99re成人精品视频| 日韩在线播放视频| 国产精品一二三在线观看| 精品无码一区二区三区蜜臀| 特大巨黑人吊性xxxxn38| 成人私拍视频| 国产美女视频91| 日韩av综合网| 糖心vlog在线免费观看| 日韩大片免费在线观看| 人与动性xxxxx免费视频| 亚洲综合影院| 久久精品一区蜜桃臀影院| 精品久久久91| 欧美日韩一区二区在线免费观看| 国产精品九九九九| 美女黄视频在线观看| 天堂va蜜桃一区二区三区| 欧美一区二区三区视频在线观看| 精品欧美一区二区三区久久久 | 日本网站在线看| 深爱五月激情五月| 欧美激情网站| 成人午夜短视频| xxx一区二区| 天天影视综合色| 好男人中文字幕官网| 成人黄色免费短视频| 成人av资源站| 国产做受高潮69| 无码人妻少妇色欲av一区二区| 久草视频免费在线观看| 成人影院在线免费观看| 久久亚洲二区三区| 清纯唯美亚洲激情| 草草地址线路①屁屁影院成人| 色姑娘资源站| 国产欧美一区二区三区精品观看| 五月天国产精品| 国产欧美日韩综合精品二区| 欧美三级小视频| 国产无套粉嫩白浆在线2022年| 亚洲日本久久| 亚洲男人天堂视频| 欧美伦理片在线看| 精品一区二区三区五区六区七区| 深夜日韩欧美| 亚洲综合丁香婷婷六月香| 91福利视频导航| 青青草成人免费| 成人高清在线| 国产成人三级在线观看| 精品中文字幕在线2019| 欧美高清精品一区二区| 黄色激情网址| 亚洲高清资源在线观看| 精品三级av在线| 欧美亚洲精品一区二区| 欧美人与动性xxxxx杂性| 国产91精品入| 在线这里只有精品| 亚洲综合激情五月| 亚洲免费黄色片| 欧美天堂在线| 亚洲一线二线三线久久久| 精品国产乱码久久久久久郑州公司| 不卡的免费av| 肉肉视频在线观看| 91论坛在线播放| 91在线精品视频| 国产午夜在线播放| 91资源在线观看| 国产日产欧产精品推荐色| 亚洲xxxx18| 日本黄色中文字幕| 日韩色淫视频| 色老汉av一区二区三区| 你懂的av在线| 日日日日人人人夜夜夜2017| 亚洲欧洲美洲一区二区三区| 亚洲精品美女视频| 白丝校花扒腿让我c| 性综艺节目av在线播放| 另类小说综合欧美亚洲| 亚洲3p在线观看| 九九热视频精品| av资源网在线播放| 一区二区在线观看不卡| 日韩欧美视频一区二区| 91精品国自产在线偷拍蜜桃| 亚洲精品97久久久babes| 视频一区中文字幕国产| 久久久免费在线观看| 日韩欧美中文字幕视频| 18video性欧美19sex高清| 一区二区在线免费| 国产亚洲精品久久久久久久| 国产叼嘿网站免费观看不用充会员| 欧美成人有码| 九九久久综合网站| 免看一级a毛片一片成人不卡| 91桃色在线| 欧美日韩国产一中文字不卡| 久久久久久免费看| 黄色成人免费观看| 国产一区三区三区| 国产伦精品一区二区三区四区免费| 99久久久久久久| 欧美肉体xxxx裸体137大胆| 在线亚洲国产精品网| 久久久精品少妇| 91天天综合| 欧美一区二区三区思思人| 午夜视频在线免费看| 国产小视频在线| 亚洲欧美日韩人成在线播放| 和岳每晚弄的高潮嗷嗷叫视频| h视频在线观看免费网站| 精品亚洲国内自在自线福利| 92国产精品久久久久首页 | 欧美午夜大胆人体| 午夜视频一区在线观看| 国产日韩一区二区在线观看| 免费av一级电影| 26uuu色噜噜精品一区二区| 亚洲成人第一| www.九九热.com| 国产成人综合网站| 欧美一区二区三区电影在线观看 | 亚洲激情中文字幕| 蜜乳av中文字幕| 亚洲黄色免费看| 制服.丝袜.亚洲.中文.综合| xxxx黄色片| 手机在线观看av网站| 日韩一级片在线播放| 无码人妻精品一区二区三应用大全 | 国产综合色在线观看| 日韩精品一区二区三区老鸭窝 | 日韩免费三级| 黄网址在线看| 91丨porny丨国产入口| a级片一区二区| 最近最新中文字幕在线| 成人欧美一区二区三区小说| 国产日产欧美视频| 国产一二三在线观看| 欧美日韩国产精品一区二区不卡中文| 国产乱码一区二区三区四区| 超碰超碰在线| 5566中文字幕一区二区电影| 蜜桃传媒一区二区亚洲| 国产精品亲子伦av一区二区三区| 日韩av在线免费观看| 亚洲精品视频在线观看免费视频| 欧美巨大xxxx| 8x拔播拔播x8国产精品| 日韩一级片免费| 男人的天堂成人在线| 精品免费日产一区一区三区免费| 激情小说图片视频| 日本一二三不卡| 91亚洲精品久久久蜜桃借种| 午夜伦理在线视频| 欧美一区二区三级| 劲爆欧美第一页| 精品久久久久久久久久久aⅴ| 青青久久av北条麻妃黑人| 8x8x成人免费视频| 黄色片网站在线| 日韩欧美在线一区二区三区| 中文字幕人妻一区二| 国产成人1区| 91情侣偷在线精品国产| 黄色大片免费观看| 中文字幕一区二区三区乱码在线 | 成人免费一级片| 136国产福利精品导航网址| 精品一区2区三区| 导航艳情国产电影| 婷婷成人综合网| 我不卡一区二区| 第四色中文综合网| 国产精品高清在线观看| 91蝌蚪视频九色| 中文字幕一区视频| 精品人妻一区二区三区日产| 亚洲欧美专区| 欧美孕妇毛茸茸xxxx| 国产亚洲精品久久久久久青梅| 97精品国产露脸对白| 最好看的中文字幕| 电影91久久久| 国产精选久久久久久| 99热在线观看免费| 色综合网色综合| 天天插天天操天天干| 亚洲福利久久| 欧美日韩午夜爽爽| 欧美xxx黑人xxx水蜜桃| 久久激情视频久久|