找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机双积分式AD转换电路源程序及Proteus仿真

  [复制链接]
跳转到指定楼层
楼主
给大家分享一个51单片机双积分式AD转换的Proteus仿真,下面是原理图:

单片机双积分式AD转换的所有资料下载(包含源程序和proteus仿真):
单片机双积分式AD转换电路源程序Proteus仿真.rar (63.1 KB, 下载次数: 170)

单片机源程序:
  1. /*-------------------------------------------------------------------
  2.                       LCD1602.c      1602用的函数
  3.       
  4.                 作者:liunian     

  5.                 邮箱:liunian_leon@sohu.com

  6.                 日期:7.13
  7.               
  8.                 版本:V1.0 适合初学者使用
  9. -------------------------------------------------------------------*/

  10. #include<reg51.h>
  11. #include<absacc.h>
  12. #include<intrins.h>


  13. #define uint unsigned int
  14. #define uchar unsigned char

  15. sbit EN=P2^2;         //使能信号
  16. sbit RW=P2^1;         //读写控制信号
  17. sbit RS=P2^0;         //数据命令选择端口
  18. sbit P34=P3^4;
  19. sbit P35=P3^5;

  20. #define D_port P0      //传送数据的端口设为P0,以上端口根据实际硬件电路图可做修改

  21. uint ss,lo,loo;
  22. uchar kl = 0;
  23. unsigned char code love[]="Dual Integral AD";
  24. unsigned char code no[]="                ";

  25. unsigned char code time[]="0123456789ABCDEF:MinHour ";

  26. unsigned char code tin[]= "Vin:";
  27. unsigned char code tvref[]="Vref:";




  28. /****************1MS延时函数******************************/

  29. void delay(unsigned int n)

  30. {

  31.     unsigned int i,j;

  32.     for(j=n;j>0;j--)

  33.     for(i=112;i>0;i--);

  34. }

  35. /*液晶***************查询液晶是否忙*************************/

  36. void Checkbusy()
  37. {   
  38.    
  39.         D_port=0xff;                   //P0全部置1,可以查询判断P0口状态,读取液晶的命令
  40.         RS=0;
  41.         RW=1;
  42.         EN=1;
  43.         _nop_();                       //读液晶命令时各控制位的状态几时序
  44.         while(D_port&0x80)             //判断最高位状态,最高位是液晶忙的状态位
  45.         {
  46.                 EN=0;
  47.                 _nop_();
  48.                 _nop_();
  49.                 EN=1;
  50.                 _nop_();
  51.                 _nop_();
  52.         }                             //如果液晶忙,则循环查询
  53.         EN=0;

  54. }

  55. /*液晶***************写数据到液晶***************************/

  56. D_write(uchar a)
  57. {   
  58.      Checkbusy();        //检查忙标志位
  59.      D_port=a;
  60.      RS=1;               
  61.      RW=0;
  62.      EN=1;               //写数据各控制位的值既对应的时序
  63.      _nop_();
  64.      _nop_();
  65.      _nop_();           //发送数据,此处是发送到P0口,程序前已经定义
  66.      EN=0;
  67. }

  68. /*液晶***************写指令到液晶***************************/

  69. C_write(uchar a)
  70. {
  71.      Checkbusy();        //检查忙标志位
  72.      D_port=a;
  73.      RS=0;
  74.      RW=0;
  75.      EN=1;               //写指令各控制位的值既对应的时序
  76.      
  77.      _nop_();
  78.      _nop_();
  79.      _nop_();           //发送指令,此处是发送到P0口,程序前已经定义
  80.      EN=0;
  81. }

  82. /*液晶**************液晶初始化******************************/

  83. Initial()
  84. {
  85.      D_port=0;
  86.      delay(20);
  87.      C_write(0x38);
  88.      delay(10);
  89.      C_write(0x38);
  90.      delay(10);
  91.      C_write(0x38);
  92.      delay(10);
  93.      Checkbusy();
  94.      C_write(0x38);
  95.      Checkbusy();
  96.      C_write(0x08);        //关闭显示
  97.      Checkbusy();      
  98.      C_write(0x01);        //清屏
  99.      Checkbusy();
  100.      C_write(0x06);        //显示光标右移设置
  101.      Checkbusy();
  102.      C_write(0x0c);        //显示开,光标不显示,不闪烁
  103.      delay(5);
  104. }                          //根据1602初始化的指令顺序来初始化LCD,相关初始化步骤可查阅相关资料

  105. /*液晶**************设定显示位置函数************************/

  106. setpos(uchar posx,uchar posy)
  107. {
  108.      posx=posx&0xf;                         //将显示在第几位置转为二十六进制,每行总共16个位置
  109.      posy=posy&0x1;                         //设置显示在第几行
  110.      C_write(posx|posy*0x40+0x80);          //设置位置命令最高位必须为一,所以要加0x80
  111. }


  112. /*液晶**************显示一个字符子程序**********************/

  113. displaychar(uchar x,uchar y,uchar a)
  114. {   
  115.      Checkbusy();          //检查忙标志位
  116.      setpos(x,y);          //设置显示位置
  117.      D_write(a);           //将要显示的数据写到液晶
  118. }

  119. /*液晶**************显示一串字符串**************************/

  120. displaystring(uchar x,uchar y,unsigned char code *string)
  121. {
  122.      uchar length=0;       //定义一个字符串长度
  123.      Checkbusy();         
  124.      while(string[length]!='\0')     //字符串是以'\0'结束的,因此只要每结束就显示下一字符
  125.      {
  126.      displaychar(x,y,string[length++]);  //显示一个字符子程序
  127.      x++;                               //液晶显示的位置+1
  128.      }
  129. }

  130. /*液晶**************显示个数**************************/

  131. void lcd_byte(unsigned char  x, unsigned char  y ,unsigned int byte_data)                //以十进制的方式显示一个字符变量
  132. {
  133.   unsigned int temp_data;  

  134.     temp_data=byte_data/10000;                            //求万位数
  135.   displaychar(x+0,y,temp_data+48);                                                  //转化为ASCII值再显示

  136.     temp_data=byte_data % 10000 /1000;                            //求千位数
  137.   displaychar(x+1,y,temp_data+48);                                                   //转化为ASCII值再显示
  138.    
  139.   temp_data=byte_data%1000/100;                            //求百位数
  140.   displaychar(x+2,y,temp_data+48);                          //转化为ASCII值再显示
  141.    
  142.   temp_data=byte_data%100/10;                          //求十位数
  143.   displaychar(x+3,y,temp_data+48);                          //转化为ASCII值再显示
  144.    
  145.   temp_data=byte_data%10;                             //求个位数
  146.   displaychar(x+4,y,temp_data+48);                          //转化为ASCII再再显示
  147.   }

  148. void my_t0(void) interrupt 1  //定时器0中断用于固定时间对输入待测电压进行积分
  149. {
  150.   TR0 = 0;    //T0中断关
  151.   P34=1;      //选择-2.5V基准
  152.   TH0 = 0;
  153.   TL0 = 0;
  154.   //lo=lo+1;
  155.   //TMOD=TMOD | 0x8;
  156.   //TF0 = 0;   //清除T0中断标志  
  157.   TR0 = 1;    //T0中断开
  158.   EX0 = 1;    //INT0中断开

  159. }

  160. void my_int0(void) interrupt 0          //外部中断 用于反积分过程结束检测
  161. {
  162.   TR0 = 0;    //T0中断关
  163.   TF0 = 0;   //清除T0中断标志
  164.   EX0 = 0;    //INT0中断关
  165.   ss = TH0 * 256 + TL0;
  166.   P34=1;   //选择-2.5V基准
  167. // P35=1;   //选择放电
  168.   TH0 = 0;
  169.   TL0 = 0;
  170.   kl = 0;
  171.   }

  172. main()
  173. {
  174. Initial();
  175. P34=1;   //选择-2.5V基准
  176. //P35=1;   //选择放电
  177. displaystring( 0, 0, love);
  178. delay(500);
  179. displaystring( 0, 0, no);
  180. displaystring( 0, 1, tvref);

  181. EA =  1;   //中断开
  182. ET0 = 1;   //定时计数0中断开        
  183. IP  = 1;    //定时0中断最高优先级 =2
  184. TMOD = 1;        //定时0模式1 2个16位定时/计数器
  185. TCON=0x00;  //INT0负边缘触发或低电平触发在此好象作用相同
  186. displaystring( 0, 0, tin);
  187. while(1)
  188. {
  189. if(kl==0)
  190. {
  191. P34=1;   //选择-2.5V基准
  192. //P35=1;   //选择放电
  193. delay(26);
  194. TMOD = 1;
  195. TH0 = 0x63;
  196. TL0 = 0xC0;
  197. //loo=loo+1;
  198. P34=0;   //选择输入电压基准
  199. //P35=0;   //选择测量
  200. kl = 1;
  201. TR0 = 1;   //定时计数0起动
  202. TF0 = 0;   //清除T0中断标志
  203. }
  204. delay(500);
  205. //lo=ss*0.0773;
  206. loo=ss-lo;
  207. if(loo>32767)
  208.   {loo=65535-loo;}
  209. lo=ss;
  210. lcd_byte(5,0,ss);
  211. lcd_byte(5,1,loo);
  212. //lcd_byte(11,1,loo);

  213. }
  214. }
