欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: STC12單片機做的NTC電阻測量計數器1602顯示程序 [打印本頁]

作者: 冰冰潔潔    時間: 2018-12-6 05:38
標題: STC12單片機做的NTC電阻測量計數器1602顯示程序
制作出來的實物圖如下:


單片機源程序如下:
  1. #include <reg51.h>
  2. #include  <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int


  5. //STC12C5A60S2 特殊功能寄存器 關于AD部分的寄存器定義
  6. sfr ADC_CONTR   =   0xBC;           //ADC控制寄存器 通道配置
  7. sfr ADC_RES     =   0xBD;           //ADC高8位數據寄存器(存AD轉換的結果,共10位)
  8. sfr ADC_LOW2    =   0xBE;           //ADC低2位數據寄存器(存AD轉換的結果,共10位)
  9. sfr P1ASF       =   0x9D;           //P1第二功能選擇寄存器
  10. unsigned char ch0 ; //ADC通道選擇,本例程選擇P1.0為AD轉換,其他P1口做普通IO用 01234567
  11. unsigned int ad_out;//ADC_CONTR寄存器的位變量定義
  12. #define ADC_POWER   0x80            //ADC power control bit
  13. #define ADC_FLAG    0x10            //ADC complete flag
  14. #define ADC_START   0x08            //ADC start control bit
  15. #define ADC_SPEEDLL 0x00            //420 clocks
  16. #define ADC_SPEEDL  0x20            //280 clocks
  17. #define ADC_SPEEDH  0x40            //140 clocks
  18. #define ADC_SPEEDHH 0x60            //70 clocks

  19. /***************************功能定義***************************/
  20. #define LCD12864_W_COM                        0xF8        //寫指令
  21. #define LCD12864_R_COM                        0xFC        //讀指令
  22. #define LCD12864_W_DAT                        0xFA        //寫數據
  23. #define LCD12864_R_DAT                        0xFE        //讀數據
  24. #ifndef __LCD12864_H__
  25. #define __LCD12864_H__
  26. #define LCD12864_COM 0        //輸入指令
  27. #define LCD12864_DAT 1        //輸入數據
  28. #define LCD12864_CLEAR                        0x01        //清除顯示
  29. #define LCD12864_CURSOR                        0x02        //位址歸位,游標回原點
  30. #define LCD12864_CURSOR_RLF                0x04        //光標左移,整體顯示不移動
  31. #define LCD12864_CURSOR_RRF                0x06        //光標右移,整體顯示不移動
  32. #define LCD12864_CURSOR_RLN                0x05        //光標左移,整體顯示移動
  33. #define LCD12864_CURSOR_RRN                0x07        //光標右移,整體顯示移動
  34. #define LCD12864_DIS_OFF                0x08        //顯示狀態全關
  35. #define LCD12864_DIS_ON                        0x0E        //顯示狀態開
  36. #define LCD12864_DIS_CUR_ON                0x0E        //游標顯示開
  37. #define LCD12864_DIS_CURS_ON        0x0F        //游標位置顯示開
  38. #define LCD12864_CURSOR_RL                0x10        //游標左移
  39. #define LCD12864_CURSOR_RR                0x14        //游標右移
  40. #define LCD12864_CURDIS_RL                0x18        //整體顯示左移,光標跟隨
  41. #define LCD12864_CURDIS_RR                0x1C        //整體顯示又移,光標跟隨
  42. #define LCD12864_COM_BASIC                0x30        //基本指令集動作
  43. #define LCD12864_COM_PLOT_ON        0x36        //擴展指令集動作,繪圖顯示ON
  44. #define LCD12864_COM_PLOT_OFF        0x34        //擴展指令集動作,繪圖顯示OFF
  45. #define LCD12864_STAND_TO                0x31        //進入待命模式
  46. #define LCD12864_PLACE_ROLL                0x03        //允許輸入卷動位址
  47. #define LCD12864_PLACE_IRAM                0x02        //允許輸入IRAM位址
  48. #define LCD12864_REVERES_13                0x04        //選擇一、三行同時作反白顯示
  49. #define LCD12864_REVERES_24                0x05        //選擇二、四行同時作反白顯示
  50. #define LCD12864_REST_ON                0x08        //進入睡眠模式
  51. #define LCD12864_REST_OFF                0x0C        //脫離睡眠模式
  52. #define LCD12864_W_COM                        0xF8        //寫指令
  53. #define LCD12864_R_COM                        0xFC        //讀指令
  54. #define LCD12864_W_DAT                        0xFA        //寫數據
  55. #define LCD12864_R_DAT                        0xFE        //讀數據
  56. uint pcs;//計數
  57. uint pcs1;
  58. sbit  bb= P1^7;   //bepp報警
  59. sbit  ok= P1^6;   //NTC OK
  60. sbit  no= P1^5;   //NTC NO
  61. sbit  k1= P1^4;   //計數清零

  62. sbit rs=P2^6;//
  63. sbit rw=P2^5;//
  64. sbit en=P2^7;//      
  65. /*******************************延時函數**********************************************/
  66. void Delay1Ms(uchar t)
  67. {
  68.         uchar i;
  69.         for (;t>0;t--)
  70.                 {
  71.                 for (i=0;i<138;i++)
  72.                         {
  73.                         _nop_();_nop_();_nop_();_nop_();_nop_();
  74.                         _nop_();_nop_();_nop_();_nop_();_nop_();
  75.                         }
  76.                 }      
  77. }
  78. void Delay1s(uchar t)
  79. {
  80.         for (;t>0;t--)
  81.                 {
  82.             Delay1Ms(250);
  83.                 Delay1Ms(250);
  84.                 Delay1Ms(250);
  85.                 Delay1Ms(250);
  86.             }      
  87. }
  88. void delayus()//us微秒延時
  89. {
  90. _nop_();
  91. _nop_();
  92. _nop_();
  93. _nop_();
  94. }
  95. void delay(unsigned int n)
  96. {
  97.     unsigned int x;
  98.     while (n--)
  99.     {
  100.         x = 5000;
  101.         while (x--);
  102.     }
  103. }
  104. void delay3(uint j,i) //1602用
  105.     {      
  106.             for(;j>0;j--)
  107.           {        
  108.                 for(i=0;i<127;i++);
  109.           }
  110.     }
  111. //*******************1602***************** ////
  112. void write_com(uchar com)//寫命令
  113. {
  114. rs=0;//
  115. rw=0;
  116. en=0;
  117. P0=com;
  118. delay3(2);
  119. en=1;
  120. delay3(5);
  121. en=0;
  122. delay3(2);
  123. }
  124. void write_dat(uchar dat)//寫數據
  125. {
  126. rs=1;//
  127. rw=0;
  128. en=0;
  129. P0=dat;
  130. delay3(2);
  131. en=1;
  132. delay3(5);
  133. en=0;
  134. delay3(2);
  135. }
  136. void write_zfc(uchar *p)//定義一個帶指針的函數?(字符串)
  137. {
  138.         while(*p!=0)//不能用";"
  139.         write_dat(*p++);
  140. }
  141. void init_1602()//1602初始化
  142. {
  143. write_com(0x38);//設置16X2顯示
  144. delay3(1);
  145. write_com(0x0C);//0e光標不閃//0c不顯//0f閃爍顯示
  146. delay3(1);
  147. write_com(0x06);//光標移位加1
  148. delay3(1);
  149. write_com(0x01);//清屏
  150. delay3(1);
  151. write_com(0x80);
  152. write_zfc("R=");
  153. write_com(0x80+0x40);
  154. write_zfc("S=");
  155. }
  156. //***********************************************************//
  157.   void InitADC() //10位AD數據緩存
  158. {
  159.    unsigned char i;

  160.     P1ASF = 0x01;//設置P1.0為AD腳,P1ASF = 0x01 其他P1口為普通IO功能      
  161.     ADC_RES = 0;                    //清空AD輸出高8位
  162.         //if(++ch>7)ch=0;        //循環顯示8個通道AD采樣
  163.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch0;
  164.     delay(8);                       //ADC power-on delay and Start A/D conversion
  165. }
  166. //**************************顯示1***********************//
  167. void dsplay1(uint temp)
  168. {
  169.          uint a,b,c,d;
  170.          //temp=1234;        //測試數據
  171.          temp=39*ad_out*(3470*(1/(273.15+15)-1/(273.15+25))); //溫度計算與修正約10K
  172.      if(temp>=100&&temp<11000)//>500&&<950/一個NTC約930K兩個就大于950用于判斷有幾個或沒有NTC在線                       
  173.            {  pcs1=1; // 合格品計數
  174.                      ok=0;//合格燈開
  175.                   no=1;//不合格燈關
  176.                   bb=0;//報警
  177.         a=temp/1000;
  178.         b=temp%1000/100;
  179.         c=temp%100/10;
  180.         d=temp%10;
  181.          
  182.         write_com(0x80+2);
  183.         write_dat(0x30+a);
  184.         write_dat('.');
  185.         write_dat(0x30+b);  
  186.         write_dat(0x30+c);         
  187.         //write_dat(0x30+d);
  188.     write_zfc("K");
  189.         write_zfc("   OK!   ");
  190.          }
  191.          else
  192.          {
  193.                ok=1;//合格燈關
  194.                    no=0;//不合格燈開      
  195.                    bb=1;//           
  196.                    temp=0;
  197.         a=temp/1000;
  198.         b=temp%1000/100;
  199.         c=temp%100/10;
  200.         d=temp%10;
  201.          
  202.         write_com(0x80+2);
  203.         write_dat(0x30+a);
  204.         write_dat('.');
  205.         write_dat(0x30+b);  
  206.         write_dat(0x30+c);         
  207.         //write_dat(0x30+d);
  208.     write_zfc("K");
  209.     write_zfc("   Error!");
  210.          }


  211.          if(pcs1==1&&bb==1) // 同時滿足兩個條件,測試放手才計數
  212. {
  213. pcs++;
  214. if(pcs>9998)pcs=9999;        //如果最高溫度高于99.9度就只顯示99.9
  215. pcs1=0;//用于清除計數
  216. }
  217.          }
  218. //**************************顯示2***********************//
  219. void dsplay2(uint temp)
  220. {
  221.          uint a,b,c,d;
  222.          temp=pcs;        //溫度計算與修正
  223.       
  224.         a=temp/1000;
  225.         b=temp%1000/100;
  226.         c=temp%100/10;
  227.         d=temp%10;
  228.          
  229.         write_com(0x80+0x40+2);
  230.         write_dat(0x30+a);
  231.         write_dat(0x30+b);  
  232.         write_dat(0x30+c);
  233.         //write_dat('.');         
  234.         write_dat(0x30+d);
  235.         write_zfc("psc");
  236.          }
  237. /*****************************main**********************************************/
  238. void main()
  239. {   
  240.            
  241.         init_1602();
  242.         InitADC();                      //AD初始化
  243.     IE = 0xa0;                      //允許AD中斷      
  244.            EA = 1;// 打開AD中斷
  245.     while(1)
  246. {               
  247.          
  248.            dsplay1( );
  249.            dsplay2( );
  250.            if(k1==0)pcs=0;//清除PCS計數
  251.          
  252. }
  253. }
  254.   void adc_isr() interrupt 5 using 1 //通道電壓整合
  255. {
  256.     ADC_CONTR &= !ADC_FLAG;                                 //Clear ADC interrupt flag
  257.     ad_out = (ADC_RES << 2) + ADC_LOW2;                     //高8位+低兩位
  258.         //if(++ch>7)ch=0;//循環顯示8個通道AD采樣
  259.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch0;
  260. }

復制代碼

所有資料51hei提供下載:
1602顯STC12電阻計數測試儀OK1.zip (42.83 KB, 下載次數: 115)



作者: caibihui163    時間: 2018-12-29 09:02
不錯,謝謝分享!好資料,51黑有你更精彩!!!
作者: sgq657785    時間: 2021-4-5 14:10
明明是1602液晶怎么變12864液晶了?
作者: 51hei團團    時間: 2021-4-5 15:43
sgq657785 發表于 2021-4-5 14:10
明明是1602液晶怎么變12864液晶了?

我寫程序的時候比較懶,喜歡移植別人的程序不改變量名,作者可能和我差不多,這程序是從12864移植而來的
作者: 真的想學單片機    時間: 2021-7-17 17:01
具體是怎么測得呢




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1