找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于ad0809的模数转换与显示的单片机程序

[复制链接]
跳转到指定楼层
楼主
adc0809的51程序及仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. /***************   writer:shopping.w   ******************/
  2. #include <reg52.h>
  3. #include<intrins.h>
  4. #include<math.h>
  5. #define uint unsigned int
  6. #define uchar unsigned char

  7. uchar code LCD[10]={"0123456789"};
  8. uchar code CL[]={"CL%:0.00"} ;
  9. uchar code DW[]={"MOL/L"};
  10. uchar code CW[]={"      error     "} ;
  11. sbit OE  = P1^0;
  12. sbit EOC = P1^1;
  13. sbit ST  = P1^2;
  14. sbit CLK = P1^3;
  15. void delay1ms()
  16. {
  17.    unsigned char i,j;       
  18.          for(i=0;i<10;i++)
  19.           for(j=0;j<33;j++)
  20.            ;}       
  21. void delaynms(unsigned char n)
  22. {
  23.    unsigned char i;
  24.         for(i=0;i<n;i++)
  25.            delay1ms();
  26. }
  27. bit BusyTest(void)
  28.   {
  29.     bit result;
  30.         RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态
  31.     RW=1;
  32.     E=1;        //E=1,才允许读写
  33.     _nop_();   //空操作
  34.     _nop_();
  35.     _nop_();
  36.     _nop_();   //空操作四个机器周期,给硬件反应时间       
  37.     result=BF;  //将忙碌标志电平赋给result
  38.    E=0;         //将E恢复低电平
  39.    return result;
  40.   }
  41. void WriteInstruction (unsigned char dictate)
  42. {   
  43.     while(BusyTest()==1);   //如果忙就等待
  44.          RS=0;                  //根据规定,RS和R/W同时为低电平时,可以写入指令
  45.          RW=0;   
  46.          E=0;                   //E置低电平(根据表8-6,写指令时,E为高脉冲,
  47.                            // 就是让E从0到1发生正跳变,所以应先置"0"
  48.          _nop_();
  49.          _nop_();               //空操作两个机器周期,给硬件反应时间
  50.          P0=dictate;            //将数据送入P0口,即写入指令或地址
  51.          _nop_();
  52.          _nop_();
  53.          _nop_();
  54.          _nop_();               //空操作四个机器周期,给硬件反应时间
  55.          E=1;                   //E置高电平
  56.          _nop_();
  57.          _nop_();
  58.          _nop_();
  59.          _nop_();               //空操作四个机器周期,给硬件反应时间
  60.           E=0;              }
  61.           void WriteAddress(unsigned char x)
  62. {
  63.      WriteInstruction(x|0x80); }//显示位置的确定方法规定为"80H+地址码x"

  64.   void WriteData(unsigned char y)
  65. {
  66.     while(BusyTest()==1);  
  67.           RS=1;           //RS为高电平,RW为低电平时,可以写入数据
  68.           RW=0;
  69.           E=0;            //E置低电平(根据表8-6,写指令时,E为高脉冲,
  70.                      // 就是让E从0到1发生正跳变,所以应先置"0"
  71.           P0=y;           //将数据送入P0口,即将数据写入液晶模块
  72.           _nop_();
  73.           _nop_();
  74.           _nop_();
  75.      _nop_();       //空操作四个机器周期,给硬件反应时间
  76.           E=1;           //E置高电平
  77.           _nop_();
  78.           _nop_();
  79.           _nop_();
  80.          _nop_();        //空操作四个机器周期,给硬件反应时间
  81.          E=0;            //当E由高电平跳变成低电平时,液晶模块开始执行命令
  82. }
  83. void LcdInitiate(void)
  84. {
  85.     delaynms(15);               //延时15ms,首次写指令时应给LCD一段较长的反应时间
  86.     WriteInstruction(0x38);     //显示模式设置:16×2显示,5×7点阵,8位数据接口
  87.         delaynms(5);                //延时5ms ,给硬件一点反应时间
  88.     WriteInstruction(0x38);
  89.         delaynms(5);               //延时5ms ,给硬件一点反应时间
  90.         WriteInstruction(0x38);     //连续三次,确保初始化成功
  91.         delaynms(5);               //延时5ms ,给硬件一点反应时间
  92.         WriteInstruction(0x0c);     //显示模式设置:显示开,无光标,光标不闪烁
  93.         delaynms(5);               //延时5ms ,给硬件一点反应时间
  94.         WriteInstruction(0x06);     //显示模式设置:光标右移,字符不移
  95.         delaynms(5);                //延时5ms ,给硬件一点反应时间
  96.         WriteInstruction(0x01);     //清屏幕指令,将以前的显示内容清除
  97.         delaynms(5);             //延时5ms ,给硬件一点反应时间

  98. }

  99.   void xianshi(void)
  100.   {  unsigned char i;
  101.                       WriteAddress(0x00);    //写显示地址,将在第1行第1列开始显示
  102.                            i = 0;                //从第一个字符开始显示
  103.                                 while(CL[i] != '\0')  //只要没有写到结束标志,就继续写
  104.                                 {                                               
  105.                                         WriteData(CL[i]);   //将字符常量写入LCD
  106.                                         i++;                 //指向下一个字符
  107.                                         delaynms(100);        //延时100ms较长时间,以看清关于显示的说明
  108.                                 }        }
  109.         void danwei(void)
  110.         {
  111.        unsigned char h;
  112.                       WriteAddress(0x0b);    //写显示地址,将在第1行第1列开始显示
  113.                            h = 0;                //从第一个字符开始显示
  114.                                 while(DW[h]!= '\0')  //只要没有写到结束标志,就继续写
  115.                                 {                                               
  116.                                         WriteData(DW[h]);   //将字符常量写入LCD
  117.                                        h++;                 //指向下一个字符
  118.                                         delaynms(100);        //延时100ms较长时间,以看清关于显示的说明
  119.                                 }        }
  120.        
  121.           void  panduan(void)
  122.         {
  123.        unsigned char k;
  124.                          LcdInitiate()         ;
  125.                       WriteAddress(0x00);    //写显示地址,将在第1行第1列开始显示
  126.                           k = 0;                //从第一个字符开始显示
  127.                                 while(CW[k] != '\0')  //只要没有写到结束标志,就继续写
  128.                                 {                                               
  129.                                         WriteData(CW[k]);   //将字符常量写入LCD
  130.                                        k++;                 //指向下一个字符
  131.                                         delaynms(100);        //延时100ms较长时间,以看清关于显示的说明
  132.                                 }        }





  133. void Display_Result(uchar d)
  134. {  double x,y;
  135. uchar xs1, xs2,ds, xs3;
  136.         d=d*5*100/256 ;
  137.         x=(d-110)/59;
  138.         y=pow(10,x);
  139. if(y*10000<1||y*10000>100)
  140. {panduan(); }
  141. else if(y*1000>0)
  142. {ds=y*100000;
  143. xs1=ds%1000;
  144. xs2=ds%100;
  145. xs3=ds%10;
  146. xianshi();
  147. danwei();
  148. WriteAddress(0x08);
  149. WriteData(LCD[xs1]);
  150. delaynms(10);
  151. WriteData(LCD[xs2]);
  152. delaynms(10);
  153. WriteData(LCD[xs3]) ;
  154. delaynms(10);     }
  155. else if(y*10000>0) {
  156. xs2=ds%100;
  157. xs3=ds%10;
  158. xianshi();
  159. danwei();
  160. WriteAddress(0x08);
  161. WriteData(LCD[0]);
  162. delaynms(10);
  163. WriteData(LCD[xs2]);
  164. delaynms(10);
  165. WriteData(LCD[xs3]) ;
  166. delaynms(10);
  167. }
  168. else xs3=ds%10;
  169. xianshi();
  170. danwei();
  171. WriteAddress(0x08);
  172. WriteData(LCD[0]);
  173. delaynms(10);
  174. WriteData(LCD[0]);
  175. delaynms(10);
  176. WriteData(LCD[xs3]) ;
  177. delaynms(10);}





  178. void main()
  179. ……………………

  180. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
adc0808.rar (63.75 KB, 下载次数: 75)



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

使用道具 举报

沙发
ID:335078 发表于 2018-6-13 23:46 | 只看该作者
刚好需要,看一下能不能用
回复

使用道具 举报

板凳
ID:335078 发表于 2018-6-13 23:59 | 只看该作者
程序不完整,还是得慢慢改才行。望完善
回复

使用道具 举报

地板
ID:334094 发表于 2019-1-2 15:09 | 只看该作者
很好,学习学习
回复

使用道具 举报

5#
ID:334094 发表于 2019-1-2 15:10 | 只看该作者
很好,学习学习
回复

使用道具 举报

6#
ID:512403 发表于 2019-4-25 15:45 来自手机 | 只看该作者
收藏起来,看看
回复

使用道具 举报

7#
ID:528654 发表于 2019-5-11 01:45 | 只看该作者
仿真不了啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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