本项目基于C51的DS18B20温度采集和电源电压采集
单片机源程序如下:
- #include "public.h"
- #include "lcd1602.h"
- #include "xpt2046.h"
- #include "intrins.h"
- #include "ds18b20.h"
- #include "key.h"
- void main()
- {
- int i=0,key=0;
- // float adc_vol;//电压值
- float adc_elec;//电量
- int temp_value;//温度值
- u16 adc_value;//ADC获取数据(12位)
- // u8 temp_buf[5];
- // u8 adc_buf[3];
- ds18b20_init();//初始化S18B20
- LCD_Init();//LCD1602初始化
- LCD_ShowString(2,0,"Temp:");
- LCD_ShowString(1,0,"Elec:");
- while(1)
- {
- key=key_scan(0);//不需要连续扫描按键
- if(key==KEY1_PRESS)//检测按键K1是否按下
- LED1=!LED1;//LED1状态翻转
- i++;
- if(i%50==0)//间隔一段时间读取温度值
- temp_value=ds18b20_read_temperture()*10;//保留
- if(temp_value<0)//如果温度为负,需要转换为正
- {
- temp_value=-temp_value;
- }
- adc_value=xpt2046_read_adc_value(0xE4);//测量外部输入通道AIN3(见PPT 7)
- adc_elec=(13.0*adc_value/4096-10.5)/(13.0-10.5)*100;
- LCD_ShowNum(1,6,adc_elec,2);//显示电压值
- delay_ms(10);
- LCD_ShowNum(2,6,temp_value,3);//显示温度值
- }
- }
复制代码- #include "xpt2046.h"
- #include "intrins.h"
- //XPT2046写数据
- void xpt2046_wirte_data(u8 dat)
- {
- u8 i;
- CLK = 0;//时钟拉低
- _nop_();
- for(i=0;i<8;i++)//循环8次,每次传输一位,共一个字节,写入是写8位的,一般写入的是命令,命令是8位的
- {
- DIN = dat >> 7;//先传高位再传低位
- dat <<= 1;//将低位移到高位,左移一位,最高位变为最低位
- CLK = 0;//CLK由低到高产生一个上升沿,从而写入数据(PPT 8)根据时序图写
- _nop_();
- CLK = 1;//拉高,便于下次数据传入
- _nop_();
- }
- }
- //XPT2046读数据
- u16 xpt2046_read_data(void)
- {
- u8 i;
- u16 dat=0;
- CLK = 0;
- _nop_();
- for(i=0;i<12;i++)//循环12次,每次读取一位,大于一个字节数,所以返回值类型是u16
- {
- dat <<= 1;
- CLK = 1;
- _nop_();
- CLK = 0; //CLK由高到低产生一个下降沿,从而读取数据
- _nop_();
- dat |= DOUT;//先读取高位,再读取低位。这里采用或运算读取数据(PPT(9))
- }
- return dat;
- }
- //XPT2046读AD数据
- u16 xpt2046_read_adc_value(u8 cmd)
- {
- u8 i;
- u16 adc_value=0;
- CLK = 0;//先拉低时钟
- CS = 0;//使能XPT2046
- xpt2046_wirte_data(cmd);//发送命令字
- for(i=6; i>0; i--);//延时等待转换结果
- CLK = 1;
- _nop_();
- CLK = 0;//发送一个时钟,清除BUSY,这里根据时序图,PPT(9)
- _nop_();
- adc_value=xpt2046_read_data();//这里将读取的数据放入adc_value中,这里读取的数据并不是电压,二是12位的数据
- CS = 1;//关闭XPT2046
- return adc_value;
- }
复制代码
Keil代码下载:
Y.zip
(223.62 KB, 下载次数: 39)
|