哪位大神有100例单片机C语言编程实训综合设计中用1602LCD和DS18B20设计的温度报警器的源代码?

/*******************************************

文件:DS18B20。C

环境:编译为ICC AVR6.31A,模拟为AVR Studio4.10。

硬件:ATMEGA16芯片。

日期:2008年8月8日

/******************************************/

# include//包含模型头文件。

# include//包含“位”操作的头文件。

# include//标准输入/输出头文件

# include//包含自定义常量的头文件

# include " SMG . c "//包含数码管的显示功能。

/*******************************************

函数名:B20_init

功能:复位DS18B20

参数:无

返回值:无

/********************************************/

void B20_init(无效)

{

DDRA | = BIT(ds 18b 20);//配置为输出

PORTA & amp= ~ BIT(ds 18b 20);//下拉

德拉尤斯(600);//等待600微秒

PORTA | = BIT(ds 18b 20);//释放总线

德拉尤斯(60);//等待60微秒

DDRA & amp;= ~ BIT(ds 18b 20);//配置为输入

而((PINA & amp;(BIT(ds 18b 20)));//等待DS18B20被拉低。

而(!(PINA & amp;(BIT(ds 18b 20)));//等待DS18B20释放总线。

}

/*******************************************

函数名:B20_readB

功能:读取一个字节的数据。

参数:无

返回值:retd -返回一个字节的数据。

/********************************************/

uchar B20_readB(void)

{

uchar i,retd = 0;

for(I = 0;我& lt8;i++)//位计数值

{

retd & gt& gt=1;//向右移动,准备接受新的数据位。

DDRA | = BIT(ds 18b 20);//配置为输出

PORTA & amp= ~ BIT(ds 18b 20);//拉低以开始读取数据位。

PORTA | = BIT(ds 18b 20);//释放总线

德拉尤斯(5);//等待5微秒

DDRA & amp;= ~ BIT(ds 18b 20);//配置为输入并开始读取数据位。

如果(PINA & amp;bit(ds 18b 20))//这个位高吗?

{

retd | = 0x80//是的,把这个位设为高。

}

德拉尤斯(50);//等待50微秒

}

返回retd//返回读取的字节。

}

/*******************************************

函数名:B20_writeB

功能:写入一个字节的数据。

参数:wrd -要写入的数据。

返回值:无

/********************************************/

void B20_writeB(uchar wrd)

{

乌恰尔一世;

for(I = 0;我& lt8;i++)//位计数值

{

DDRA | = BIT(ds 18b 20);//配置为输出

PORTA & amp= ~ BIT(ds 18b 20);//拉低开始写入数据位。

德拉尤斯(1);//等待1微秒

如果(wrd & amp0x 001)//这个位数据高吗?

{

PORTA | = BIT(ds 18b 20);//高的话就把单总线拉高。

}

其他

{

PORTA & amp= ~ BIT(ds 18b 20);//低的话单总线会被拉低。

}

德拉尤斯(50);//等待50微秒

PORTA | = BIT(ds 18b 20);//释放总线

wrd & gt& gt=1;//向右移动,准备写入新的数据位。

}

德拉尤斯(50);//等待50微秒

}

/*******************************************

函数名:读取温度

工作能量:读取温度值。

参数:无

返回值:rettemp -返回的温度值。

/********************************************/

uint Read_temp(空)

{

uchar templ,temph

单位温度;

b20 _ init();//初始化。每次写命令,都是从初始化开始。

b20 _ writeB(0x cc);//跳过ROM

b20 _ writeB(0x 44);//开始温度转换

b20 _ init();//初始化。每次写命令,都是从初始化开始。

b20 _ writeB(0x cc);//跳过ROM

b20 _ writeB(0x be);//读取寄存器

templ = B20 _ readB();//读取温度低字节

temph = B20 _ readB();//读取温度高字节

temp = templ+temph * 256;//将温度排序为16位变量。

返回温度;//返回16位变量。

}

/*******************************************

函数名:Num_BCD

功能:将一个字节的整数转换成一个三位的BCD码。

参数:num -要转换的整数。

返回值:chr -三位BCD码数组指针

/********************************************/

uchar* Num_BCD(单位编号)

{

uchar i,chr[3];

uchar报告;

rept = & amp(chr[0]);//返回指向BCD代码数组的指针

for(I = 0;我& lt3;i++)

{

chr[2-I]= num % 10;//取10的余数(其实就是求模,但是对于正数,取余数等于求模)

num/= 10;//除以10,准备取出下一位。

}

返回报告;//返回一个指针

}

/*******************************************

函数名:main

功能:读取和显示温度。

参数:无

返回值:无

/********************************************/

无效总管(无效)

{

uint t;

uchar * temppt

uchar i,temp[3];

board _ init();//初始化开发板

while(1)

{

t = Read _ temp();//读取温度值

t * = 0.625//换算成实际温度的10倍。

temppt = Num _ BCD(t);//将实际温度的10倍转换成BCD码。

for(I = 0;我& lt3;i++)//将转换后的BCD码存储在显示数组中。

{

temp[I]= *(temppt+I);

}

for(I = 0;我& lt3;i++)//显示温度

{

if(i==1)

{

temp[1]+= 16;//如果是你,加小数点(数码管解码)

}

One_smg_display(temp[i],I+1);

戴莱姆斯(5);

}

}

}

/*******************************************

文件:竞彩。C

环境:编译为ICC AVR6.25A,模拟为AVR Studio4.10。

硬件:ATMEGA16芯片。

日期:12,2006

功能:驱动开发板上的数码管,滚动显示1,2,3,4,5,6。

备注:参考AVR系列单片机C语言编程及应用实例

/******************************************/

# include//包含模型头文件。

# include//包含“位”操作的头文件。

# include//标准输入/输出头文件

#pragma数据:代码

const SEGMENT[26]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,

0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,

0xff,0x ef };

/*******************************************

函数名:One_smg_display

功能:指定数码管显示指定内容。

参数:数据显示内容(0-15)

数字指定数码管(1-6)

返回值:无

/********************************************/

void One_smg_display(uchar数据,uchar号)

{

PORTB | = 0x3F//输出位选择

PORTA | = BIT(BITLK);//更新位选择

德拉尤斯(50);//调整时序

PORTA & amp= ~ BIT(BITLK);//锁存位选择

PORTB =段[数据];//输出段选择

PORTA | = BIT(seg lk);//更新段选择

德拉尤斯(50);//调整时序

PORTA & amp= ~ BIT(se glk);//锁存段选择

number=~BIT(数字-1);//调整位置选择(指定时1~6,操作时0~5)

PORTB =数字;//输出位选择

PORTA | = BIT(BITLK);//更新位选择

德拉尤斯(50);//调整时序

PORTA & amp= ~ BIT(BITLK);//锁存位选择

}

/*******************************************

函数名:All _ smg _显示器

功能:6个数码管显示指定内容。

参数:* pdata-显示内容数组的地址。

返回值:无

/********************************************/

void All _ SMG _ display(uchar * pdata)

{

乌恰尔一世;

for(I = 0;我& lt6;i++)

{

One_smg_display(pdata[i],I+1);

delay ms(1);

}

}

/*******************************************

函数名:循环显示

功能:六个数码管从右向左滚动显示指定内容(一次)。

参数:* pdata-显示内容数组的地址。

返回值:无

/********************************************/

void Cycle _ SMG _ display(uchar * pdata)

{

uchar i,j;

for(I = 0;我& lt240;I++)/* * *滚动6次,每次内容显示40个周期。

{

for(j = 0;j & lt6;j++)//扫描6个数码管

{

one _ SMG _ display(pdata[(I/40+j)% 6],j+1);//显示

德拉尤斯(2000年);//调整显示时间和亮度(时间越长,亮度越高,但数码管闪烁时间越长)

}

}

}