找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+XPT2046 ADC+DS18B20温度采集和电源电压采集程序

[复制链接]
跳转到指定楼层
楼主
本项目基于C51的DS18B20温度采集和电源电压采集

单片机源程序如下:
  1. #include "public.h"
  2. #include "lcd1602.h"
  3. #include "xpt2046.h"
  4. #include "intrins.h"
  5. #include "ds18b20.h"
  6. #include "key.h"
  7. void main()
  8. {        
  9.         int i=0,key=0;
  10. //        float adc_vol;//电压值
  11.         float adc_elec;//电量
  12.         int temp_value;//温度值
  13.         u16 adc_value;//ADC获取数据(12位)
  14. //        u8 temp_buf[5];
  15. //        u8 adc_buf[3];
  16.         ds18b20_init();//初始化S18B20
  17.         LCD_Init();//LCD1602初始化
  18.         LCD_ShowString(2,0,"Temp:");
  19.         LCD_ShowString(1,0,"Elec:");
  20.         while(1)
  21.         {
  22.                 key=key_scan(0);//不需要连续扫描按键
  23.                 if(key==KEY1_PRESS)//检测按键K1是否按下
  24.                         LED1=!LED1;//LED1状态翻转
  25.                 i++;
  26.                 if(i%50==0)//间隔一段时间读取温度值
  27.                         temp_value=ds18b20_read_temperture()*10;//保留
  28.                 if(temp_value<0)//如果温度为负,需要转换为正
  29.                 {
  30.                         temp_value=-temp_value;
  31.                 }
  32.                 adc_value=xpt2046_read_adc_value(0xE4);//测量外部输入通道AIN3(见PPT 7)
  33.                 adc_elec=(13.0*adc_value/4096-10.5)/(13.0-10.5)*100;
  34.                 LCD_ShowNum(1,6,adc_elec,2);//显示电压值
  35.                 delay_ms(10);
  36.                 LCD_ShowNum(2,6,temp_value,3);//显示温度值
  37.         }        
  38. }
复制代码
  1. #include "xpt2046.h"
  2. #include "intrins.h"

  3. //XPT2046写数据
  4. void xpt2046_wirte_data(u8 dat)
  5. {
  6.         u8 i;
  7.         CLK = 0;//时钟拉低
  8.         _nop_();
  9.         for(i=0;i<8;i++)//循环8次,每次传输一位,共一个字节,写入是写8位的,一般写入的是命令,命令是8位的
  10.         {
  11.                 DIN = dat >> 7;//先传高位再传低位
  12.                 dat <<= 1;//将低位移到高位,左移一位,最高位变为最低位
  13.                 CLK = 0;//CLK由低到高产生一个上升沿,从而写入数据(PPT 8)根据时序图写
  14.                 _nop_();        
  15.                 CLK = 1;//拉高,便于下次数据传入
  16.                 _nop_();
  17.         }
  18. }
  19. //XPT2046读数据
  20. u16        xpt2046_read_data(void)
  21. {
  22.         u8 i;
  23.         u16 dat=0;
  24.         CLK = 0;
  25.         _nop_();
  26.         for(i=0;i<12;i++)//循环12次,每次读取一位,大于一个字节数,所以返回值类型是u16
  27.         {
  28.                 dat <<= 1;
  29.                 CLK = 1;
  30.                 _nop_();
  31.                 CLK = 0; //CLK由高到低产生一个下降沿,从而读取数据
  32.                 _nop_();
  33.                 dat |= DOUT;//先读取高位,再读取低位。这里采用或运算读取数据(PPT(9))
  34.         }
  35.         return dat;        
  36. }
  37. //XPT2046读AD数据
  38. u16 xpt2046_read_adc_value(u8 cmd)
  39. {
  40.         u8 i;
  41.         u16 adc_value=0;

  42.         CLK = 0;//先拉低时钟
  43.         CS  = 0;//使能XPT2046
  44.         xpt2046_wirte_data(cmd);//发送命令字
  45.         for(i=6; i>0; i--);//延时等待转换结果
  46.         CLK = 1;
  47.         _nop_();
  48.         CLK = 0;//发送一个时钟,清除BUSY,这里根据时序图,PPT(9)
  49.         _nop_();
  50.         adc_value=xpt2046_read_data();//这里将读取的数据放入adc_value中,这里读取的数据并不是电压,二是12位的数据
  51.         CS = 1;//关闭XPT2046
  52.         return adc_value;
  53. }
复制代码


Keil代码下载:
Y.zip (223.62 KB, 下载次数: 39)



评分

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

查看全部评分

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

使用道具 举报

沙发
ID:1023274 发表于 2022-5-19 20:56 | 只看该作者
你好,请问有Proteus电路图文件吗?
回复

使用道具 举报

板凳
ID:1022479 发表于 2022-6-12 20:40 | 只看该作者
我不会单片机123 发表于 2022-5-19 20:56
你好,请问有Proteus电路图文件吗?

xpy2046我在protues里没找到,不知道为啥
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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