參考正點原子的T9拼音輸入和輸入捕獲來做的測占空比和觸摸屏,通過被測電阻影響555定時器的產生的方波占空比來測量電阻,僅需要一個555定時器,不需要選擇電路,即可測量0-10M的電阻,并且精度能達到2%。在實際的制作中還有很多的注意事項,大家可以不斷摸索嘗試。
制作出來的實物圖如下:
UL3E[(}KEPI]ZIMC1NL8NX6.jpg (214.25 KB, 下載次數: 79)
下載附件
2018-6-2 18:15 上傳
NS1`2E50[_QE`@U~%)K_XM2.jpg (190.32 KB, 下載次數: 75)
下載附件
2018-6-2 18:15 上傳
電路原理圖如下:
-62641effcb942d15.png (10.59 KB, 下載次數: 90)
下載附件
2018-6-2 18:15 上傳
STM32單片機源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "lcd.h"
- #include "key.h"
- #include "malloc.h"
- #include "sdio_sdcard.h"
- #include "w25qxx.h"
- #include "ff.h"
- #include "exfuns.h"
- #include "text.h"
- #include "pyinput.h"
- #include "touch.h"
- #include "string.h"
- #include "usmart.h"
- #include "timer.h"
- #include <math.h>
-
- //數字表
- const u8* kbd_tbl[12]={"1","2","3","4","5","6","7","8","9",".","0","確認",};
- //字符表
- const u8* kbs_tbl[9]={" "," "," "," "," "," "," "," "," ",};
- u16 kbdxsize; //虛擬鍵盤按鍵寬度
- u16 kbdysize; //虛擬鍵盤按鍵高度
- extern u16 TIM5CH1_CAPTURE_STA; //輸入捕獲狀態
- extern u16 countH,countL;
- extern u16 TIM5CH1_CAPTURE_VAL,TIM5CH1_CAPTURE_VAL1; //輸入捕獲值
- long double res,res1;
- long double x1,x2,x3,x4,x5,x6,x7;
- //加載鍵盤界面
- //x,y:界面起始坐標
- void py_load_ui(u16 x,u16 y)
- {
- u16 i;
- POINT_COLOR=RED;
- LCD_DrawRectangle(x,y,x+kbdxsize*3,y+kbdysize*4);
- LCD_DrawRectangle(x,y,x+kbdxsize*3,y+kbdysize*1);
- LCD_DrawRectangle(x,y,x+kbdxsize*3,y+kbdysize*2);
- LCD_DrawRectangle(x,y,x+kbdxsize*3,y+kbdysize*3);
- LCD_DrawRectangle(x,y,x+kbdxsize*1,y+kbdysize*4);
- LCD_DrawRectangle(x,y,x+kbdxsize*2,y+kbdysize*4);
- POINT_COLOR=BLUE;
- for(i=0;i<12;i++)
- {
- Show_Str_Mid(x+(i%3)*kbdxsize,y+4+kbdysize*(i/3),(u8*)kbd_tbl[i],16,kbdxsize);
- // Show_Str_Mid(x+(i%3)*kbdxsize,y+kbdysize/2+kbdysize*(i/3),(u8*)kbs_tbl[i],16,kbdxsize);
- }
- }
- //按鍵狀態設置
- //x,y:鍵盤坐標
- //key:鍵值(0~8)
- //sta:狀態,0,松開;1,按下;
- void py_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
- {
- u16 i=keyx/3,j=keyx%3;
- printf("%d %d %d\r\n",keyx,i,j);
- if(keyx>12)return;
- if(sta)LCD_Fill(x+j*kbdxsize+1,y+i*kbdysize+1,x+j*kbdxsize+kbdxsize-1,y+i*kbdysize+kbdysize-1,GREEN);
- else LCD_Fill(x+j*kbdxsize+1,y+i*kbdysize+1,x+j*kbdxsize+kbdxsize-1,y+i*kbdysize+kbdysize-1,WHITE);
- Show_Str_Mid(x+j*kbdxsize,y+4+kbdysize*i,(u8*)kbd_tbl[keyx],16,kbdxsize);
- Show_Str_Mid(x+j*kbdxsize,y+kbdysize/2+kbdysize*i,(u8*)kbs_tbl[keyx],16,kbdxsize);
- }
- //得到觸摸屏的輸入
- //x,y:鍵盤坐標
- //返回值:按鍵鍵值(1~9有效;0,無效)
- u8 py_get_keynum(u16 x,u16 y)
- {
- u16 i,j;
- static u8 key_x=0;//0,沒有任何按鍵按下;1~9,1~9號按鍵按下
- u8 key=0;
- tp_dev.scan(0);
- if(tp_dev.sta&TP_PRES_DOWN) //觸摸屏被按下
- {
- for(i=0;i<4;i++)
- {
- for(j=0;j<3;j++)
- {
- if(tp_dev.x[0]<(x+j*kbdxsize+kbdxsize)&&tp_dev.x[0]>(x+j*kbdxsize)
- &&tp_dev.y[0]<(y+i*kbdysize+kbdysize)&&tp_dev.y[0]>(y+i*kbdysize))
- {
- key=i*3+j+1;
- break;
- }
- }
- if(key)
- {
- if(key_x==key)key=0;
- else
- {
- py_key_staset(x,y,key_x-1,0);
- key_x=key;
- py_key_staset(x,y,key_x-1,1);
- }
- break;
- }
- }
- }else if(key_x)
- {
- py_key_staset(x,y,key_x-1,0);
- key_x=0;
- }
- // printf( "%d \r\n",key_x);
- return key;
- }
-
- //顯示結果.
- //index:0,表示沒有一個匹配的結果.清空之前的顯示
- // 其他,索引號
- void py_show_result(u8 index)
- {
- LCD_ShowNum(30+144,125,index,1,16); //顯示當前的索引
- LCD_Fill(30+40,125,30+40+48,130+16,WHITE); //清除之前的顯示
- LCD_Fill(30+40,145,lcddev.width,145+48,WHITE);//清除之前的顯示
- if(index)
- {
- // Show_Str(30+40,125,200,16,t9.pymb[index-1]->py,16,0); //顯示拼音
- // Show_Str(30+40,145,lcddev.width-70,48,t9.pymb[index-1]->pymb,16,0);//顯示對應的漢字
- //
- }
- }
- int main(void)
- {
- u16 i,flag;
- u16 i1,j1;
- u8 lcd_id[12]; //存放LCD ID字符串
- u8 buf[12]={0};
- double temp=0, temp1=0;
- // double f;
- long double duty,duty1,pingjun;
- u8 result_num;
- u8 cur_index;
- u8 key;
- u8 inputstr[7]; //最大輸入6個字符+結束符
- u8 inputlen; //輸入長度
- uart_init(115200); //串口初始化為115200
- delay_init(); //延時函數初始化
- LED_Init(); //初始化與LED連接的硬件接口
- KEY_Init(); //初始化按鍵
- LCD_Init(); //初始化LCD
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
-
- TIM5_Cap_Init(0XFFFF,1-1); //以72Mhz的頻率計數
-
-
- usmart_dev.init(72); //初始化USMART
-
-
- W25QXX_Init(); //初始化W25Q128
- tp_dev.init(); //初始化觸摸屏
- my_mem_init(SRAMIN); //初始化內部內存池
- exfuns_init(); //為fatfs相關變量申請內存
- f_mount(fs[0],"0:",1); //掛載SD卡
- f_mount(fs[1],"1:",1); //掛載FLASH.
- POINT_COLOR=RED;
- while(font_init()) //檢查字庫
- {
- LCD_ShowString(30,50,200,16,16,"Font Error!");
- delay_ms(200);
- LCD_Fill(30,50,240,66,WHITE);//清除顯示
- }
- RESTART:
- POINT_COLOR=RED;
- Show_Str(30,5,200,16,"被測阻值大小:",16,0);
-
- Show_Str(30,65,200,16,"輸入目標阻值: ",16,0);
- Show_Str(30,85,200,16,"輸入目標誤差: ",16,0);
- if(lcddev.id==0X5310){kbdxsize=86;kbdysize=43;}//根據LCD分辨率設置按鍵大小
- else if(lcddev.id==0X5510||lcddev.id==0X1963){kbdxsize=140;kbdysize=70;}
- else {kbdxsize=60;kbdysize=40;}
- py_load_ui(30,150);
- memset(inputstr,0,7); //全部清零
- inputlen=0; //輸入長度為0
- result_num=0; //總匹配數清零
- cur_index=0;
-
- while(1)
- {
-
-
- for(i=0;i<30;i++)
- {
- tp_dev.scan(0);
- while((TIM5CH1_CAPTURE_STA&0X0400)==0&&(tp_dev.sta&TP_PRES_DOWN)==0)
- {
- }
- if(TIM5CH1_CAPTURE_STA&0X0400)//成功捕獲到了一次上升沿
- {
- TIM_Cmd(TIM5,DISABLE ); //停止使能定時器5
- temp=countH&0XFFFF;
- temp*=65536;//溢出時間總和
- temp+=TIM5CH1_CAPTURE_VAL;//得到總的高電平時間
- temp1=countL&0XFFFF;
- temp1*=65536;//溢出時間總和
- temp1+=TIM5CH1_CAPTURE_VAL1;//得到總的高電平時間
- duty=temp/(temp+temp1);
-
- }
- pingjun=pingjun+duty;
- TIM5CH1_CAPTURE_STA=0x0000;//開啟下一次捕獲
- TIM_Cmd(TIM5,ENABLE ); //使能定時器5
- countH=0;
- countL=0;
- if(duty>0.998)
- {
- i=i+30;
- pingjun=duty*30;
- }
-
- }
- TIM_Cmd(TIM5,ENABLE ); //停止使能定時器5
- duty1=pingjun/30;
- pingjun=0;
- x1=duty1;x2=duty1;x3=duty1; x4=duty1; x5=duty1; x6=duty1; x7=duty1;
- x1=pow(x1,1);x2=pow(x2,2);x3=pow(x3,3);x4=pow(x4,4);x5=pow(x5,5);
- x6=pow(x6,6);x7=pow(x7,7);
- POINT_COLOR=RED;
- if(0.5<duty1&&duty1<0.73)
- {
- res= -14302041012.00000000000000000000 *x6
- + 58769808162.38000000000000000000 *x5
- - 100611696743.20400000000000000000* x4
- + 91852454672.19220000000000000000 *x3
- - 47163395469.91170000000000000000 *x2
- + 12914204844.35510000000000000000 *x1
- - 1473223936.77019000000000000000 ;
- if(res<0)
- {res=0;}
- if(res<10&&res>0)
- {
- sprintf((char*)buf,"%s%.0f%s ","00",res," ohm ");
- }
-
- else if(res>10&&res<100)
- {sprintf((char*)buf,"%.1f%s ",res," ohm ");}
- else
- sprintf((char*)buf,"%.0f%s ",res," ohm ");//將LCD ID打印到lcd_id數組。
- }
-
- else if(0.73<duty1&&duty1<0.88)
- {
- x1=duty1;x2=duty1;x3=duty1; x4=duty1; x5=duty1; x6=duty1; x7=duty1;
- x1=pow(x1,1);x2=pow(x2,2);x3=pow(x3,3);x4=pow(x4,4);x5=pow(x5,5);
- x6=pow(x6,6);x7=pow(x7,7);
- res= 50576272.31250000000000000000* x6
- - 253686059.69843800000000000000 *x5 +
- 528819351.78510700000000000000 *x4 -
- 586296731.32720000000000000000 *x3 +
- 364607758.57319900000000000000 *x2 -
- 120587778.49805700000000000000* x1 +
- 16570759.99618540000000000000 ;
- if(res>930&&res<1000)
- res+=6;
- sprintf((char*)buf,"%.0f%s ",res," ohm ");
- if(res>=1000)
- {
- res=res/1000;
- sprintf((char*)buf,"%.2f%s ",res," K ohm ");
- }
- }
- else if(0.88<duty1&&duty1<0.985)
- {
- res = 9886588.40917969000000000000
- *x6 - 54523063.81499820000000000000 *x5
- + 125263597.49274900000000000000 *x4
- - 153457525.82975900000000000000 *x3
- + 105728501.67596900000000000000 *x2
- - 38842842.27736880000000000000 *x1 +
- 5944747.37332069000000000000 ;
- res=res*10;
- if(res>10&&res<100)
- sprintf((char*)buf,"%.1f%s ",res," K ohm ");
- else
- sprintf((char*)buf,"%.2f%s ",res," K ohm ");
- }
- else if(0.9850<duty1&&duty1<0.9980)
- {
- res = 80085557347.37500000000000000000 *x5
- - 395505919886.63800000000000000000 *x4
- + 781284983275.76300000000000000000 *x3
- - 771673654310.73900000000000000000 *x2
- + 381088259432.87600000000000000000 *x1
- - 75279225837.53090000000000000000 ;
- res=res*10;
- if(res>20&&res<25)
- {res=res-1;}
- if(res>30&&res<40)
- {res=res+1;}
- if(res>55&&res<58)
- {res=res-1;}
- if(res>58&&res<87)
- {res=res-2;}
- if(res>87&&res<92)
- {res=res-1;}
- printf( "%d \r\n",duty1);
- printf( "%d \r\n",res);
- sprintf((char*)buf,"%.1f%s ",res," K ohm ");
- }
- else if(duty1>0.9980)
- {
- duty1=duty1*1000-999;
- x1=duty1;
- x2=duty1;
- x3=duty1;
- x4=duty1;
- x5=duty1;
- x6=duty1;
- x7=duty1;
- x1=pow(x1,1);x2=pow(x2,2);x3=pow(x3,3);x4=pow(x4,4);x5=pow(x5,5);
- x6=pow(x6,6);x7=pow(x7,7);
- res = 451698.02975654600000000000 *x5
- - 1949941.77138209000000000000 *x4
- + 3364145.37781321000000000000* x3
- - 2899364.16821244000000000000* x2
- + 1248232.03533619000000000000* x1
- - 214750.16957818900000000000 ;
- sprintf((char*)buf,"%.2f%s ",res," M ohm ");
- }
-
-
- key=py_get_keynum(30,150);
- if(key)
- {
- if(key==1)//刪除
- {
- if(inputlen)inputlen--;
- inputstr[inputlen]='\0';//添加結束符
- }else
- {
- inputstr[inputlen]=key+'0';//輸入字符
- if(inputlen<7)inputlen++;
- }
- if(inputstr[0]!=NULL)
- {
- key=t9.getpymb(inputstr); //得到匹配的結果數
- if(key)//有部分匹配/完全匹配的結果
- {
- result_num=key&0X7F; //總匹配結果
- cur_index=1; //當前為第一個索引
- if(key&0X80) //是部分匹配
- {
- inputlen=key&0X7F; //有效匹配位數
- inputstr[inputlen]='\0';//不匹配的位數去掉
- if(inputlen>1)result_num=t9.getpymb(inputstr);//重新獲取完全匹配字符數
- }
- }else //沒有任何匹配
- {
- inputlen--;
- inputstr[inputlen]='\0';
- }
- }else
- {
- cur_index=0;
- result_num=0;
- }
- // LCD_Fill(30+40,105,30+40+48,110+16,WHITE); //清除之前的顯示
- // LCD_ShowNum(30+144,105,result_num,1,16); //顯示匹配的結果數
- // Show_Str(30+40,105,200,16,inputstr,16,0); //顯示有效的數字串
- // py_show_result(cur_index); //顯示第cur_index的匹配結果
- }
- key=KEY_Scan(0);
- if(result_num) //存在匹配的結果
- {
- switch(key)
- {
- case KEY1_PRES://下翻
- if(cur_index>1)cur_index--;
- else cur_index=result_num;
- py_show_result(cur_index); //顯示第cur_index的匹配結果
- break;
- case KEY0_PRES://清除輸入
- LCD_Fill(30+40,145,lcddev.width,145+48,WHITE); //清除之前的顯示
- goto RESTART;
- }
- }
- LCD_ShowString(30,35,210,24,24, (u8 *)buf);
- TIM5CH1_CAPTURE_STA=0x0000;//開啟下一次捕獲
- TIM_Cmd(TIM5,ENABLE ); //使能定時器5
- countH=0;
- countL=0;
- }
- }
復制代碼
全部資料51hei下載地址:
電阻檢測.rar
(1.83 MB, 下載次數: 121)
2018-6-2 18:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|