找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC12C5A60S2两路AD采集用LCD1602显示程序源码

[复制链接]
跳转到指定楼层
楼主
ID:226033 发表于 2017-8-9 11:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
测试可行。
全部资料下载地址:
STC12C5A60S2两路AD采集用LCD1602显示.doc (36.5 KB, 下载次数: 59)

单片机源程序:
  1. #include <STC12C5A.H>
  2. #include<intrins.h>
  3. #include "stdio.h"
  4. #define ulong unsigned long
  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. uchar data adc _at_        0x30;
  8. uchar data adc1 _at_ 0x31;
  9. sbit E=P2^7;                //1602使能引脚
  10. sbit RW=P2^6;                //1602读写引脚       
  11. sbit RS=P2^5;                //1602数据/命令选择引脚
  12. void SendByte(unsigned char dat);
  13. void SendStr(unsigned char *s);
  14. void L1602_string(uchar hang,uchar lie,uchar *p);
  15. void L1602_char(uchar hang,uchar lie,char sign);
  16. uchar AD();
  17. uchar AD1();
  18. void DelayUs2x(unsigned char t)
  19. {   
  20. while(--t);
  21. }
  22. /*------------------------------------------------
  23. mS延时函数,含有输入参数 unsigned char t,无返回值
  24. unsigned char 是定义无符号字符变量,其值的范围是
  25. 0~255 这里使用晶振12M,精确延时请使用汇编
  26. ------------------------------------------------*/
  27. void DelayMs(unsigned char t)
  28. {
  29.      
  30. while(t--)
  31. {
  32.      //大致延时1mS
  33.      DelayUs2x(245);
  34.          DelayUs2x(245);
  35. }
  36. }

  37. void delay()
  38. {
  39.         _nop_();
  40.         _nop_();
  41. }

  42. void Delay(uint del)
  43. {
  44.         uint i,j;
  45.         for(i=0;i<del;i++)
  46.         for(j=0;j<=148;j++)
  47.         {
  48.         }       
  49. }
  50. /********************************************************************
  51. * 名称 : bit Busy(void)
  52. * 功能 : 这个是一个读状态函数,读出函数是否处在忙状态
  53. * 输入 : 输入的命令值
  54. * 输出 : 无
  55. ***********************************************************************/
  56. void Busy(void)
  57. {
  58.         bit busy_flag = 1;
  59.         P0 = 0xff;
  60.         RS = 0;
  61.         delay();
  62.         RW = 1;
  63.         delay();
  64.         E = 1;
  65.         //Delay(1);
  66.         while(1)
  67.         {
  68.                 busy_flag = (bit)(P0 & 0x80);
  69.                 if(busy_flag == 0)
  70.                 {
  71.                         break;
  72.                 }
  73.         }
  74.         E = 0;
  75. }
  76. /********************************************************************
  77. * 名称 : wcmd(uchar del)
  78. * 功能 : 1602命令函数
  79. * 输入 : 输入的命令值
  80. * 输出 : 无
  81. ***********************************************************************/
  82. void wcmd(uchar del)
  83. {
  84.         RS = 0;
  85.         delay();
  86.         RW = 0;
  87.         delay();
  88.         E = 0;
  89.         delay();
  90.         P0 = del;
  91.         delay();
  92.         E = 1;
  93.         delay();
  94.         E = 0;
  95. }

  96. /********************************************************************
  97. * 名称 : wdata(uchar del)
  98. * 功能 : 1602写数据函数
  99. * 输入 : 需要写入1602的数据
  100. * 输出 : 无
  101. ***********************************************************************/

  102. void wdata(uchar del)
  103. {
  104.         delay();
  105.         RS = 1;
  106.         delay();
  107.         RW = 0;
  108.         delay();
  109.         E = 0;
  110.         delay();
  111.         P0 = del;
  112.     delay();
  113.         E = 1;
  114.         delay();
  115.         E = 0;
  116. }

  117. /********************************************************************
  118. * 名称 : L1602_init()
  119. * 功能 : 1602初始化,请参考1602的资料
  120. * 输入 : 无
  121. * 输出 : 无
  122. ***********************************************************************/
  123. void L1602_init(void)
  124. {
  125.         Delay(15);
  126.         wcmd(0x38);
  127.         Delay(5);
  128.         wcmd(0x38);
  129.         Delay(5);
  130.         wcmd(0x38);
  131.         wcmd(0x38);
  132.         Busy();
  133.         wcmd(0x08);
  134.         Busy();       
  135.         wcmd(0x01);
  136.         Busy();
  137.         wcmd(0x06);
  138.         Busy();
  139.         wcmd(0x0c);
  140. }

  141. /********************************************************************
  142. * 名称 : L1602_char(uchar hang,uchar lie,char sign)
  143. * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
  144.                  L1602_char(1,5,'b')
  145. * 输入 : 行,列,需要输入1602的数据
  146. * 输出 : 无
  147. ***********************************************************************/
  148. void L1602_char(uchar hang,uchar lie,char sign)
  149. {
  150.         uchar a;
  151.         if(hang == 1)
  152.         {
  153.                 a = 0x80;
  154.         }
  155.         if(hang == 2)
  156.         {
  157.                 a = 0xc0;
  158.         }
  159.         a = a + lie - 1;
  160.         Busy();
  161.         wcmd(a);
  162.         Busy();
  163.         wdata(sign);
  164. }

  165. /********************************************************************
  166. * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
  167. * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
  168.                   L1602_string(1,5,"ab cd ef;")
  169. * 输入 : 行,列,需要输入1602的数据
  170. * 输出 : 无
  171. ***********************************************************************/
  172. void L1602_string(uchar hang,uchar lie,uchar *p)
  173. {
  174.         uchar a;
  175.         if(hang == 1)
  176.         {
  177.                 a = 0x80;
  178.         }
  179.         if(hang == 2)
  180.         {
  181.                 a = 0xc0;
  182.         }
  183.         a = a + lie - 1;
  184.         while(1)
  185.         {
  186.                 Busy();
  187.                 wcmd(a);
  188.                 Busy();
  189.                 wdata(*p);
  190.                 a++;
  191.                 p++;                       
  192.                 if((*p == '\0')||(a==0x90)||(a==0xd0))
  193.                 {
  194.                         break;
  195.                 }
  196.         }
  197. }

  198. uchar AD()
  199. {
  200.    ulong i;
  201.    uchar star;
  202.    ADC_CONTR|=0x80;
  203.    for(i=0;i<10000;i++);
  204.    P1ASF=0x01;
  205.    ADC_CONTR|=0XE1;
  206.    for(i=0;i<10000;i++);
  207.    while(1)
  208.    {
  209.       ADC_CONTR|=0x08;
  210.           star=0;
  211.           while(star==0)
  212.           {
  213.               star=ADC_CONTR&0x10;
  214.           }
  215.             ADC_CONTR&=0x00;
  216.                 adc=ADC_RES;
  217.                         //adc<<=2;
  218.                 //adc+=ADC_RESL;
  219.                 return adc;
  220.    }
  221. }

  222. uchar AD1()
  223. {
  224.    ulong i;
  225.    uchar star;
  226.    ADC_CONTR|=0x80;
  227.    for(i=0;i<10000;i++);
  228.    P1ASF=0;
  229.    ADC_CONTR|=0XE0;
  230.    for(i=0;i<10000;i++);
  231.    while(1)
  232.    {
  233.       ADC_CONTR|=0x08;
  234.           star=0;
  235.           while(star==0)
  236.           {
  237.               star=ADC_CONTR&0x10;
  238.           }
  239.             ADC_CONTR&=0x00;
  240.                 adc1=ADC_RES;
  241.         //        adc1<<=2;
  242.         //        adc1+=ADC_RESL;
  243.                 return adc1;
  244.    }
  245. }
  246. void main()
  247. {
  248.            float i,j;
  249.         unsigned char a[16];
  250.         unsigned char b[16];
  251.         L1602_init();
  252.         while(1)
  253.         {
  254.       {
  255.           i=AD()*5/256;
  256.         sprintf(a," DA1=%4.2f v",i);
  257.         L1602_string(2,0,a);
  258.         DelayMs(1);       
  259.     j=AD1()*5/256;
  260.         sprintf(b," DC2=%4.2f v",j);
  261.         L1602_string(1,0,b);
  262.            }           
  263.         }
  264. }
复制代码


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

使用道具 举报

沙发
ID:105624 发表于 2018-2-25 14:30 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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