复制代码

评分

参与人数 2威望 +3 黑币 +35 收起 理由
xiaogueiee + 5 共享资料的黑币奖励!
木木de + 3 + 30 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

来自 2#
ID:392914 发表于 2021-9-12 21:33 | 只看该作者
我有一只-20~100度温控仪表.型号XMTA-6000.新唐N79E825.只用二个运放.二个IO口.分别TO.RXD.进行AD转换.切断2个IO口也能自个在80度左右动态显示.一直琢磨不透该原理.望高手给指点下.
回复

使用道具 举报

板凳
ID:198395 发表于 2017-5-8 22:04 | 只看该作者
谢谢分享。
回复

使用道具 举报

地板
ID:191745 发表于 2017-6-24 15:51 | 只看该作者
片机双积分式AD转换的所有资料下片机双积分式AD转换的所有资料下片机双积分式AD转换的所有资料下
回复

使用道具 举报

5#
ID:68356 发表于 2017-6-24 19:35 | 只看该作者
感谢分享
回复

使用道具 举报

6#
ID:17144 发表于 2017-6-25 08:33 | 只看该作者
谢谢分享@
回复

使用道具 举报

7#
ID:246123 发表于 2017-11-4 22:59 | 只看该作者
谢谢!
回复

使用道具 举报

