📄 text1.c
字号:
#include <AT89X51.H>
#include <intrins.h>
//#define unchar unsigned char
typedef unsigned char unchar;
unchar show[4]={1,2,3,4};
unchar code showtap[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0,1,2...显示代码
unchar b=0;
sbit DQ=P2^5;
bit flag_1820_1;
bit flag_1820_2;
void delay_ms(unsigned char time);
void ledshow(void);
void keypress(void);
void init(void);
void gettemp();
void init1820(void);
void write1820(unchar);
unsigned char read1820(void);
void delay_us(unchar);
main()
{ //unsigned char i;
//init();
while(1)
{ gettemp();
ledshow();
keypress();
}
}
//****************LED显示程序**************
//led 是共阴的 ,P2.0,2.1,2.2,2.3分别控制1234
void ledshow()
{
unchar i,j;
j=0xf7; //位选
P0=0;
P2=0xff;
_nop_();
_nop_();
for(i=0;i<4;i++)
{
P0=showtap[show[3-i]]; //直接转换成显示的LED码
P2=j>>i;
delay_ms(2);
P2=0xff;
}
}
//***********************************************
//////////*************键盘程序****************
void keypress()
{
unchar a,i,j=0xfe;
for(i=0;i<4;i++)
{
P1=(j<<i)|(j>>(8-i)); //输出扫描码
delay_ms(2);
a=P1;
if((a&0xf0)!=0xf0)
{
delay_ms(2);
a=P1;
if((a&0xf0)!=0xf0)
{
switch(~((j<<i)|(j>>(8-i))))
{
case 1: switch(~((a>>4)|0xf0))
{
case 1: show[b]=0;break;
case 2: show[b]=1;break;
case 4: show[b]=2;break;
case 8: show[b]=3;break;
}
break;
case 2: switch(~((a>>4)|0xf0))
{
case 1: show[b]=4;break;
case 2: show[b]=5;break;
case 4: show[b]=6;break;
case 8: show[b]=7;break;
}
break;
case 4: switch(~((a>>4)|0xf0))
{
case 1: show[b]=8;break;
case 2: show[b]=9;break;
case 4: show[b]=10;break;
case 8: show[b]=11;break;
}
break;
case 8: switch(~((a>>4)|0xf0))
{
case 1: show[b]=12;break;
case 2: show[b]=13;break;
case 4: show[b]=14;break;
case 8: show[b]=15;break;
}
break;
}
b++;
if(b==4)
b=0;
}
}
while((a&0xf0)!=0xf0)
{
a=P1;
}
}
}
//***************************************
//*******************DS18B20***************
void gettemp()
{ unsigned int tp;
init1820();
write1820(0xcc);
// delay_ms(2);
write1820(0x44);
// _nop_();
// DQ=1;
// delay_ms(250); //多个1820时要延时,单个就不用,数据手册里看
// delay_ms(250);
// delay_ms(250);
init1820();
write1820(0xcc);
write1820(0xbe);
show[0]=read1820();
show[1]=read1820();
init1820();
tp=show[1]*256+show[0];
tp=tp>>4;
show[0]=(unsigned char)(tp/10);
show[1]=(unsigned char)(tp%10);
}
//********************1820初始化,读和写的子程序,延时
//*******initial**********
void init1820()
{
DQ = 1; _nop_();
DQ = 0; //拉低数据线,准备Reset OneWire Bus;
delay_us(125); //延时510us,Reset One-Wire Bus.
delay_us(125);
DQ = 1; //提升数据线;
delay_us(15); //延时35us;
while(DQ) //等待Slave 器件Ack 信号;
{ _nop_(); }
delay_us(60); //延时125us;
DQ = 1; //提升数据线,准备数据传输;
}
//******write********
void write1820(unchar a)
{
unchar i;
for(i=0;i<8;i++)
{if(a & 0x01) //低位在前;
{DQ = 0; //结束Recovery time;
_nop_();_nop_();_nop_();
DQ = 1; } //发送数据;
else
DQ = 0; //结束Rec time;
_nop_();_nop_();_nop_();
//DQ = 0; } //发送数据;
delay_us(30); //等待Slave Device采样;
DQ = 1; //Recovery;
_nop_(); //Recovery Time Start;
a >>= 1;
}
}
//*******read************
unsigned char read1820(void)
{
unsigned char i;
unsigned char tmp=0;
DQ = 1; _nop_(); //准备读;
for(i=0;i<8;i++)
{
tmp >>= 1; //低位先发;
DQ = 0; //Read init;
_nop_(); //2ms;
DQ = 1; //必须写1,否则读出来的将是不预期的数据;
delay_us(2); //延时9us;
_nop_();
if(DQ) //在12us处读取数据;
tmp |= 0x80;
delay_us(30); //延时55us;
DQ = 1; _nop_(); //恢复One Wire Bus;
}
return tmp; }
//**************************延时程序,一个是1us的延时。一个是1ms的延时 **************
void delay_us(unchar a)//when crystal is 12M ,a*2+5 us ,子程序调用要5us,while 就等于DJNZ指令
{
while(--a);
}
void delay_ms(unchar a)
{
unchar i,j;
for(i=0;i<a;i++)
for(j=0;j<200;j++)
{
_nop_();
_nop_();
}
}
//**********************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -