找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6681|回复: 4
收起左侧

STM32电阻检测仪制作资料 含源码(参加校赛作品分享)

[复制链接]
ID:275479 发表于 2018-6-2 18:20 | 显示全部楼层 |阅读模式
参考正点原子的T9拼音输入和输入捕获来做的测占空比和触摸屏,通过被测电阻影响555定时器的产生的方波占空比来测量电阻,仅需要一个555定时器,不需要选择电路,即可测量0-10M的电阻,并且精度能达到2%。在实际的制作中还有很多的注意事项,大家可以不断摸索尝试。

制作出来的实物图如下:
UL3E[(}KEPI]ZIMC1NL8NX6.jpg NS1`2E50[_QE`@U~%)K_XM2.jpg

电路原理图如下:
-62641effcb942d15.png

STM32单片机源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"                           
  5. #include "lcd.h"  
  6. #include "key.h"      
  7. #include "malloc.h"
  8. #include "sdio_sdcard.h"  
  9. #include "w25qxx.h"   
  10. #include "ff.h"  
  11. #include "exfuns.h"   
  12. #include "text.h"  
  13. #include "pyinput.h"
  14. #include "touch.h"        
  15. #include "string.h"            
  16. #include "usmart.h"     
  17. #include "timer.h"
  18. #include <math.h>

  19. //数字表
  20. const u8* kbd_tbl[12]={"1","2","3","4","5","6","7","8","9",".","0","确认",};
  21. //字符表
  22. const u8* kbs_tbl[9]={" "," "," "," "," "," "," "," "," ",};

  23. u16 kbdxsize;        //虚拟键盘按键宽度
  24. u16 kbdysize;        //虚拟键盘按键高度


  25. extern u16  TIM5CH1_CAPTURE_STA;        //输入捕获状态                 
  26. extern u16  countH,countL;                                          
  27. extern u16        TIM5CH1_CAPTURE_VAL,TIM5CH1_CAPTURE_VAL1;        //输入捕获值        
  28. long double res,res1;
  29. long double x1,x2,x3,x4,x5,x6,x7;


  30. //加载键盘界面
  31. //x,y:界面起始坐标
  32. void py_load_ui(u16 x,u16 y)
  33. {
  34.         u16 i;
  35.         POINT_COLOR=RED;
  36.         LCD_DrawRectangle(x,y,x+kbdxsize*3,y+kbdysize*4);                                                   
  37.         LCD_DrawRectangle(x,y,x+kbdxsize*3,y+kbdysize*1);                                                   
  38.         LCD_DrawRectangle(x,y,x+kbdxsize*3,y+kbdysize*2);
  39.         LCD_DrawRectangle(x,y,x+kbdxsize*3,y+kbdysize*3);
  40.         LCD_DrawRectangle(x,y,x+kbdxsize*1,y+kbdysize*4);
  41.         LCD_DrawRectangle(x,y,x+kbdxsize*2,y+kbdysize*4);
  42.         POINT_COLOR=BLUE;
  43.         for(i=0;i<12;i++)
  44.         {
  45.                 Show_Str_Mid(x+(i%3)*kbdxsize,y+4+kbdysize*(i/3),(u8*)kbd_tbl[i],16,kbdxsize);               
  46. //                Show_Str_Mid(x+(i%3)*kbdxsize,y+kbdysize/2+kbdysize*(i/3),(u8*)kbs_tbl[i],16,kbdxsize);               
  47.         }                                                              
  48. }
  49. //按键状态设置
  50. //x,y:键盘坐标
  51. //key:键值(0~8)
  52. //sta:状态,0,松开;1,按下;
  53. void py_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
  54. {                  
  55.         u16 i=keyx/3,j=keyx%3;
  56.         printf("%d   %d  %d\r\n",keyx,i,j);
  57.         if(keyx>12)return;
  58.         if(sta)LCD_Fill(x+j*kbdxsize+1,y+i*kbdysize+1,x+j*kbdxsize+kbdxsize-1,y+i*kbdysize+kbdysize-1,GREEN);
  59.         else LCD_Fill(x+j*kbdxsize+1,y+i*kbdysize+1,x+j*kbdxsize+kbdxsize-1,y+i*kbdysize+kbdysize-1,WHITE);
  60.         Show_Str_Mid(x+j*kbdxsize,y+4+kbdysize*i,(u8*)kbd_tbl[keyx],16,kbdxsize);               
  61.         Show_Str_Mid(x+j*kbdxsize,y+kbdysize/2+kbdysize*i,(u8*)kbs_tbl[keyx],16,kbdxsize);                 
  62. }
  63. //得到触摸屏的输入
  64. //x,y:键盘坐标
  65. //返回值:按键键值(1~9有效;0,无效)
  66. u8 py_get_keynum(u16 x,u16 y)
  67. {
  68.         u16 i,j;
  69.         static u8 key_x=0;//0,没有任何按键按下;1~9,1~9号按键按下
  70.         u8 key=0;
  71.         tp_dev.scan(0);                  
  72.         if(tp_dev.sta&TP_PRES_DOWN)                        //触摸屏被按下
  73.         {        
  74.                 for(i=0;i<4;i++)
  75.                 {
  76.                         for(j=0;j<3;j++)
  77.                         {
  78.                                  if(tp_dev.x[0]<(x+j*kbdxsize+kbdxsize)&&tp_dev.x[0]>(x+j*kbdxsize)
  79.                                         &&tp_dev.y[0]<(y+i*kbdysize+kbdysize)&&tp_dev.y[0]>(y+i*kbdysize))
  80.                                 {        
  81.                                         key=i*3+j+1;         
  82.                                         break;                           
  83.                                 }
  84.                         }
  85.                         if(key)
  86.                         {           
  87.                                 if(key_x==key)key=0;
  88.                                 else
  89.                                 {
  90.                                         py_key_staset(x,y,key_x-1,0);
  91.                                         key_x=key;
  92.                                         py_key_staset(x,y,key_x-1,1);
  93.                                 }
  94.                                 break;
  95.                         }
  96.                 }  
  97.         }else if(key_x)
  98.         {
  99.                 py_key_staset(x,y,key_x-1,0);
  100.                 key_x=0;
  101.         }
  102. //        printf( "%d  \r\n",key_x);
  103.         return key;
  104. }
  105.                                                            
  106. //显示结果.
  107. //index:0,表示没有一个匹配的结果.清空之前的显示
  108. //   其他,索引号        
  109. void py_show_result(u8 index)
  110. {
  111.          LCD_ShowNum(30+144,125,index,1,16);                 //显示当前的索引
  112.         LCD_Fill(30+40,125,30+40+48,130+16,WHITE);        //清除之前的显示
  113.          LCD_Fill(30+40,145,lcddev.width,145+48,WHITE);//清除之前的显示   
  114.         if(index)
  115.         {
  116. //                 Show_Str(30+40,125,200,16,t9.pymb[index-1]->py,16,0);         //显示拼音
  117. //                Show_Str(30+40,145,lcddev.width-70,48,t9.pymb[index-1]->pymb,16,0);//显示对应的汉字
  118. //               
  119.         }
  120. }


  121. int main(void)
  122. {         
  123.          u16 i,flag;
  124.          u16 i1,j1;
  125.          u8 lcd_id[12];                        //存放LCD ID字符串
  126.          u8 buf[12]={0};
  127.          double temp=0, temp1=0;
  128. //                double f;
  129. long double duty,duty1,pingjun;                          
  130.         u8 result_num;
  131.         u8 cur_index;
  132.         u8 key;
  133.         u8 inputstr[7];                //最大输入6个字符+结束符
  134.         u8 inputlen;                //输入长度         
  135.         uart_init(115200);                 //串口初始化为115200
  136.         delay_init();                     //延时函数初始化         
  137.         LED_Init();                                          //初始化与LED连接的硬件接口        
  138.         KEY_Init();                                        //初始化按键
  139.         LCD_Init();                                           //初始化LCD         
  140.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  141.                  
  142.          TIM5_Cap_Init(0XFFFF,1-1);        //以72Mhz的频率计数
  143.          
  144.         
  145.         usmart_dev.init(72);                //初始化USMART

  146.    
  147.         W25QXX_Init();                                //初始化W25Q128
  148.         tp_dev.init();                                //初始化触摸屏
  149.          my_mem_init(SRAMIN);                //初始化内部内存池
  150.         exfuns_init();                                //为fatfs相关变量申请内存  
  151.          f_mount(fs[0],"0:",1);                 //挂载SD卡
  152.          f_mount(fs[1],"1:",1);                 //挂载FLASH.
  153.          POINT_COLOR=RED;      
  154.          while(font_init())                         //检查字库
  155.         {            
  156.                 LCD_ShowString(30,50,200,16,16,"Font Error!");
  157.                 delay_ms(200);                                 
  158.                 LCD_Fill(30,50,240,66,WHITE);//清除显示            
  159.         }
  160. RESTART:
  161.          POINT_COLOR=RED;      
  162.         Show_Str(30,5,200,16,"被测阻值大小:",16,0);                                             
  163.                              

  164.         Show_Str(30,65,200,16,"输入目标阻值:       ",16,0);
  165.          Show_Str(30,85,200,16,"输入目标误差:         ",16,0);

  166.         if(lcddev.id==0X5310){kbdxsize=86;kbdysize=43;}//根据LCD分辨率设置按键大小
  167.         else if(lcddev.id==0X5510||lcddev.id==0X1963){kbdxsize=140;kbdysize=70;}
  168.         else {kbdxsize=60;kbdysize=40;}
  169.         py_load_ui(30,150);
  170.         memset(inputstr,0,7);        //全部清零
  171.         inputlen=0;                                //输入长度为0
  172.         result_num=0;                        //总匹配数清零
  173.         cur_index=0;                        
  174.         

  175.         while(1)
  176.         {
  177.                
  178.                         
  179.                 for(i=0;i<30;i++)
  180.                 {
  181.                         tp_dev.scan(0);
  182.                 while((TIM5CH1_CAPTURE_STA&0X0400)==0&&(tp_dev.sta&TP_PRES_DOWN)==0)
  183.                 {
  184.                 }
  185.                  if(TIM5CH1_CAPTURE_STA&0X0400)//成功捕获到了一次上升沿
  186.                 {
  187.                         TIM_Cmd(TIM5,DISABLE );         //停止使能定时器5               
  188.                         temp=countH&0XFFFF;
  189.                         temp*=65536;//溢出时间总和
  190.                         temp+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间
  191.                         temp1=countL&0XFFFF;
  192.                         temp1*=65536;//溢出时间总和
  193.                         temp1+=TIM5CH1_CAPTURE_VAL1;//得到总的高电平时间
  194.                         duty=temp/(temp+temp1);        
  195.                         
  196.                         }
  197.                 pingjun=pingjun+duty;
  198.                 TIM5CH1_CAPTURE_STA=0x0000;//开启下一次捕获        
  199.     TIM_Cmd(TIM5,ENABLE );         //使能定时器5               
  200.                 countH=0;
  201.                 countL=0;         
  202.                                 if(duty>0.998)               
  203.                                 {
  204.                                 i=i+30;
  205.          pingjun=duty*30;                                       
  206.                                 }
  207.                                 
  208.                 }
  209.                 TIM_Cmd(TIM5,ENABLE );         //停止使能定时器5        
  210.                   duty1=pingjun/30;
  211.                 pingjun=0;
  212.                         x1=duty1;x2=duty1;x3=duty1;        x4=duty1;        x5=duty1;        x6=duty1;        x7=duty1;
  213.                         x1=pow(x1,1);x2=pow(x2,2);x3=pow(x3,3);x4=pow(x4,4);x5=pow(x5,5);
  214.                         x6=pow(x6,6);x7=pow(x7,7);                        
  215.                         POINT_COLOR=RED;
  216.                         if(0.5<duty1&&duty1<0.73)
  217.                         {
  218.                         res=  -14302041012.00000000000000000000 *x6
  219.                                 + 58769808162.38000000000000000000 *x5
  220.                                 - 100611696743.20400000000000000000* x4
  221.                                 + 91852454672.19220000000000000000 *x3
  222.                                 - 47163395469.91170000000000000000 *x2
  223.                                 + 12914204844.35510000000000000000 *x1
  224.                                 - 1473223936.77019000000000000000 ;
  225.                                 if(res<0)
  226.                                 {res=0;}
  227.                                 if(res<10&&res>0)
  228.                                 {
  229.                                 sprintf((char*)buf,"%s%.0f%s ","00",res,"         ohm   ");
  230.                                 }
  231.                                 
  232.                                 else if(res>10&&res<100)
  233.                                 {sprintf((char*)buf,"%.1f%s ",res,"         ohm   ");}
  234.                                 else
  235.                                 sprintf((char*)buf,"%.0f%s ",res,"           ohm   ");//将LCD ID打印到lcd_id数组。               
  236.                         }
  237.                         
  238.                                 else if(0.73<duty1&&duty1<0.88)
  239.                         {
  240.                                 x1=duty1;x2=duty1;x3=duty1;        x4=duty1;        x5=duty1;        x6=duty1;        x7=duty1;
  241.                         x1=pow(x1,1);x2=pow(x2,2);x3=pow(x3,3);x4=pow(x4,4);x5=pow(x5,5);
  242.                         x6=pow(x6,6);x7=pow(x7,7);
  243.                                 res= 50576272.31250000000000000000* x6
  244.                                 - 253686059.69843800000000000000 *x5 +
  245.                                 528819351.78510700000000000000 *x4 -
  246.                                 586296731.32720000000000000000 *x3 +
  247.                                 364607758.57319900000000000000 *x2 -
  248.                                 120587778.49805700000000000000* x1 +
  249.                                 16570759.99618540000000000000 ;     
  250.                                 if(res>930&&res<1000)
  251.                                 res+=6;        
  252.                                 sprintf((char*)buf,"%.0f%s ",res,"          ohm   ");
  253.                                 if(res>=1000)
  254.                                 {
  255.                                         res=res/1000;
  256.                                         sprintf((char*)buf,"%.2f%s ",res,"    K  ohm   ");
  257.                                 }
  258.                         }
  259.                         else if(0.88<duty1&&duty1<0.985)
  260.                         {
  261.                                 res = 9886588.40917969000000000000
  262.                                 *x6 - 54523063.81499820000000000000 *x5
  263.                                 + 125263597.49274900000000000000 *x4
  264.                                 - 153457525.82975900000000000000 *x3
  265.                                 + 105728501.67596900000000000000 *x2
  266.                                 - 38842842.27736880000000000000 *x1 +
  267.                                 5944747.37332069000000000000 ;
  268.                                 res=res*10;
  269.                                  if(res>10&&res<100)
  270.                                          sprintf((char*)buf,"%.1f%s ",res,"    K  ohm   ");
  271.                                  else
  272.          sprintf((char*)buf,"%.2f%s ",res,"    K  ohm   ");
  273.                         }                        
  274.                         else if(0.9850<duty1&&duty1<0.9980)
  275.                         {
  276.                                 res   = 80085557347.37500000000000000000 *x5
  277.                                 - 395505919886.63800000000000000000 *x4
  278.                                 + 781284983275.76300000000000000000 *x3
  279.                                 - 771673654310.73900000000000000000 *x2
  280.                                 + 381088259432.87600000000000000000 *x1
  281.                                 - 75279225837.53090000000000000000 ;
  282.         res=res*10;
  283.                                 if(res>20&&res<25)
  284.                                 {res=res-1;}
  285.                                 if(res>30&&res<40)
  286.                                 {res=res+1;}
  287.                                 if(res>55&&res<58)
  288.                                 {res=res-1;}
  289.                                 if(res>58&&res<87)
  290.                                 {res=res-2;}
  291.         if(res>87&&res<92)
  292.                                 {res=res-1;}
  293.                                 printf( "%d  \r\n",duty1);
  294.                                 printf( "%d  \r\n",res);
  295.         sprintf((char*)buf,"%.1f%s ",res,"    K  ohm   ");
  296.                         }
  297.                         else if(duty1>0.9980)
  298.                         {
  299.                                 duty1=duty1*1000-999;
  300.                         x1=duty1;
  301.                         x2=duty1;
  302.                         x3=duty1;
  303.                         x4=duty1;
  304.                         x5=duty1;
  305.                         x6=duty1;
  306.                         x7=duty1;
  307.                         x1=pow(x1,1);x2=pow(x2,2);x3=pow(x3,3);x4=pow(x4,4);x5=pow(x5,5);
  308.                         x6=pow(x6,6);x7=pow(x7,7);
  309.                                 res = 451698.02975654600000000000 *x5
  310.                                 - 1949941.77138209000000000000 *x4
  311.                                 + 3364145.37781321000000000000* x3
  312.                                 - 2899364.16821244000000000000* x2
  313.                                 + 1248232.03533619000000000000* x1
  314.                                 - 214750.16957818900000000000 ;
  315.          sprintf((char*)buf,"%.2f%s ",res,"    M  ohm   ");
  316.                         }                                                                                                         
  317.                
  318.   

  319.                 key=py_get_keynum(30,150);
  320.                 if(key)
  321.                 {
  322.                         if(key==1)//删除
  323.                         {
  324.                                 if(inputlen)inputlen--;
  325.                                 inputstr[inputlen]='\0';//添加结束符
  326.                         }else
  327.                         {
  328.                                 inputstr[inputlen]=key+'0';//输入字符
  329.                                 if(inputlen<7)inputlen++;
  330.                         }
  331.                         if(inputstr[0]!=NULL)
  332.                         {
  333.                                 key=t9.getpymb(inputstr);        //得到匹配的结果数
  334.                                 if(key)//有部分匹配/完全匹配的结果
  335.                                 {
  336.                                         result_num=key&0X7F;        //总匹配结果
  337.                                         cur_index=1;                        //当前为第一个索引
  338.                                         if(key&0X80)                           //是部分匹配
  339.                                         {
  340.                                                 inputlen=key&0X7F;        //有效匹配位数
  341.                                                 inputstr[inputlen]='\0';//不匹配的位数去掉
  342.                                                 if(inputlen>1)result_num=t9.getpymb(inputstr);//重新获取完全匹配字符数
  343.                                         }  
  344.                                 }else                                                 //没有任何匹配
  345.                                 {                                          
  346.                                         inputlen--;
  347.                                         inputstr[inputlen]='\0';
  348.                                 }
  349.                         }else
  350.                         {
  351.                                 cur_index=0;
  352.                                 result_num=0;
  353.                         }
  354. //                        LCD_Fill(30+40,105,30+40+48,110+16,WHITE);        //清除之前的显示
  355. //                        LCD_ShowNum(30+144,105,result_num,1,16);         //显示匹配的结果数
  356. //                        Show_Str(30+40,105,200,16,inputstr,16,0);        //显示有效的数字串                 
  357. //                         py_show_result(cur_index);                                        //显示第cur_index的匹配结果
  358.                 }         
  359.                 key=KEY_Scan(0);

  360.                 if(result_num)        //存在匹配的结果        
  361.                 {        
  362.                         switch(key)
  363.                         {
  364.                                  case KEY1_PRES://下翻
  365.                                            if(cur_index>1)cur_index--;
  366.                                         else cur_index=result_num;
  367.                                         py_show_result(cur_index);        //显示第cur_index的匹配结果
  368.                                         break;
  369.                                 case KEY0_PRES://清除输入
  370.                                          LCD_Fill(30+40,145,lcddev.width,145+48,WHITE);        //清除之前的显示   
  371.                                         goto RESTART;                                                     
  372.                         }            
  373.                 }
  374.                 LCD_ShowString(30,35,210,24,24, (u8 *)buf);
  375.                 TIM5CH1_CAPTURE_STA=0x0000;//开启下一次捕获        

  376.     TIM_Cmd(TIM5,ENABLE );         //使能定时器5               
  377.                 countH=0;
  378.                 countL=0;        

  379.   }                                                                                                                                                      
  380. }
复制代码

全部资料51hei下载地址:
电阻检测.rar (1.83 MB, 下载次数: 119)

评分

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

查看全部评分

回复

使用道具 举报

ID:404837 发表于 2018-10-2 13:23 | 显示全部楼层
不错不错
回复

使用道具 举报

ID:433680 发表于 2018-12-4 11:54 | 显示全部楼层
不错不错得! VERY good!
回复

使用道具 举报

ID:246896 发表于 2019-10-29 15:41 | 显示全部楼层
下载学习
回复

使用道具 举报

ID:637789 发表于 2019-11-7 22:23 | 显示全部楼层
太棒了吧
那个Xsc1是个啥
那个555VIRTUAL 是个啥
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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