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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4072|回復: 2
收起左側

2019TI杯F題紙張測量儀Proteus仿真+單片機源程序

[復制鏈接]
ID:505284 發表于 2019-8-12 23:00 | 顯示全部樓層 |閱讀模式
話不多說了,基于stc單片機開發的紙張測量儀,最多能測量100張,所有pcb,仿真均放在壓縮文件中,程序在YL39開發板文件夾下,所有.c文件,有需要的拿去研究。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載).
0.png

當正確校準后,夾板加入被測紙張后,顯示屏直接顯示張數N
當測試極板短路后測量的N值=0,系統發出連續“滴、滴”聲響報警

按鍵每次按下生效后會“滴”響一聲
使用撥動開關,可以靈活模擬選擇3次測量的值,可以一次模擬夾1張紙的測量值,一次模擬N0張,最后模擬N張紙測試

仿真軟件中不能仿真STC單片機的ADC,故采用PCF8591代替,實際開發板不使用

單片機源程序如下:
  1. #include "config.h"


  2. #define C_100PF()   P3_7 = 1    //切換100pF檔位
  3. #define C_1000PF()  P3_7 = 0    //切換1000pF檔位

  4. #define BEEP_ON()   P0_4 = 0    //打開蜂鳴器
  5. #define BEEP_OFF()  P0_4 = 1    //關閉蜂鳴器

  6. void task_display( void );
  7. uint8_t calc_paper(uint32_t c1, uint32_t c2, uint32_t cx,uint8_t N0);

  8. const uint8_t code di[]={0x63,0x01,0x00,0};

  9. void main(void)
  10. {
  11.     TIMER0_1();         //設置定時器0在定時器方式1
  12.     T0_INIT(2000);      //定時器0初值設為2000us
  13.     init_keyboard();    //鍵盤模塊初始化
  14.     init_hd44780();     //初始化LCD屏幕
  15.     xdev_out(hd44780_putc);
  16.     init_si2c();
  17.     init_adc();
  18.     C_1000PF();         //默認1000pF檔位
  19.     BEEP_OFF();         //關閉蜂鳴器
  20.     init_music();

  21.     ET0 = 1; EA = 1; TR0 = 1;

  22.     while(1)
  23.     {
  24.         task_keyboard();
  25.         task_adc();
  26.         task_display();
  27.     }
  28. }

  29. //定時器0中斷服務程序(系統滴答定時器)
  30. ISR_BANK( T0_VECTOR, 1 )
  31. {
  32.     static uint8_t adc_cnt=0;
  33.     T0_INIT(2000);      //定時器0重新賦初值
  34.     timer_keyboard();   //鍵盤定時器
  35.     if(++adc_cnt >= 50){adc_cnt=0;time_adc_ok = TRUE;} //定時采樣100ms采集一次
  36. }

  37. //測量顯示任務
  38. void task_display(void)
  39. {
  40.     static enum{Test,Set1,Set2,Set3,Set4,Set5,Set6,Set7} State = Test;
  41.     //static BOOL is_100PF = FALSE;
  42.     static uint32_t c1=5000u,c2=500u,cx;
  43.     static uint8_t N0 = 10;
  44.     uint8_t N;
  45.     key_t key;          //定義鍵盤消息變量
  46.     if(keyboard_get(&key)){
  47.         if(KEY_LONG==key.type){
  48.         switch( key.value ){
  49.         case B00111000:  //P32口按鍵按下
  50.             c1 = cx;
  51.             music_play(di);
  52.             break;
  53.         case B00110100:  //P33口按鍵按下
  54.             c2 = cx;
  55.             music_play(di);
  56.             break;
  57. //        case B00101100:  //P34口按鍵按下
  58. //            break;
  59. //        case B00011100:  //P35口按鍵按下
  60. //            break;
  61.         default:
  62.             break;
  63.         }}
  64.         if(KEY_PRESS==key.type){
  65.         switch( key.value ){
  66.         case B00111000:  //P32口按鍵按下
  67.             if(N0 < 100) N0 += 1;
  68.             music_play(di);
  69.             break;
  70.         case B00110100:  //P33口按鍵按下
  71.             if(N0 > 0) N0 -= 1; ;
  72.             music_play(di);
  73.             break;
  74. //        case B00101100:  //P34口按鍵按下
  75. //            break;
  76. //        case B00011100:  //P35口按鍵按下
  77. //            break;
  78.         default:
  79.             break;
  80.         }}
  81.     }
  82.     if( State == Test ){
  83.         if( adc_sample_ok ){
  84.             cx = (uint32_t)adc_ch0*(500000uL/256uL)/250uL;
  85.             N = (cx > c1)? 0: calc_paper(c1,c2,cx,N0);
  86.             N = (N > 99) ? 99: N;
  87.             if(N == 0) music_play(di);
  88.             xprintf("\fC=%3lu.%1lupF N=%02u  ",cx/10uL,cx%10uL,(uint16_t)N);
  89.             xprintf("%3lu/%3lu  N0=%02u",c1/10uL,c2/10uL,(uint16_t)N0);
  90.         }
  91.         adc_sample_ok = FALSE;
  92.     } else {

  93.     }
  94. }

  95. /*---------------------------------------------------------------------
  96.         計算張紙數量函數——使用整型數運算
  97. 傳入的參數按照精度要求可以放大10倍(小數后1位)
  98. 或放大100倍(小數后2位)<放大100倍可能會超過(65535)>
  99. ----------------------------------------------------------------------*/
  100. uint8_t calc_paper(
  101.   uint32_t c1,  //夾一張紙測得的電容值
  102.   uint32_t c2,  //夾N0張紙測量的電容值
  103.   uint32_t cx,  //夾N張紙測量的電容值
  104.   uint8_t N0    //N0
  105. )
  106. {
  107.   uint16_t c1_cx, c1_c2;
  108.   //為了計算保持小數后2位精度,所有數放大了100倍,計算完成后再還原
  109.   //為了計算時保證不溢出,所有數轉換為長整型
  110.   c1_cx = (uint32_t)((uint32_t)c1*100uL/(uint32_t)cx - 100uL);
  111.   c1_c2 = (uint32_t)((uint32_t)c1*100uL/(uint32_t)c2 - 100uL);
  112.   return (uint8_t)(((uint32_t)c1_cx*100uL/(uint32_t)c1_c2 \
  113.                     * ((uint32_t)N0-1uL) + 100uL)/100ul);
  114. }
