|
#include <STC89C51.H>
#include <INTRINS.H>
#include "absacc.h"
#include "max7219.h"
#define uint unsigned int
#define uchar unsigned char
/*定义7219口*/
sbit load=P1^0;
sbit din= P1^2;
sbit clk= P1^1;
/*串口接收定义*/
uchar j=0;
// uchar b;
char jie[4];
//char code str[] = "Welcome! \n\r";
/*有关ds18b20的定义*/
sbit DQ=P1^3; //c51与DS18B20通信口
unsigned char tempL=0; //温度低八位
unsigned char tempH=0; //温度高八位
float temperature; //显示温度值
/*有关显示的定义*/
uchar display[4];//键盘输入显示
uchar tm[4];//要显示的温度
uchar key;//键盘返回值
/*定义函数*/
void write7219 (uchar address,uchar dat);//向max7219写8位数据
void initia7219(void);//初始化max7219
uchar kbscan(void); //键盘扫描函数
void delay (uchar m);//去抖延时子程序
void sent(void); //串口发送子程序
void tempDisplay();//显示温度子程序
void ds18b20_delay(unsigned int time);
Init_DS18B20(void); //初始化ds18b20
ReadOneChar(void); // 从ds18b20读取一个字节
WriteOneChar(unsigned char dat); //向ds18b20写一个字节
ReadTemperature(void); //从ds18b20读取温度
/*****************************************
写数据到max7219并显示
*****************************************/
void write7219 (uchar address,uchar dat)
{
uchar i;
load=0;
for(i=0;i<8;i++)
{
clk=0;
din=(bit)(address&0x80);
address<<=1;
clk=1;
}
for(i=0;i<8;i++)
{
clk=0;
din=(bit)(dat&0x80);
dat<<=1;
clk=1;
}
load=1;
}
/*****************************************
初始化max7219
*****************************************/
void initia7219(void)
{
write7219(shut_down,0x01);
write7219(display_test,0x00);
write7219(decode_mode,0xff);
write7219(scan_limit,0x03);
write7219(intensity,0x04);
}
/**************************************
显示键盘输入到显存的内容
**************************************/
void disp(uchar dd)
{
display[3]=display[2];
display[2]=display[1];
display[1]=display[0];
display[0]=dd;
write7219(4,display[0]);
write7219(3,display[1]);
write7219(2,display[2]);
write7219(1,display[3]);
}
/************************************
清除显存及led屏
*************************************/
void clr(void)
{
display[3]=0;
display[2]=0;
display[1]=0;
display[0]=0;
write7219(1,0);
write7219(2,0);
write7219(3,0);
write7219(4,0);
}
/****************************************
串口初始化
*****************************************/
serial_init ()
{
TMOD=0x20;//在12M下,设置串口2400波特率,方式3 00100000B使用定时器0,M1M0=10,常数自动装入的8位定时器,
TL1=0xf3;//常数为0xf3,波特率为2400
TH1=0xf3;
SCON=0xd8; // 串行口控制寄存器11011000B,方式3
PCON=0x00;// 电源控制寄存器0000 0000B,
TR1=1;
ES=1;
EA=1;
}
/*****************************************
串口中断服务程序
******************************************/
com_ino() interrupt 4 using 1
{
if(RI)
{
jie[j]=SBUF;
RI=0;
j++;
if(j>3)
{
j=0;
}
write7219(1,jie[0]);
write7219(2,jie[1]);
write7219(3,jie[2]);
write7219(4,jie[3]);
}
else if(TI)
{
uchar mm=4;
TI=0;
while(mm!=0)
{
--mm;
SBUF=display[mm];
while(!TI);
TI=0;
}
/*uchar i=0;
TI=0;
while(str[i]!='\0')
{
SBUF=str[i];
while(!TI);
TI=0;
i++; }
/*TI=0;
SBUF=b;
while(!TI);
TI=0;*/
}
}
/************************************
主程序
************************************/
void main(void)
{
initia7219();//初始化7219
clr();
serial_init();//初始化串口
while(1)
{
P0=0xf0;
if(P0!=0xf0)
{
delay(20);
if(P0!=0xf0)
{
key=kbscan();
if(key>=0&key<10)
{
disp(key);
}
switch (key)
{
case 10:
{
for(j=0;j<=3;j++)
{
jie[j]=0;
}
write7219(1,0);
write7219(2,0);
write7219(3,0);
write7219(4,0);
break;
}
case 11:
break;
case 12:
break;
case 13:
clr();
break;
case 14:
tempDisplay();
break;
case 15:
sent();
break;
default:
break;
}
while(P0!=0xf0)
{;}
delay(10);
}
}
}
}
/*******************************************************
显示温度子程序
*******************************************************/
void tempDisplay(void)
{
uchar k;
while(P0!=0xf0)
{
P0=0xf0;
}
while(P0==0xf0)
{
ReadTemperature();
if(temperature>=0)
{
tm[0]=(int)(temperature/100);
tm[1]=((int)(temperature)%100)/10;
tm[2]=(((int)temperature)%10)|0x80;
tm[3]=((int)(temperature*10))%10;
k=0;
}
else
{
tm[0]='-';
tm[1]=((int)(temperature)%100)/10;
tm[2]=(((int)temperature)%10)|0x80;
tm[3]=((int)(temperature*10))%10;
k=1;
}
write7219(1,tm[0]);
write7219(2,tm[1]);
write7219(3,tm[2]);
write7219(4,tm[3]);
}
}
/*******************************************************
去抖延时子程序
********************************************************/
void delay (uchar m)
{
uchar n;
for(;m>0;m--)
{
n=255;
while (--n);
}
}
/****************************************************
数据发送程序
****************************************************/
void sent(void)
{
TI=1;
/*uchar mm=4;
while(mm!=0)
{
SBUF=display[mm];
while(!TI);
TI=0;
mm--;
}*/
}
void ds18b20_delay(unsigned int time) //延时
{
unsigned int n;
n=0;
while(n<time) n++;
return;
}
Init_DS18B20(void) //初始化
{
unsigned char x=0;
DQ=1;
ds18b20_delay(8);
DQ=0;
ds18b20_delay(85);
DQ=1;
ds18b20_delay(14);
x=DQ;
ds18b20_delay(20);
}
ReadOneChar(void) //读一个字节
{
unsigned char i=0;
unsigned char dat=0;
for (i=8;i>0;i--)
{
DQ=1;
ds18b20_delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ) dat|=0x80;
ds18b20_delay(4);
}
return(dat);
}
WriteOneChar(unsigned char dat) //写一个字节
{
unsigned char i=0;
for (i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
ds18b20_delay(5);
DQ=1;
dat>>=1;
}
ds18b20_delay(4);
}
ReadTemperature(void) //读取温度
{
char ctempL,ctempH;
Init_DS18B20();
WriteOneChar(0xcc);
WriteOneChar(0x44); //启动温度转换
ds18b20_delay(125);
Init_DS18B20();
WriteOneChar(0xcc);
WriteOneChar(0xbe); //读取暂存器内容
tempL=ReadOneChar();//读取温度低字节
tempH=ReadOneChar();
if(tempH<0xf8) //温度是否小于零
temperature=((tempH*256)+tempL)* 0.0625;//大于零
else
{
ctempL=tempL;
ctempH=tempH;
temperature=(((~ctempH)*256)+(~ctempL)+1)* 0.0625;
temperature=-temperature;
}
ds18b20_delay(200);
return(temperature);
}
#include <STC89C51.H>
#include <INTRINS.H>
#define uint unsigned int
#define uchar unsigned char
uchar keyb;
uchar temp,num;
/*******************************************************
去抖延时子程序
********************************************************/
void m_delay (uchar m)
{
uchar n;
for(;m>0;m--)
{
n=255;
while (--n);
}
}
/*******************************************************
键盘扫描子程序
********************************************************/
uchar kbscan(void) //键盘扫描子程序
{
if(P0!=0xf0)
//while (P0!=0xf0)
{
P0=0xfe;
temp=P0;
temp=temp&0xf0;
if(temp!=0xf0)
{
m_delay(20);
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0: num=7;keyb=1;
break;
case 0xd0: num=8;keyb=1;
break;
case 0xb0: num=9;keyb=1;
break;
case 0x70: num=10;keyb=0;
break;
default: num=17;
break;
}
}
}
P0=0xfd;
temp=P0;
temp=temp&0xf0;
if(temp!=0xf0)
{
m_delay(20);
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0: num=4;keyb=1;
break;
case 0xd0: num=5;keyb=1;
break;
case 0xb0: num=6;keyb=1;
break;
case 0x70: num=11;keyb=0;
break;
default: num=17;
break;
}
}
}
P0=0xfb;
temp=P0;
temp=temp&0xf0;
if(temp!=0xf0)
{
m_delay(20);
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0: num=1;keyb=1;
break;
case 0xd0: num=2;keyb=1;
break;
case 0xb0: num=3;keyb=1;
break;
case 0x70: num=12;keyb=0;
break;
default: num=17;
break;
}
}
}
P0=0xf7;
temp=P0;
temp=temp&0xf0;
if(temp!=0xf0)
{
m_delay(20);
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0: num=13;keyb=2;
break;
case 0xd0: num=0;keyb=1;
break;
case 0xb0: num=14;keyb=3;
break;
case 0x70: num=15;keyb=4;
break;
default: num=17;
break;
}
}
}
}
return num;
}