自制PIC温度计电流1mA电压3V.docx
- 文档编号:4535206
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:14
- 大小:82.03KB
自制PIC温度计电流1mA电压3V.docx
《自制PIC温度计电流1mA电压3V.docx》由会员分享,可在线阅读,更多相关《自制PIC温度计电流1mA电压3V.docx(14页珍藏版)》请在冰豆网上搜索。
自制PIC温度计电流1mA电压3V
自制PIC温度计电流1Am电压3V
#include
__CONFIG(0xFF32);
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
staticvolatilebitTRISC0@(unsigned)&TRISC*8+0;
staticvolatilebitTRISC1@(unsigned)&TRISC*8+1;
staticvolatilebitTRISC2@(unsigned)&TRISC*8+2;
staticvolatilebitTRISC3@(unsigned)&TRISC*8+3;
staticvolatilebitTRISC4@(unsigned)&TRISC*8+4;
staticvolatilebitTRISC5@(unsigned)&TRISC*8+5;
staticvolatilebitTRISB0@(unsigned)&TRISB*8+0;
staticvolatilebitTRISB1@(unsigned)&TRISB*8+1;
staticvolatilebitTRISB2@(unsigned)&TRISB*8+2;
staticvolatilebitTRISB3@(unsigned)&TRISB*8+3;
staticvolatilebitTRISB4@(unsigned)&TRISB*8+4;
staticvolatilebitTRISB5@(unsigned)&TRISB*8+5;
#defineuchunsignedchar//给unsignedchar起别名uch
#defineuintunsignedint
#defineDQRC3//定义18B20数据端口
#defineDQ_DIRTRISC3//定义18B20D口方向寄存器
#defineDQ_HIGH()DQ_DIR=1//设置数据口为输入
#defineDQ_LOW()DQ_DIR=0;DQ=0//设置数据口为输出
#defineCLKRB1
#defineCLK_ON()temp=TRISB;TRISB=temp&0xfd//设置LCD时钟为输出
#defineCLK_OFF()temp=TRISB;TRISB=temp|0x02//设置LCD时钟为输入
//#defineCLK_ON()TRISB1=0
//#defineCLK_OFF()TRISB1=1
#defineHC164_ON()temp=TRISB;TRISB=temp&0xfe
#defineHC164_OFF()temp=TRISB;TRISB=temp|0x01
//#defineHC164_ON()RB0=1;TRISB0=0//164芯片加电
//#defineHC164_OFF()RB0=0;TRISB0=1//164断电
#defineHC164VCCRB0
#defineDATAD_ON()temp=TRISB;TRISB=temp&0xfb
#defineDATAD_OFF()temp=TRISB;TRISB=temp|0x04
//#defineDATAD_ON()TRISB2=0//设置LCD数据为输出
//#defineDATAD_OFF()TRISB2=1//设置LCD数据为输入
#defineDATADRB2
#defineLCD_ON()temp=TRISC;TRISC=temp&0xfe
#defineLCD_OFF()temp=TRISC;TRISC=temp|0x01
//#defineLCD_ON()TRISC0=0//设置LCD显示开
//#defineLCD_OFF()TRISC0=1//设置LCD显示关
#defineLCDCOMRC0
bank1unsignedcharTLV=0;//采集到的温度高8位
bank1unsignedcharTHV=0;//采集到的温度低8位
bank1unsignedcharTZ=0;//转换后的温度值整数部分
bank1unsignedcharTX=0;//转换后的温度值小数部分
bank1unsignedintwd;//转换后的温度值BCD码形式
bank1unsignedchartemp;
bank1unsignedcharshi;//整数十位
bank1unsignedcharge;//整数个位
bank1unsignedcharshifen;//十分位
bank1unsignedcharbaifen;//百分位
bank1unsignedcharqianfen;//千分位
bank1unsignedcharwanfen;//万分位
bank1bitflag=0;//用于标志是否是负的度数
//LED共阴
constunsignedcharTABLE[]={0x77,0x14,0xB3,0xB6,0xD4,0xE6,0xE7,0x34,0xF7,0xF6};
//0-9的显示代码
//自己的
//constunsignedcharTABLE[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//0-9的显示代码
/****************************************************************************
*名称:
delay()
*功能:
延时函数
*入口参数:
charx,chary
*出口参数:
*说明:
其指令时间为:
7+(3*(Y-1)+7)*(X-1)
如果再加上函数调用的call指令、页面设定、传递参数花掉的7个指令。
则是:
14+(3*(Y-1)+7)*(X-1)
****************************************************************************/
voiddelay(unsignedcharx,unsignedchary)
{
do
{
do{NOP();}
while(--y);
}
while(--x);
}
voiddelay1(unsignedcharx)
{
dox--;
while(x);
}
/****************************************************************************
*名称:
display(unsingedchari,unsignedcharj,unsignedchark)
*功能:
数码管显示
*入口参数:
*出口参数:
*说明:
****************************************************************************/
voiddisplay(unsignedchari,unsignedcharj,unsignedchark)
{
unsignedcharm,n,l;
HC164_ON();//HC164加电
HC164VCC=1;
LCD_OFF();//LCD关
DATAD_ON();//显示数据开
CLK=0;//显示时钟置0
CLK_ON();//显示时钟开
//for(n=14;n!
=0;n--)
{
m=TABLE[k];//第1位显示
for(l=8;l!
=0;l--)
{
DATAD=m&0x01;
CLK=0;
CLK=1;
m=m>>1;
}
m=TABLE[j]|0x08;//第2位显示
for(l=8;l!
=0;l--)
{
DATAD=m&0x01;
CLK=0;
CLK=1;
m=m>>1;
}
m=TABLE[i];
for(l=8;l!
=0;l--)
{
DATAD=m&0x01;
CLK=0;
CLK=1;
m=m>>1;
}
LCDCOM=0;
LCD_ON();//开LCD
delay(2,150);//2ms
}
LCD_OFF();//关LCD
//for(n=14;n!
=0;n--)
{
m=~TABLE[k];//第1位显示
for(l=8;l!
=0;l--)
{
DATAD=m&0x01;
CLK=0;
CLK=1;
m=m>>1;
}
m=~(TABLE[j]|0x08);//第2位显示
for(l=8;l!
=0;l--)
{
DATAD=m&0x01;
CLK=0;
CLK=1;
m=m>>1;
}
m=~TABLE[i];
for(l=8;l!
=0;l--)
{
DATAD=m&0x01;
CLK=0;
CLK=1;
m=m>>1;
}
LCDCOM=1;
LCD_ON();//开LCD
delay(2,150);
//delay(5,10);
}
LCD_OFF();//关LCD
HC164VCC=0;
HC164_OFF();
}
/****************************************************************************
*名称:
reset()
*功能:
复位DS18B20
*入口参数:
*出口参数:
*说明:
****************************************************************************/
//32.768kHz
/*voidreset()
{
unsignedcharpresence=1;
while(presence)
{
DQ_LOW();//主机拉至低电平
delay1(3);//延时503us//520us
DQ_HIGH();//释放总线等电阻拉高总线,并保持15~60us
NOP();NOP();NOP();NOP();//延时70us//80us
if(DQ==1)presence=0;//没有接收到应答信号,继续复位
elsepresence=0;//接收到应答信号
delay1
(1);//延时430us//480us
}
}*/
//4MHz
voidreset()
{
unsignedcharpresence=1;
while(presence)
{
DQ_LOW();//主机拉至低电平
delay(1,95);//延时503us//498us
DQ_HIGH();//释放总线等电阻拉高总线,并保持15~60us
delay(1,10);//延时70us//72us
if(DQ==1)presence=0;//没有接收到应答信号,继续复位
elsepresence=0;//接收到应答信号
delay(1,82);//延时430us//433us
delay(1,1);
delay(1,1);
}
}
/****************************************************************************
*名称:
write_byte()
*功能:
写18b20写字节
*入口参数:
uchval待写的数据
*出口参数:
*说明:
****************************************************************************/
//32.768KHz
/*voidwrite_byte(uchval)
{
uchi;
uchtemp;
for(i=8;i>0;i--)
{
temp=val&0x01;//最低位移出
if(temp==1)
{
DQ_LOW();//从高拉至低电平,产生写时间隙
DQ_HIGH();//如果写1,拉高电平
}
else
DQ_LOW();
temp=1;
NOP();NOP();NOP();//延时63us//60us
DQ_HIGH();
val=val>>1;//右移一位
}
}*/
//4MHz
voidwrite_byte(uchval)
{
uchi;
uchtemp;
for(i=8;i>0;i--)
{
temp=val&0x01;//最低位移出
DQ_LOW();
NOP();NOP();NOP();NOP();NOP();//从高拉至低电平,产生写时间隙
if(temp==1)DQ_HIGH();//如果写1,拉高电平
temp=1;
delay(1,8);//延时63us
DQ_HIGH();
NOP();NOP();
val=val>>1;//右移一位
}
}
/****************************************************************************
*名称:
read_byte()
*功能:
18b20读字节
*入口参数:
*出口参数:
读出18B20的内容
*说明:
****************************************************************************/
//32.768KHz
/*uchread_byte()
{
uchi;
uchvalue=0;//读出温度
staticbitj;
for(i=8;i>0;i--)
{
value>>=1;
DQ_LOW();
//NOP();NOP();NOP();NOP();NOP();NOP();//6us
DQ_HIGH();//拉至高电平
//NOP();NOP();NOP();NOP();//4us
j=DQ;
if(j)value|=0x80;
//delay(1,8);//63us
}
return(value);
}*/
//4MHz
uchread_byte()
{
uchi;
uchvalue=0;//读出温度
staticbitj;
for(i=8;i>0;i--)
{
value>>=1;
DQ_LOW();
NOP();NOP();NOP();NOP();NOP();NOP();//6us
DQ_HIGH();//拉至高电平
NOP();NOP();NOP();NOP();//4us
j=DQ;
if(j)value|=0x80;
delay(1,8);//63us
}
return(value);
}
/****************************************************************************
*名称:
main()
*功能:
主函数
*入口参数:
*出口参数:
*说明:
****************************************************************************/
voidmain()
{
unsignedcharm1=0;//调用系统初始化函数
unsignedchari1;
while
(1)
{
OPTION=0XC0;
DQ_HIGH();
reset();//复位等待从机应答
write_byte(0XCC);//忽略ROM匹配
write_byte(0X44);//发送温度转化命令
//m=2;
//for(i=1;i!
=0;i--)
/**/if(m1+2==9)
m1=0;
{
RB4=flag;//显示度数符号
//display(m1,m1+1,m1+2);//调用多次显示函数,确保温度转换完成所需要的时间
for(i1=30;i1!
=0;i1--)
display(shi,ge,shifen);
m1++;
}
/**/reset();//再次复位,等待从机应答
write_byte(0XCC);//忽略ROM匹配
write_byte(0XBE);//发送读温度命令
TLV=read_byte();//读出温度低8
THV=read_byte();//读出温度高8位
DQ_HIGH();//释放总线
if(THV>127)
{
THV=255-THV;
TLV=256-TLV;
flag=1;
}
else
{
flag=0;
}
TZ=(TLV>>4)|(THV<<4)&0X3f;//温度整数部分
TX=TLV<<4;//温度小数部分
if(TZ>100)TZ/100;//不显示百位
ge=TZ%10;//整数部分个位
shi=TZ/10;//整数十位
wd=0;
if(TX&0x80)wd=wd+5000;
if(TX&0x40)wd=wd+2500;
if(TX&0x20)wd=wd+1250;
if(TX&0x10)wd=wd+625;//以上4条指令把小数部分转换为BCD码形式
shifen=wd/1000;//十分位
baifen=(wd%1000)/100;//百分位
qianfen=(wd%100)/10;//千分位
wanfen=wd%10;//万分位
NOP();
//display();//调用结果显示函数
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自制 PIC 温度计 电流 mA 电压