哪位大神有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年);//调整显示时间和亮度(时间越长,亮度越高,但数码管闪烁时间越长)
}
}
}