找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6028|回复: 13
打印 上一主题 下一主题
收起左侧

单片机LRC万用表表制作程序+PCB文件

  [复制链接]
跳转到指定楼层
楼主
希望可以帮助你们


Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned        int
  4. #define C1  0.045

  5. uchar code WenDu1[]="数\xfd字万用表   ";
  6. uchar code WenDu2[]="欢迎使用        ";
  7. uchar code code_L[]="电感:          ";        
  8. uchar code code_R[]="电阻:          ";
  9. uchar code code_C[]="电容:          ";
  10. uchar code code_e[]="错误:          ";
  11. uchar  num;


  12. sbit key1  =P1^0;
  13. sbit key2  =P1^1;
  14. sbit key3  =P1^2;
  15. //unsigned long LZ=0;
  16. //float f=0;

  17. float LZ=0;
  18. float RX=0;
  19. float CX=0;

  20. float f=0;

  21. float temp_f[4];

  22. unsigned int tt,th1,tl1;
  23. unsigned int pluse=0;        
  24. bit flag=0;        
  25. unsigned char key_num=0;

  26. #define  L 1
  27. #define  R 2
  28. #define  C 3

  29. sbit aa1 =P2^0;
  30. sbit bb1 =P2^1;

  31. #include<Lcd12864.h>

  32. void cd4051(unsigned char num)
  33. {
  34.                 switch(num){
  35.                                 case 1: bb1=0;aa1=0;break;
  36.                                 case 2: bb1=0;aa1=1; break;
  37.                                 case 3: bb1=1;aa1=0; break;
  38.                                 default : aa1=1;aa1=1;break;
  39.                 }
  40. }

  41. void scan_key()
  42. {
  43.                 if(!key1){
  44.                                 if(!key1){
  45.                                                 while(!key1);
  46.                                                 key_num=1;
  47.                                                 cd4051(L);
  48.                                         //        aa1=0;bb1=0;
  49.                                             Lcd_ShowSring(4,0,code_L);
  50.                                                 Lcd_ShowSring(1,15,"L");
  51.                                 }
  52.                 }
  53.                 if(!key2){
  54.                                 if(!key2){
  55.                                                 while(!key2);
  56.                                                 key_num=2;
  57.                                                 cd4051(R);
  58.                                         //aa1=0;bb1=1;
  59.                                                 Lcd_ShowSring(4,0,code_R);
  60.                                                 Lcd_ShowSring(1,15,"R");
  61.                                 }
  62.                 }
  63.                 if(!key3){
  64.                                 if(!key3){
  65.                                                 while(!key3);
  66.                                                 key_num=3;
  67.                                                 cd4051(C);
  68.                                            //aa1=1;bb1=0;
  69.                                                 Lcd_ShowSring(4,0,code_C);
  70.                                                 Lcd_ShowSring(1,15,"C");
  71.                                 }
  72.                 }
  73. }


  74.         //中断初始化
  75.   void init()
  76.   {         
  77. //        TMOD=0x11;                //定时器0和定时器1都是方式1,16位定时器

  78.         //定时器设置
  79.     TMOD=0x51;                 //设置定时器0,方式1:16位定时器

  80.         TH1=0x00;         //定时器1高位装初值
  81.         TL1=0x00;         //定时器1低位装初值
  82.         ET1=1;        //定时器1          使能位
  83.         
  84.         TH0=(65535-50000)/255;          //定时器1高位装初值
  85.         TL0=(65535-50000)%255;;          //定时器1高位装初值
  86.         ET0=1;   ////定时器0          使能位

  87.         TR0=1;
  88.         TR1=1;

  89.         EA=1;//        总中断
  90. }

  91. void Measurement_L();//电感测量
  92. void Measurement_R();//电阻测量
  93. void Measurement_C();//电容测量
  94. unsigned char gather_num=0;
  95. unsigned char m_second=0;
  96. void main ()
  97. {

  98.         LCDInit();               
  99.         Lcd_ShowSring(1,0,WenDu1);
  100.         Lcd_ShowSring(2,0,WenDu2);
  101. //        Lcd_ShowSring(4,0,code_R);
  102.         init();
  103. //        cd4051(R);
  104. //        key_num=2;
  105.         while(1){
  106.                
  107.                
  108.             scan_key();
  109.                 if(flag){
  110.                         flag=0;

  111.                         //在十ms里面记了这么多个脉冲
  112.                         // 那么一个脉冲的周期就是  50ms/tt/1000  (s)   化简得到  f  20tt
  113.                         if(gather_num<4) {
  114.                                         temp_f[gather_num]=pluse*65536+256*TH1+TL1;          //1000000000000 12  100000000 8
  115.                                         gather_num++;

  116.                         }
  117.                         else{
  118.                                         gather_num=0;
  119.                                         f=(temp_f[0]+temp_f[1]+temp_f[2]+temp_f[3])/4.0;        
  120.                                 //        Lcd_Display(3,0,f);
  121.                                         switch(key_num)         {
  122.                
  123.                                                         case 1:Measurement_L();        break;
  124.                                                         case 2:Measurement_R(); break;
  125.                                                         case 3:Measurement_C(); break;
  126.                                                         default :break;
  127.                                        
  128.                                         }
  129.                         }
  130.         


  131.                         TH0=(65535-50000)/255;          //定时器1高位装初值
  132.                         TL0=(65535-50000)%255;;          //定时器1高位装初值                                                
  133.                         TH1=0;                          //清零开始重新计数
  134.                         TL1=0;
  135.                         pluse=0;
  136.                         TR0=1;//开定时器计时10ms;//使能位外部中断0 数10内有多少个脉冲
  137.                         TR1=1;//进行新一轮的计数
  138.                         m_second=0;        
  139.                         
  140.                              
  141. //                    num++;
  142. //                        Lcd_Display(4,4,num);
  143.                 }
  144.                                                                         
  145.         }
  146. }


  147. void time0()interrupt 1                //定时器0 服务
  148. {        
  149. //        TR1=0;//关掉定时器1

  150.         
  151. //        TH0=(65535-50000)/255;          //定时器1高位装初值
  152. //        TL0=(65535-50000)%255;;          //定时器1高位装初值 */
  153.         TH0=60;          //定时器1高位装初值
  154.         TL0=235;;          //定时器1高位装初值
  155.         m_second++;
  156.         if(m_second==20){
  157.                         TR1=0;//关掉定时器1
  158.                         TR0=0; // 关掉定时器0
  159.                 m_second=0;        
  160.                 flag=1;
  161.         }
  162.                         
  163. }

  164. void time1()interrupt 3                //定时器1 服务
  165. {
  166.                    pluse++;
  167.                 TH1=0;
  168.                 TL1=0;
  169. }

  170. void Measurement_L()
  171. {

  172.                         if(f==0){
  173.                                 LZ=0;
  174.                                 Lcd_ShowSring(4,0,code_L);
  175.                         }
  176.                         else {
  177.                                 LZ=5.63466627*10e10/f/f;
  178.                                 LZ=LZ/1.0727272727272727272727272727273;
  179.                                 Lcd_ShowSring(4,0,"电感:");
  180.                           Lcd_Display_u(4,4,LZ);
  181.                         }
  182.                         
  183.                         if(LZ>99999999)        {
  184.                         //         Lcd_ShowSring(4,0,code_e);
  185.                         }
  186.                                                                                                                                                                   
  187.                         
  188.         
  189. }
  190. void Measurement_R()//电阻测量
  191. {
  192.                         
  193.                         if(f==0){
  194.                                                         
  195.                                         RX=0;        
  196.                                                 
  197.                         }

  198.                         else if(  0< f&& f<30) {                                                                   //1M   7

  199.                                            RX=        14400000.0/f;
  200.                                         RX= RX-3000;
  201.                                         RX  =RX/2/0.95;  //修正
  202.                                        
  203.                         }
  204.                         else if(f <700) {                                                                   //10k   650

  205.                                            RX=        14400000.0/f;
  206.                                         RX= RX-3000;
  207.                                         RX  =RX/2/0.95;  //修正
  208.                                          //
  209.                         }
  210.                         else if(f <1500) {                                                                   //4.7k  1209

  211.                                            RX=        14400000.0/f;
  212.                                         RX= RX-3000;
  213.                                         RX  =RX/2/0.94;  //修正
  214.                                        
  215.                         }
  216.                          else if(f <3000) {                                                                 //1k        2983

  217.                                            RX=        14400000.0/f;
  218.                                         RX= RX-3000;
  219.                                          RX  =RX/2/0.91;  //修正
  220.                                         //0.91286863270777479892761394101877
  221.                                        
  222.                         }
  223.                         else if(f <4500) {

  224.                                            RX=        14400000.0/f;
  225.                                         RX= RX-3000;
  226.                                                                                 //修正  200   4372
  227.                                         RX  =RX/2/0.74;  //修正
  228.                                        
  229.                         }
  230.                         else if(f <5000) {

  231.                                            RX=        14400000.0/f;
  232.                                         RX= RX-3000;
  233.                                                                                 //修正  100  
  234.                                         RX  =RX/2/0.50;  //修正
  235.                                        
  236.                         }

  237.                         if(RX==0){
  238.                                         Lcd_ShowSring(4,0,code_R);
  239.                         } else{
  240.                                         Lcd_ShowSring(4,0,"电阻:");
  241.                                         Value_to_ASCII1(4,3, RX);

  242.                         }

  243.                         if(RX>99999999)        {
  244.                         //        Lcd_ShowSring(4,0,code_e);        
  245.                         }
  246.                                                         
  247.                
  248. }
  249. void Measurement_C()//C测量
  250. {
  251.                         if(f==0){
  252.                                                         
  253.                                         CX=0;
  254.                                         Lcd_ShowSring(4,0,code_C);                        
  255.                         }
  256.                         else if(f>5000){

  257.                                    CX=0;
  258.                                    Lcd_ShowSring(4,0,code_C);
  259.                         }
  260.                         else {
  261.                                 CX=48100.00/f/1.0276595744680851063829787234043;//修正        
  262.                                 Lcd_ShowSring(4,0,"电容:");
  263.                             Value_to_ASCIIC(4,3,CX);                                       
  264.                         }
  265. //                        Lcd_ShowSring(4,0,"电容:");
  266. //                        Value_to_ASCIIC(4,3,CX);                                
  267.                         if(CX>99999999)        {
  268. //                                Lcd_ShowSring(4,0,code_e);        
  269.                         }
  270.                         
  271. }
