1602.c
上传用户:jdm789308
上传日期:2020-12-22
资源大小:78k
文件大小:5k
源码类别:

软件测试

开发平台:

Visual C++

  1. #include <reg52.h>
  2. #include "1602.h"
  3. #define DataPort P0
  4. #define ADCPort P2
  5. #define uchar unsigned char
  6. sbit button_r=P1^0;
  7. sbit button_c=P1^1;
  8. sbit button_l=P1^2;
  9. sbit button_q=P1^3;
  10. sbit LED_R=P1^4;
  11. sbit LED_C=P1^5;
  12. sbit LED_L=P1^6;
  13. sbit LED_Q=P1^7;
  14. sbit RS=P3^0;
  15. sbit RW=P3^1;
  16. sbit EN=P3^2;
  17. sbit START=P3^7;
  18. unsigned char func;
  19. unsigned long int  R,C,L,f,y;
  20. uchar i=0;
  21. uchar aa,bb,cc;
  22. //uchar code aa[5]="free";
  23. uchar code meun[2][16]={"  is:   ","00000000      "};
  24. uchar code m[10]="0123456789";
  25. unsigned char T0count; 
  26. unsigned char timecount; 
  27. bit flag; 
  28. void Intar_T0T1(void)
  29.      {
  30.           flag=0; 
  31.           timecount=0; 
  32.           T0count=0; 
  33.           TH0=0; 
  34.           TL0=0; 
  35.           TR0=1;
  36.             TR1=1;
  37.             
  38. }
  39. void delay1(void)
  40. {
  41. int i;
  42. for(i=80;i>0;i--);
  43. }
  44. void delay_ms(uchar t)
  45. {
  46. unsigned char i=0;
  47. while(t--)for(i=0;i<120;i++);
  48. }
  49. void WriteData(uchar dat)
  50. {
  51. EN=0;
  52.    RS=0;             //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
  53.    RW=0;             //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
  54.    RS=1;
  55.    RW=0;
  56.    EN=1;
  57.    DataPort=dat;
  58.     EN=0;
  59.    RS=0;
  60.    RW=0;
  61.    for (i=0;i<20;i++);
  62. }
  63. void WriteCmd(uchar cmd)
  64. {
  65. EN=0;
  66.    RS=0;             //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
  67.    RW=0;             //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
  68.    EN=1;
  69.    DataPort=cmd;
  70.    RS=0;
  71.   RW=0;
  72.   EN=0;
  73.    for (i=0;i<20;i++);
  74. }
  75. void DisChar(uchar ps,uchar dat)
  76. {
  77. WriteCmd((0x80+ps));
  78. WriteData(dat);
  79. }
  80. void LcdInit(void)
  81. {
  82. char pp=0;
  83. WriteCmd(0x38);
  84.     delay_ms(5);
  85. WriteCmd(0x38);
  86.     delay_ms(5);
  87. WriteCmd(0x38);
  88.     delay_ms(5);
  89. WriteCmd(0x01);delay_ms(5);
  90. WriteCmd(0x06);delay_ms(5);
  91. WriteCmd(0x38);
  92. WriteCmd(0x0c); 
  93. WriteCmd(0x40);
  94. for(pp=0;pp<16;pp++)DisChar(pp,*(meun[0]+pp));
  95. for(pp=0;pp<16;pp++)DisChar(pp+0x40,*(meun[1]+pp)); 
  96. }
  97. void Display(unsigned long int x)
  98. {   DisChar(0,aa);
  99.     DisChar(9+0x40,bb);
  100.     DisChar(10+0x40,cc);
  101.     DisChar(7+0x40,m[x%10]);x /= 10;
  102. DisChar(6+0x40,m[x%10]);x /= 10;
  103. DisChar(5+0x40,m[x%10]);x /= 10;
  104. DisChar(4+0x40,m[x%10]);x /= 10;
  105. DisChar(3+0x40,m[x%10]);x /= 10;
  106. DisChar(2+0x40,m[x%10]);x /= 10;
  107. DisChar(1+0x40,m[x%10]);x /= 10;
  108. DisChar(0+0x40,m[x%10]);x /= 10;
  109. delay_ms(200);
  110. }
  111. button()
  112. {
  113. //button_r=1;
  114. if(button_r==0)
  115. {
  116.         func=1; //功能1:测电阻
  117.             LED_R=0;
  118.             LED_C=1;
  119.             LED_L=1;
  120.             LED_Q=1;
  121. }
  122.     //button_c=1;
  123. if(button_c==0)
  124. {
  125. func=2; //功能2:测电容
  126.             LED_R=1;
  127.             LED_C=0;
  128.             LED_L=1;
  129.             LED_Q=1;
  130.           }
  131.     //button_l=1;
  132. if(button_l==0)
  133. {
  134. func=3; //功能3:测电感
  135.             LED_R=1;
  136.             LED_C=1;
  137.             LED_L=0;
  138.             LED_Q=1; 
  139. }
  140.     if(button_q==0)
  141.          {
  142.             func=4; //功能3:测电感
  143.             LED_R=1;
  144.             LED_C=1;
  145.             LED_L=1;
  146.             LED_Q=0;
  147.            } 
  148.     return func;
  149. }
  150. void R_measure(void) //电阻测量,以Ω为单位
  151. {
  152. while(flag==0);
  153.     f=(T0count*65536+TH0*256+TL0); //Hz
  154.     //电阻计算公式
  155. R=721500000/f-10000;
  156.     y=R;
  157. }
  158. void C_measure(void) //电容测量,以pF为单位
  159. {
  160. while(flag==0);
  161.     f=(T0count*65536+TH0*256+TL0); //Hz
  162.     //电容计算公式
  163. C=4800000/f; //pf
  164.     y=C;
  165. }
  166. void L_measure(void) //电感测量,以uH为单位
  167. {
  168.     while(flag==0);
  169.     f=(T0count*65536+TH0*256+TL0); //Hz
  170. //电感计算公式
  171. f/=100000;
  172. L=922/(f*f); //L=922*10^10/(f*f)   uH
  173.     y=L;
  174. }
  175. unsigned int ADCTransform()
  176. {
  177. unsigned long int uiResult;
  178.     START=1;
  179.     START=0;
  180.     delay_ms(10);
  181.     uiResult=ADCPort;  //出入转换结果。
  182.     uiResult=(10000000*uiResult)/51;    //处理运算结果。
  183.     y=uiResult;
  184. }
  185. void main(void)
  186. {   TMOD=0x15;//0001 0101 
  187.    TH0=0; 
  188.    TL0=0; 
  189.    TH1=(65536-49989)/256; 
  190.    TL1=(65536-49989)%256; 
  191.    ET0=1; 
  192.    ET1=1;
  193.    EA=1;
  194.     TR1=1;
  195.    TR0=1;
  196.     y=0x00;
  197.     //ADCPort=51;
  198.    LcdInit();
  199.    // while(1);
  200.     /*while(1)
  201. {
  202. if(flag==1) 
  203.         { 
  204.           y=(T0count*65536+TH0*256+TL0);
  205.             Display(y);
  206.             flag=0; 
  207.           timecount=0; 
  208.           T0count=0; 
  209.           TH0=0; 
  210.           TL0=0; 
  211.           TR0=1;
  212.             TR1=1;
  213.         } 
  214. }*/
  215. while(1)
  216. {   
  217.          button();
  218.     if (func==1)
  219. {
  220.           aa='R';
  221.           bb='n';
  222.           cc='n';
  223.             R_measure();
  224.              
  225.   }
  226.   if (func==2)
  227.   {
  228.           aa='C';
  229.           bb='p';
  230.           cc='F';
  231.             C_measure();
  232.             }
  233.   if (func==3)
  234.   {
  235.           aa='L';
  236.           bb='u';
  237.           cc='H';
  238.             L_measure();
  239.   }
  240.        if(func==4)
  241.             {
  242.           aa='Q';
  243.           bb='n';
  244.           cc='n';
  245.             ADCTransform();
  246.             }
  247.           Display(y);
  248.           Intar_T0T1();
  249.  }
  250. }
  251. void t0(void) interrupt 1 using 0 //计脉冲个数
  252.   T0count++; 
  253. void t1(void) interrupt 3 using 0  //定时1s
  254.   TH1=(65536-50045)/256; 
  255.   TL1=(65536-50045)%256; 
  256.   timecount++; 
  257.     if(timecount==20) 
  258.     { 
  259.       TR0=0;
  260.       TR1=0;
  261.       timecount=0; 
  262.       flag=1;
  263.     } 
  264. }