|
話不多說了,基于stc單片機(jī)開發(fā)的紙張測(cè)量?jī)x,最多能測(cè)量100張,所有pcb,仿真均放在壓縮文件中,程序在YL39開發(fā)板文件夾下,所有.c文件,有需要的拿去研究。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載).
0.png (28.64 KB, 下載次數(shù): 60)
下載附件
2019-8-13 04:05 上傳
當(dāng)正確校準(zhǔn)后,夾板加入被測(cè)紙張后,顯示屏直接顯示張數(shù)N
當(dāng)測(cè)試極板短路后測(cè)量的N值=0,系統(tǒng)發(fā)出連續(xù)“滴、滴”聲響報(bào)警
按鍵每次按下生效后會(huì)“滴”響一聲
使用撥動(dòng)開關(guān),可以靈活模擬選擇3次測(cè)量的值,可以一次模擬夾1張紙的測(cè)量值,一次模擬N0張,最后模擬N張紙測(cè)試
仿真軟件中不能仿真STC單片機(jī)的ADC,故采用PCF8591代替,實(shí)際開發(fā)板不使用
單片機(jī)源程序如下:
- #include "config.h"
- #define C_100PF() P3_7 = 1 //切換100pF檔位
- #define C_1000PF() P3_7 = 0 //切換1000pF檔位
- #define BEEP_ON() P0_4 = 0 //打開蜂鳴器
- #define BEEP_OFF() P0_4 = 1 //關(guān)閉蜂鳴器
- void task_display( void );
- uint8_t calc_paper(uint32_t c1, uint32_t c2, uint32_t cx,uint8_t N0);
- const uint8_t code di[]={0x63,0x01,0x00,0};
- void main(void)
- {
- TIMER0_1(); //設(shè)置定時(shí)器0在定時(shí)器方式1
- T0_INIT(2000); //定時(shí)器0初值設(shè)為2000us
- init_keyboard(); //鍵盤模塊初始化
- init_hd44780(); //初始化LCD屏幕
- xdev_out(hd44780_putc);
- init_si2c();
- init_adc();
- C_1000PF(); //默認(rèn)1000pF檔位
- BEEP_OFF(); //關(guān)閉蜂鳴器
- init_music();
- ET0 = 1; EA = 1; TR0 = 1;
- while(1)
- {
- task_keyboard();
- task_adc();
- task_display();
- }
- }
- //定時(shí)器0中斷服務(wù)程序(系統(tǒng)滴答定時(shí)器)
- ISR_BANK( T0_VECTOR, 1 )
- {
- static uint8_t adc_cnt=0;
- T0_INIT(2000); //定時(shí)器0重新賦初值
- timer_keyboard(); //鍵盤定時(shí)器
- if(++adc_cnt >= 50){adc_cnt=0;time_adc_ok = TRUE;} //定時(shí)采樣100ms采集一次
- }
- //測(cè)量顯示任務(wù)
- void task_display(void)
- {
- static enum{Test,Set1,Set2,Set3,Set4,Set5,Set6,Set7} State = Test;
- //static BOOL is_100PF = FALSE;
- static uint32_t c1=5000u,c2=500u,cx;
- static uint8_t N0 = 10;
- uint8_t N;
- key_t key; //定義鍵盤消息變量
- if(keyboard_get(&key)){
- if(KEY_LONG==key.type){
- switch( key.value ){
- case B00111000: //P32口按鍵按下
- c1 = cx;
- music_play(di);
- break;
- case B00110100: //P33口按鍵按下
- c2 = cx;
- music_play(di);
- break;
- // case B00101100: //P34口按鍵按下
- // break;
- // case B00011100: //P35口按鍵按下
- // break;
- default:
- break;
- }}
- if(KEY_PRESS==key.type){
- switch( key.value ){
- case B00111000: //P32口按鍵按下
- if(N0 < 100) N0 += 1;
- music_play(di);
- break;
- case B00110100: //P33口按鍵按下
- if(N0 > 0) N0 -= 1; ;
- music_play(di);
- break;
- // case B00101100: //P34口按鍵按下
- // break;
- // case B00011100: //P35口按鍵按下
- // break;
- default:
- break;
- }}
- }
- if( State == Test ){
- if( adc_sample_ok ){
- cx = (uint32_t)adc_ch0*(500000uL/256uL)/250uL;
- N = (cx > c1)? 0: calc_paper(c1,c2,cx,N0);
- N = (N > 99) ? 99: N;
- if(N == 0) music_play(di);
- xprintf("\fC=%3lu.%1lupF N=%02u ",cx/10uL,cx%10uL,(uint16_t)N);
- xprintf("%3lu/%3lu N0=%02u",c1/10uL,c2/10uL,(uint16_t)N0);
- }
- adc_sample_ok = FALSE;
- } else {
- }
- }
- /*---------------------------------------------------------------------
- 計(jì)算張紙數(shù)量函數(shù)——使用整型數(shù)運(yùn)算
- 傳入的參數(shù)按照精度要求可以放大10倍(小數(shù)后1位)
- 或放大100倍(小數(shù)后2位)<放大100倍可能會(huì)超過(65535)>
- ----------------------------------------------------------------------*/
- uint8_t calc_paper(
- uint32_t c1, //夾一張紙測(cè)得的電容值
- uint32_t c2, //夾N0張紙測(cè)量的電容值
- uint32_t cx, //夾N張紙測(cè)量的電容值
- uint8_t N0 //N0
- )
- {
- uint16_t c1_cx, c1_c2;
- //為了計(jì)算保持小數(shù)后2位精度,所有數(shù)放大了100倍,計(jì)算完成后再還原
- //為了計(jì)算時(shí)保證不溢出,所有數(shù)轉(zhuǎn)換為長(zhǎng)整型
- c1_cx = (uint32_t)((uint32_t)c1*100uL/(uint32_t)cx - 100uL);
- c1_c2 = (uint32_t)((uint32_t)c1*100uL/(uint32_t)c2 - 100uL);
- return (uint8_t)(((uint32_t)c1_cx*100uL/(uint32_t)c1_c2 \
- * ((uint32_t)N0-1uL) + 100uL)/100ul);
- }
復(fù)制代碼
0.png (14.32 KB, 下載次數(shù): 40)
下載附件
2019-8-13 04:07 上傳
所有資料51hei提供下載:
2019 ti杯F題 紙張測(cè)量?jī)x.rar
(587.13 KB, 下載次數(shù): 134)
2019-8-12 23:00 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|