找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5942|回复: 4
打印 上一主题 下一主题
收起左侧

STC12单片机做的NTC电阻测量计数器1602显示程序

  [复制链接]
跳转到指定楼层
楼主
ID:358930 发表于 2018-12-6 05:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
制作出来的实物图如下:


单片机源程序如下:
  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)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:129023 发表于 2018-12-29 09:02 | 只看该作者
不错,谢谢分享!好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:227393 发表于 2021-4-5 14:10 来自手机 | 只看该作者
明明是1602液晶怎么变12864液晶了?
回复

使用道具 举报

地板
ID:328014 发表于 2021-4-5 15:43 | 只看该作者
sgq657785 发表于 2021-4-5 14:10
明明是1602液晶怎么变12864液晶了?

我写程序的时候比较懒,喜欢移植别人的程序不改变量名,作者可能和我差不多,这程序是从12864移植而来的
回复

使用道具 举报

5#
ID:954102 发表于 2021-7-17 17:01 | 只看该作者
具体是怎么测得呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表