找回密码
 立即注册

QQ登录

只需一步,快速开始

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

如何把这个单片机的ADC改为16位,把电压显示转为对照度的显示

[复制链接]
跳转到指定楼层
楼主
ID:345989 发表于 2019-6-22 18:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是网从上下载的一段程序代码,我们的设计是把其中的ADC改为16位,把电压显示转为对照度的显示,其中也需要用proteus进行一下仿真,因为对单片机这一块不太了解,请热心人士不吝指教。

单片机源程序如下:
  1. //控制口定义
  2. #include<reg52.h>
  3. #include<intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define   ad0_7  P1
  7. sbit CS=P1^0;
  8. sbit CLK=P1^1;
  9. sbit DIO=P1^2;
  10. sbit RS=P3^5;
  11. sbit RW=P3^6;
  12. sbit E=P3^7;
  13. sbit BF=P0^7;



  14. void delay (uint t)
  15. {uint i;
  16.         uchar j;
  17.                 for(i=t;i>0;i--);
  18.                         for(j=0;j<200;j++);
  19. }

  20. //AD转换子程序
  21. unsigned char  A_D()
  22. {
  23.   unsigned char i,dat;
  24.    CS=1;   //一个转换周期开始
  25.    CLK=0;  //为第一个脉冲作准备
  26.    CS=0;  //CS置0,片选有效

  27.    DIO=1;    //DIO置1,规定的起始信号  
  28.    CLK=1;   //第一个脉冲
  29.    CLK=0;   //第一个脉冲的下降沿,此前DIO必须是高电平
  30.    DIO=1;   //DIO置1, 通道选择信号  
  31.    CLK=1;   //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0
  32.    CLK=0;   //第二个脉冲下降沿
  33.    DIO=0;   //DI置0,选择通道0
  34.    CLK=1;    //第三个脉冲
  35.    CLK=0;    //第三个脉冲下降沿
  36.    DIO=1;    //第三个脉冲下沉之后,输入端DIO失去作用,应置1
  37.    CLK=1;    //第四个脉冲
  38.    for(i=0;i<8;i++)  //高位在前
  39.     {
  40.       CLK=1;         //第四个脉冲
  41.       CLK=0;
  42.       dat<<=1;       //将下面储存的低位数据向右移
  43.                 dat|=(unsigned char)DIO;          //将输出数据DIO通过或运算储存在dat最低位
  44.     }                                  
  45.     CS=1;          //片选无效
  46.          return dat;         //将读书的数据返回     
  47.   }

  48. unsigned char code digit[10]={"0123456789"};   //定义字符数组显示数字
  49. unsigned char code Str1[]={"LX="};            //说明显示的是电压
  50. unsigned char code Str2[]={"nine"};
  51. /*******************************************************************************
  52. 以下是对液晶模块的操作程序
  53. *******************************************************************************/

  54. /*****************************************************
  55. 函数功能:延时1ms
  56. (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
  57. ***************************************************/
  58. void delay1ms()
  59. {
  60.    unsigned char i,j;       
  61.          for(i=0;i<10;i++)
  62.           for(j=0;j<33;j++)
  63.            ;                 
  64. }
  65. /*****************************************************
  66. 函数功能:延时若干毫秒
  67. 入口参数:n
  68. ***************************************************/
  69. void delaynms(unsigned char n)
  70. {
  71.    unsigned char i;
  72.         for(i=0;i<n;i++)
  73.            delay1ms();
  74. }
  75. /*****************************************************
  76. 函数功能:判断液晶模块的忙碌状态
  77. 返回值:result。result=1,忙碌;result=0,不忙
  78. ***************************************************/
  79. bit BusyTest(void)
  80.   {
  81.     bit result;
  82.         RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态
  83.     RW=1;
  84.     E=1;        //E=1,才允许读写
  85.     _nop_();   //空操作
  86.     _nop_();
  87.     _nop_();
  88.     _nop_();   //空操作四个机器周期,给硬件反应时间       
  89.     result=BF;  //将忙碌标志电平赋给result
  90.    E=0;         //将E恢复低电平
  91.    return 0;
  92.   }
  93. /*****************************************************
  94. 函数功能:将模式设置指令或显示地址写入液晶模块
  95. 入口参数:dictate
  96. ***************************************************/
  97. void WriteInstruction (unsigned char dictate)
  98. {   
  99.     while(BusyTest()==1);   //如果忙就等待
  100.          RS=0;                  //根据规定,RS和R/W同时为低电平时,可以写入指令
  101.          RW=0;   
  102.          E=0;                   //E置低电平(根据表8-6,写指令时,E为高脉冲,
  103.                            // 就是让E从0到1发生正跳变,所以应先置"0"
  104.          _nop_();
  105.          _nop_();               //空操作两个机器周期,给硬件反应时间
  106.          P0=dictate;            //将数据送入P0口,即写入指令或地址
  107.          _nop_();
  108.          _nop_();
  109.          _nop_();
  110.          _nop_();               //空操作四个机器周期,给硬件反应时间
  111.          E=1;                   //E置高电平
  112.          _nop_();
  113.          _nop_();
  114.          _nop_();
  115.          _nop_();               //空操作四个机器周期,给硬件反应时间
  116.           E=0;                  //当E由高电平跳变成低电平时,液晶模块开始执行命令
  117. }
  118. /*****************************************************
  119. 函数功能:指定字符显示的实际地址
  120. 入口参数:x
  121. ***************************************************/
  122. void WriteAddress(unsigned char x)
  123. {
  124.      WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
  125. }
  126. /*****************************************************
  127. 函数功能:将数据(字符的标准ASCII码)写入液晶模块
  128. 入口参数:y(为字符常量)
  129. ***************************************************/
  130. void WriteData(unsigned char y)
  131. {
  132.     while(BusyTest()==1);  
  133.           RS=1;           //RS为高电平,RW为低电平时,可以写入数据
  134.           RW=0;
  135.           E=0;            //E置低电平(根据表8-6,写指令时,E为高脉冲,
  136.                      // 就是让E从0到1发生正跳变,所以应先置"0"
  137.           P0=y;           //将数据送入P0口,即将数据写入液晶模块
  138.           _nop_();
  139.           _nop_();
  140.           _nop_();
  141.      _nop_();       //空操作四个机器周期,给硬件反应时间
  142.           E=1;           //E置高电平
  143.           _nop_();
  144.           _nop_();
  145.           _nop_();
  146.          _nop_();        //空操作四个机器周期,给硬件反应时间
  147.          E=0;            //当E由高电平跳变成低电平时,液晶模块开始执行命令
  148. }
  149. /*****************************************************
  150. 函数功能:对LCD的显示模式进行初始化设置
  151. ***************************************************/
  152. void LcdInitiate(void)
  153. {
  154.     delaynms(15);               //延时15ms,首次写指令时应给LCD一段较长的反应时间
  155.     WriteInstruction(0x38);     //显示模式设置:16×2显示,5×7点阵,8位数据接口
  156.         delaynms(5);                //延时5ms ,给硬件一点反应时间
  157.     WriteInstruction(0x38);
  158.         delaynms(5);               //延时5ms ,给硬件一点反应时间
  159.         WriteInstruction(0x38);     //连续三次,确保初始化成功
  160.         delaynms(5);               //延时5ms ,给硬件一点反应时间
  161.         WriteInstruction(0x0c);     //显示模式设置:显示开,无光标,光标不闪烁
  162.         delaynms(5);               //延时5ms ,给硬件一点反应时间
  163.         WriteInstruction(0x06);     //显示模式设置:光标右移,字符不移
  164.         delaynms(5);                //延时5ms ,给硬件一点反应时间
  165.         WriteInstruction(0x01);     //清屏幕指令,将以前的显示内容清除
  166.         delaynms(5);             //延时5ms ,给硬件一点反应时间

  167. }
  168. /**************************************************************************
  169. 以下是电压显示的说明
  170. **************************************************************************/
  171. /*****************************************************
  172. 函数功能:显示电压符号
  173. ***************************************************/   
  174. void display_volt(void)
  175. {
  176.     unsigned char i;
  177.          WriteAddress(0x01);    //写显示地址,将在第2行第1列开始显示
  178.          i = 0;                //从第一个字符开始显示
  179.          while(Str1[i] != '\0')  //只要没有写到结束标志,就继续写
  180.           {                                               
  181.                  WriteData(Str1[i]);   //将字符常量写入LCD
  182.                  i++;                 //指向下一个字符                               
  183.                 }
  184.                
  185.                
  186. }


  187. void display3(void)
  188. {
  189.     unsigned char i;
  190.          WriteAddress(0x80+0x41);    //写显示地址,将在第2行第1列开始显示
  191.          i = 0;                //从第一个字符开始显示
  192.          while(Str2[i] != '\0')  //只要没有写到结束标志,就继续写
  193.           {                                               
  194.                  WriteData(Str2[i]);   //将字符常量写入LCD
  195.                  i++;                 //指向下一个字符                               
  196.                 }
  197.                
  198.                
  199. }

  200. /*****************************************************
  201. 函数功能:显示电压的小数点
  202. ***************************************************/   
  203. void         display_dot(void)
  204. {         
  205.          WriteAddress(0x09);          //写显示地址,将在第1行第10列开始显示                  
  206.          WriteData('.');       //将小数点的字符常量写入LCD               
  207. }

  208. /*****************************************************
  209. 函数功能:显示电压的单位(V)
  210. ***************************************************/   
  211. void         display_V(void)
  212. {
  213.     WriteAddress(0x0e); //写显示地址,将在第2行第13列开始显示       
  214.          WriteData('V');     //将字符常量写入LCD                       
  215.                        
  216. }
  217. /*****************************************************
  218. 函数功能:显示电压的整数部分
  219. 入口参数:x
  220. ***************************************************/
  221. void display1(unsigned char x)
  222. {

  223.         WriteAddress(0x08);    //写显示地址,将在第2行第7列开始显示
  224.         WriteData(digit[x]);    //将百位数字的字符常量写入LCD
  225. }
  226. /*****************************************************
  227. 函数功能:显示电压的小数数部分
  228. 入口参数:x
  229. ***************************************************/
  230. void display2(unsigned char x)
  231. {
  232.         unsigned char i,j;
  233.         i=x/10;            //取十位(小数点后第一位)
  234.         j=x%10;            //取个位(小数点后第二位)
  235.    WriteAddress(0x0a);      //写显示地址,将在第1行第11列开始显示
  236.         WriteData(digit[i]);     //将小数部分的第一位数字字符常量写入LCD
  237.         WriteData(digit[j]);     //将小数部分的第一位数字字符常量写入LCD
  238. }
  239. main(void)
  240. {
  241.   unsigned int AD_val;    //储存A/D转换后的值
  242.   unsigned char Int,Dec;   //分别储存转换后的整数部分与小数部分
  243.    LcdInitiate();         //将液晶初始化
  244.    delaynms(50);           //延时5ms给硬件一点反应时间       
  245.    display3();
  246.         display_volt();        //显示温度说明
  247.    display_dot();         //显示温度的小数点
  248.    display_V();           //显示温度的单位
  249.    while(1)
  250.       {
  251.                   AD_val= A_D();    //进行A/D转换
  252.                  
  253.                   Int=(AD_val)/51;  //计算整数部分
  254.                   Dec=(AD_val%51)*100/51;    //计算小数部分
  255.                   display1(Int);     //显示整数部分
  256.                   display2(Dec);     //显示小数部分
  257.                   delaynms(500);     //延时250ms
  258.                 }
  259.                     
  260. }
复制代码

所有资料51hei提供下载:
单片机照度计.zip (22.06 KB, 下载次数: 9)


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

使用道具 举报

沙发
ID:552614 发表于 2019-6-24 17:00 | 只看该作者
AD转换不是应该看芯片类型吗?,我进来学习一下,不懂怎么转换
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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