复制代码

所有资料51hei提供下载:
程序.7z (1.16 MB, 下载次数: 144)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏20 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:770983 发表于 2020-7-17 09:36 | 只看该作者
这个屏是什么型号啊?
回复

使用道具 举报

板凳
ID:228467 发表于 2020-7-17 10:17 | 只看该作者
CHENGLCD 发表于 2020-7-17 09:36
这个屏是什么型号啊?

应该就是普通的12864屏吧
回复

使用道具 举报

地板
ID:603592 发表于 2020-7-17 12:19 | 只看该作者
两个PCB 下面的是什么的
回复

使用道具 举报

5#
ID:804703 发表于 2020-7-17 13:31 | 只看该作者
这个屏是什么型号啊?
回复

使用道具 举报

6#
ID:25481 发表于 2020-7-18 08:15 | 只看该作者
ST7920串口12864,带字库。
回复

使用道具 举报

7#
ID:690831 发表于 2020-7-18 13:38 | 只看该作者
测频率,计算LCR值吗
回复

使用道具 举报

8#
ID:795427 发表于 2022-1-16 11:12 | 只看该作者
虽然没有电容的ESR值测量,但是还是很不错的。
回复

使用道具 举报

9#
ID:655665 发表于 2022-1-16 14:56 | 只看该作者
电感 电容  电阻的测量范围是多少?
回复

使用道具 举报

10#
ID:969272 发表于 2022-1-17 18:43 | 只看该作者
这个表准确吗?
回复

使用道具 举报

11#
ID:1016543 发表于 2022-4-8 11:55 | 只看该作者
范围是多少啊大佬,我是小白
回复

使用道具 举报

12#
ID:1016543 发表于 2022-4-8 12:00 | 只看该作者
我在东北玩51 发表于 2020-7-17 12:19
两个PCB 下面的是什么的

背面走线。。。。。
回复

使用道具 举报

13#
ID:228452 发表于 2022-4-11 22:23 | 只看该作者
What is the value of inductor LX1 ?
Thanks for the code
回复

使用道具 举报

14#
ID:67185 发表于 2022-11-30 12:11 | 只看该作者
这不是电桥原理吧!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表