8#
ID:250483 发表于 2017-11-17 17:31 | 只看该作者
很好的程序,谢谢分享!
回复

使用道具 举报

9#
ID:282784 发表于 2018-2-7 11:00 | 只看该作者
不错。。。。
回复

使用道具 举报

10#
ID:86577 发表于 2018-4-23 17:55 | 只看该作者
不错,谢谢楼主
回复

使用道具 举报

11#
ID:325516 发表于 2018-5-8 21:52 | 只看该作者
很有用,谢谢楼主
回复

使用道具 举报

12#
ID:114814 发表于 2018-5-18 23:07 | 只看该作者
刚好需要  谢谢
回复

使用道具 举报

13#
ID:349838 发表于 2018-6-11 21:50 | 只看该作者
膜拜大佬
回复

使用道具 举报

14#
ID:351570 发表于 2018-6-14 08:42 | 只看该作者
感谢大神分享
回复

使用道具 举报

15#
ID:70035 发表于 2018-9-6 10:52 | 只看该作者
己下载仿真,确实不错。
回复

使用道具 举报

16#
ID:412379 发表于 2018-10-19 17:08 | 只看该作者
谢谢分享。
回复

使用道具 举报

17#
ID:495129 发表于 2019-3-21 08:52 | 只看该作者
谢谢分享
回复

使用道具 举报

18#
ID:536124 发表于 2019-5-12 14:46 | 只看该作者
想问问大佬,这个显示的值和真正的电压并不匹配是怎么回事?
回复

使用道具 举报

19#
ID:241434 发表于 2019-7-14 08:59 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

20#
ID:86577 发表于 2021-4-10 13:28 | 只看该作者
不错的电路
回复

使用道具 举报

21#
ID:839438 发表于 2021-9-19 14:33 | 只看该作者
不知道,有没有用先下载了再说
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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