|
单片机制作个数字温度计之前也做过,用洞洞版搭的,这次用覆铜板做个。
芯片:pic16f73
传感器;ds18b20
-55~125度
/***************以下是代码******************/
#include <pic.h>
__CONFIG(0x3B31);
//关闭看门狗,选择高速晶振,上电延时复位,掉电复位使能,代码保护
#define uchar unsigned char
#define uint unsigned int
#define pinDIN RA2 //串行数据输入端
#define pinLOAD RA1 //数据锁存端
#define pinCLK RA3 //时钟
#define DQ RC2
#define DQ_in TRISC2=1
#define DQ_LOW() TRISC2=0;DQ=0
#define DQ_HIGH() TRISC2=1
#define LED RC0
void display(uchar num1,uchar num2,uchar num3,uchar num4);
#define _nop_() asm("nop")
uchar const LEDcode[]=
{0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b, /*0,1,2,3,4,5,6,7,8,9,全灭*/
0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff, }; /*A,B,C,D,E,F,P,U,全亮*/
/*********************/
const unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极
//const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极
//带小数点字码
const uchar table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //共阳极
//const uchar table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87, 0xff,0xef}; //共阴极
uint temper;
uchar flag_fu=0; //温度正负值标志位
uchar a1,a2,a3,a4,a5;
//uchar w1,w2,w3,w4;
void delay(uint x);
void delayus(uint ,uchar );
void init();
void reset();
uchar m=0;
char w=0;
void write_byte(uchar date);
uchar read_byte();
void get_tem();
void disp();
void display();
void sendword (uchar addr,uchar dat);
void sendbyte (uchar dat);
void init7219 (void);
void timer1_init();
uchar counter=0;
/****************************************/
void main()
{
//int result=0x00;
//uchar i;
init();
//init7219();/********************/guan
sendword (0x0f,0x01);
delay(500);
// clear7219();
sendword (0x0f,0x00);
delay(5);
init();
write_byte(0x10);
timer1_init();
LED=1;
while(1)
{
// uchar num;
get_tem();
//for(num=50;num>0;num--);
// disp(a1,a2,a3,a4);
/*** if(w==1)
{
LED1=0;
w=0;
}
else LED1=1;
***********/
}
}
/************************************/
void delay(uint x)
{
unsigned int a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void init()
{
ADCON1=0x06; //a口设为普通口
TRISB=0x00;
// TRISD=0x00;
TRISC=0X00;
TRISA=0x00;
PORTC=0xFF;
// PORTA=0x00;
//PORTD=0x00;
delay(1000);
//PORTA=0xff;
PORTC=0x00;
}
/****************************/
void timer1_init()
{
GIE=1;
PEIE=1;
T1CKPS0=1;T1CKPS1=1; //1:8
TMR1CS=0;
TMR1IE=1;
TMR1ON=1;
TMR1H=0xfb;
TMR1L=0x1e;
}
void interrupt ISR(void)
{
if(TMR1IF==1)
{
TMR1IF=0;
TMR1H=0xfb;
TMR1L=0x1e;
if(++counter>=100)
{
// w=1;
LED=~LED;
counter=0;
}
return;
}
}
/****************************/
void delayus(uint x,uchar y)
{
uint i;uchar j;
for(i=x;i>0;i--)
for(j=y;j>0;j--) ;
}
void reset()
{
uchar st=1;
DQ_HIGH();
NOP();NOP();
while(st)
{
DQ_LOW();
delayus(15,10);//750us
DQ_HIGH();
delayus(3,2);//70us
st=DQ;
if(DQ==1)
st=1;
else
st=0;
delayus(11,10);//500us
}
}
void write_byte(uchar date)
{
uchar i,temp;
DQ_HIGH();
NOP();NOP();
for(i=8;i>0;i--)
{
temp=date&0x01;
DQ_LOW();
delayus(0,0);
if(temp==1)
DQ_HIGH();
delayus(2,1);//45us
DQ_HIGH();
date=date>>1;
}
}
uchar read_byte()
{
uchar i,date;
static bit j;
for(i=8;i>0;i-- )
{
date=date>>1;
DQ_HIGH();
NOP();NOP();
DQ_LOW();
NOP();NOP(); NOP();NOP(); NOP();NOP();
DQ_HIGH();
NOP();NOP(); NOP();NOP(); NOP();
j=DQ;
if(j==1)
date=date|0x80;
delayus(1,1);
}
return(date);
}
void get_tem()
{
uchar tem1,tem2;
// RC3=1;
GIE=0;
reset();
write_byte(0xCC);
write_byte(0x44);
GIE=1;//
// delayus(2,2);//600us(60,15)
/// disp(a1,a2,a3,a4,a5); ////
display(a1,a2,a3,a4); /////////
GIE=0;//
reset();
write_byte(0xCC);
GIE=1;//
delayus(2,1);
GIE=0;//
write_byte(0xBE);
tem1=read_byte();
tem2=read_byte();
temper = ((tem2<<4)&0xF0)|((tem1>>4)&0x0F);
GIE=1;//
if(temper>127)
{
//temper = ~temper + 1;
flag_fu=1;
}
else
{
flag_fu=0;
}
/*
if(temper&0x8000)
{
temper=~temper;
temper+=1;
flag_fu=1;
}
else
{
flag_fu=0;
}
*/
temper=(tem2*256+tem1)*6.25;
if(flag_fu==1)
{ temper = ~temper + 1;}
if(temper>10000)
{
a1=temper/10000;
a2=temper%10000/1000;
a3=temper%1000/100;
a4=temper%100/10;
a5=(temper%10);
m=1;
}
else
{
a1=temper/1000;
a2=temper%1000/100;
a3=temper%100/10;
a4=temper%10;
a5=(temper%5);
m=0;
}
/*************
a1=temper/1000;
a2=temper%1000/100;
a3=temper%100/10;
a4=temper%10;
a5=(temper%5);
*****************/
//RC3=0;
}
/**************************************************
* 向MAX7219写入字节(8位)函数 *
***************************************************/
void sendbyte (uchar dat)
{
uchar i,temp;
_nop_();
for (i=0;i<8;i++)
{
temp=dat&0x80;
dat=dat<<1;
if(temp)
pinDIN=1;
else
pinDIN=0;
pinCLK=0;
_nop_();
pinCLK=1;
}
}
/**************************************************
* 向MAX7219写入地址和控制字(16位) *
***************************************************/
void sendword (uchar addr,uchar dat)
{
pinLOAD=0;
_nop_();
sendbyte (addr);
_nop_();
sendbyte (dat);
_nop_();
pinLOAD=1; //第16个上升沿之后,第17个上升沿之前必须把pinCLK置高,否则数据丢失
}
/**************************************************
* MAX7219初始化 *
***************************************************/
void init7219 (void)
{
sendword (0x0c,0x01); /* 设置电源工作模式 */
sendword (0x0a,0x04); /* 设置亮度 19/32 */
sendword (0x0b,0x07); /* 设置扫描界限 */
sendword (0x09,0x00); /* 设置译码模式 */
sendword (0x0f,0x00); /*显示测试 00为正常工作状态*/
}
/**************************************************
* MAX7219清除显示 *
***************************************************/
void clear7219(void)
{
uchar i;
for(i=8;i>0;i--)
{
sendword(i,0x00);
}
}
void disp()
{
if(m==1)
{
// clear7219();
sendword(0x01,LEDcode[a5]);
delay(2) ;
sendword(0x02,LEDcode[a4]); //|0x80;XIAOSHU
delay(2) ;
sendword(0x03,LEDcode[a3]|0x80);
delay(2) ;
sendword(0x04,LEDcode[a2]);
delay(2) ;
sendword(0x05,LEDcode[a1]);
//sendword(0x06,LEDcode[3]);
// sendword(0x07,LEDcode[2]);
//sendword(0x08,LEDcode[1]);
delay(2) ;
}
else if(m==0)
{
// clear7219();
sendword(0x01,LEDcode[a5]);
delay(2) ;
sendword(0x02,LEDcode[a4]); //|0x80;XIAOSHU
delay(2) ;
sendword(0x03,LEDcode[a3]);
delay(2) ;
sendword(0x04,LEDcode[a2]|0x80);
delay(2) ;
sendword(0x05,LEDcode[a1]);
//sendword(0x06,LEDcode[3]);
// sendword(0x07,LEDcode[2]);
//sendword(0x08,LEDcode[1]);
delay(2) ;
}
}
void display(uchar num1,uchar num2,uchar num3,uchar num4)
{
if(m==1)
{
PORTB=table[num1];//段选
RC4=1; //11110111 位选
delay(3);
RC4=0;
PORTB=table[num2];
RC5=1; //11110111 位选
delay(3);
RC5=0;
PORTB=table1[num3];
RC6=1; //11110111 位选
delay(3);
RC6=0;
PORTB=table[num4];
RC7=1; //11110111 位选
delay(3);
RC7=0;
delay(3);
//PORTC&=0X0F;
}
else
{
PORTB=table[num1];//段选
RC4=1; //11110111 位选
delay(3);
RC4=0;
PORTB=table1[num2];
RC5=1; //11110111 位选
delay(3);
RC5=0;
PORTB=table[num3];
RC6=1; //11110111 位选
delay(3);
RC6=0;
PORTB=table[num4];
RC7=1; //11110111 位选
delay(3);
RC7=0;
delay(3);
//PORTC&=0X0F;
}
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|