久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7646|回復: 4
打印 上一主題 下一主題
收起左側

STM32電阻檢測儀制作資料 含源碼(參加校賽作品分享)

[復制鏈接]
跳轉到指定樓層
樓主
參考正點原子的T9拼音輸入和輸入捕獲來做的測占空比和觸摸屏,通過被測電阻影響555定時器的產生的方波占空比來測量電阻,僅需要一個555定時器,不需要選擇電路,即可測量0-10M的電阻,并且精度能達到2%。在實際的制作中還有很多的注意事項,大家可以不斷摸索嘗試。

制作出來的實物圖如下:


電路原理圖如下:


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, 下載次數: 121)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:404837 發表于 2018-10-2 13:23 | 只看該作者
不錯不錯
回復

使用道具 舉報

板凳
ID:433680 發表于 2018-12-4 11:54 | 只看該作者
不錯不錯得! VERY good!
回復

使用道具 舉報

地板
ID:246896 發表于 2019-10-29 15:41 | 只看該作者
下載學習
回復

使用道具 舉報

5#
ID:637789 發表于 2019-11-7 22:23 | 只看該作者
太棒了吧
那個Xsc1是個啥
那個555VIRTUAL 是個啥
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品国产第一综合99久久 | 91素人 | 国产一级视频在线播放 | 一区二区三区影院 | 仙人掌旅馆在线观看 | 成人免费一区二区三区牛牛 | 精品亚洲一区二区三区 | 国产精品一二区 | 久久69精品久久久久久久电影好 | 97色综合 | 中文字幕国产一区 | 99视频网站| 奇米影视77 | 99久久婷婷国产综合精品电影 | 天天操,夜夜爽 | 雨宫琴音一区二区在线 | 二区视频 | 国产一区二区精品在线观看 | av大片在线观看 | 国产精品精品视频一区二区三区 | 日韩国产欧美一区 | 国产999精品久久久久久 | 久久久片| 久久精品国产久精国产 | 亚洲最新在线视频 | 精品久久久久一区二区国产 | 一区二区三区欧美在线 | 国产精品高清在线 | 亚洲九九色 | 国产精品久久久久久久免费观看 | 国产在线中文字幕 | 亚洲高清中文字幕 | 91黄色免费看 | 成人一区二区三区视频 | 免费a级毛片在线播放 | 国产91在线 | 亚洲 | 97caoporn国产免费人人 | 看a网站 | 日韩免费一区二区 | 久久久久久久久久久久久久国产 | 人人人干 |