|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
我刚刚从网络上下载的一些程序!有人可以帮我解释下其中些参数的含义吗?一开始的com1 com2 com3什么的还有后来的abcdefg具体指的什么意思!
#include
#include
void delay(unsigned int t);
unsigned char DisBuff[4];
unsigned char COM;
sbit COM1=P2^7; //定义通信端口
sbit COM2=P2^4;
sbit COM3=P2^5;
sbit COM4=P2^6;
sbit DQ=P3^7;
#define a 0x04 // AAAA
#define b 0x01 // F B
#define c 0x10 // F B
#define d 0x40 // GGGG
#define e 0x80 // E C
#define f 0x02 // E C
#define g 0x08 // DDDD H
#define h 0x20
unsigned char code LED_table[]={
a+b+c+d+e+f, //"0"
b+c, //"1"
a+b+d+e+g, //"2"
a+b+c+d+g, //"3"
b+c+f+g, //"4"
a+c+d+f+g, //"5"
a+c+d+e+f+g, //"6"
a+b+c, //"7"
a+b+c+d+e+f+g, //"8"
a+b+c+d+f+g, //"9"
b+c+e+f+g, //"H"
a+f+e+g, //"C"
d+e+f, //"L"
g, //"-"
0x00 //black
};
#undef a
#undef b
#undef c
#undef d
#undef e
#undef f
#undef g
#define SP 14
/********************************************************/
/* 初始化系统 */
/********************************************************/
void Sys_Init()
{
TMOD=0x01;
TH0=(65536-1000)/256; //1ms
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
}
/*********************************************************/
/* 初始化DS18B20 */
/*********************************************************/
void Init_DS18B20(void) //初始化函数
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //pull DQ line low
delay(80); //leave it low for 480~960us
DQ = 1; //allow line to return high
delay(14); //wait for presence 15~60us
x=DQ; //稍做延时后 如果x=0则初始化成功
delay(20); // x=1则初始化失败
}
/*********************************************************/
/* 读一个字节 */
/*********************************************************/
unsigned char Read_byte(void)
{
unsigned char i=0;
unsigned char dat=0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80; // 取数据最高位
delay(4);
}
return(dat);
}
/*********************************************************/
/* 写一个字节 */
/*********************************************************/
void Write_byte(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01; //取数据最低位
delay(5);
DQ = 1;
dat>>=1;
}
delay(4);
}
/*********************************************************/
/* 读取温度 */
/*********************************************************/
ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
Init_DS18B20();
Write_byte(0xCC); // 跳过读序号列号的动作 因为只有一个器件
Write_byte(0x44); // 启动温度转换
Init_DS18B20();
Write_byte(0xCC); //跳过读序号列号的动作
Write_byte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=Read_byte(); //读取温度值低位
b=Read_byte(); //读取温度值高位
//a=a>>4; //低位右移4位,舍弃小数部分
//b=b<<4; //高位左移4位,舍弃符号位
//t=b|a;
//return(t);
return((b*256+a)*10/16); // b*256+a 把两个8位温度变成16位
} // *10 扩大10倍从而保留小数位
// /16 把18b20的输出换算成实际温度,
// 显示时的小数点视情况而定
/*********************************************************/
/* 温度显示函数 */
/*********************************************************/
void DisplayNumber(unsigned int Num)
{
unsigned char i;
EA=0;
for(i=0;i<4;i++)
{
DisBuff=Num%10;
Num/=10;
}
/* if(DisBuff[3]==0)
{
DisBuff[3]=0xff;
if(DisBuff[2]==0)
{
DisBuff[2]=0xff;
if(DisBuff[1]==0)
DisBuff[1]=0xff;
}
} */
for(i=3;i>=0;i--) //消隐无效"0"
{
if(DisBuff==0) DisBuff=SP;
else break;
}
delay(100);
EA=1;
}
/*********************************************************/
/* 数码管扫描选通 */
/*********************************************************/
void Display_Scan() interrupt 1 //中断1触发时,就会指向该函数执行
{ //并且保留现场,该函数完成后,回到入口,
TR0=0; //从原现场继续执行,等待下次中断发生
TH0=(65536-1000)/256; //1ms
TL0=(65536-1000)%256;
TR0=1;
if(COM>3) COM=0;
COM1=1;COM2=1;COM3=1;COM4=1;
switch(COM)
{
case 0: P0=LED_table[DisBuff[0]]; COM1=0; break;
case 1: P0=LED_table[DisBuff[1]]|0x20; COM2=0; break; //在数码管第二位上点亮小数点
case 2: P0=LED_table[DisBuff[2]]; COM3=0; break;
case 3: P0=LED_table[DisBuff[3]]; COM4=0; break;
}
COM++;
}
/*********************************************************/
/* 延时子程序 */
/*********************************************************/
void delay(unsigned int i)
{
while(i--);
}
/*********************************************************/
/* 主函数 */
/*********************************************************/
void main(void)
{
unsigned int temp;
Sys_Init();
while(1) //死循环
{
temp=ReadTemperature();
DisplayNumber(temp);
}
} |
|