復制代碼
0.png
所有資料51hei提供下載:
2019 ti杯F題 紙張測量儀.rar (587.13 KB, 下載次數: 134)

評分

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

查看全部評分

回復

使用道具 舉報

ID:282095 發表于 2019-8-13 15:21 | 顯示全部樓層
這是今年電子設計大賽的F組的實物嗎
回復

使用道具 舉報

ID:505284 發表于 2019-8-15 17:51 來自手機 | 顯示全部樓層
鵬博士PBs 發表于 2019-8-13 15:21
這是今年電子設計大賽的F組的實物嗎

是的,已做出實物
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧洲毛片 | 亚洲国产精品成人综合久久久 | 婷婷色在线播放 | 精国产品一区二区三区 | 亚洲精品乱码8久久久久久日本 | 91精品国产一区二区三区香蕉 | 五月天国产视频 | 久久岛国| 国产偷录视频叫床高潮对白 | 国产精品电影在线观看 | 在线看亚洲 | 综合色播 | 日韩欧美国产一区二区三区 | 欧美精品一区二区三区在线播放 | 国产精品爱久久久久久久 | 亚洲国产自产 | 日日摸天天添天天添破 | 欧美视频日韩 | 91免费观看| 婷婷丁香在线视频 | 精品国产久| 国产精品久久久久久久久久久免费看 | 久久中文字幕一区 | 国产高清在线精品 | 欧美成人手机在线 | 国产福利在线小视频 | 欧美精选一区二区 | 国产精品久久久久无码av | 国产高清在线精品 | 亚洲天堂影院 | 欧美片网站免费 | 成人一区二区三区在线观看 | 亚洲成人一二区 | 亚洲综合无码一区二区 | 亚洲高清电影 | 午夜视频在线 | 久久99精品久久久97夜夜嗨 | 国产精品永久在线观看 | 免费看片国产 | 亚洲精品一区二区 | 日韩三级一区 |