📄 main.c
字号:
/*
实验十六:
DS18B20实验,动态LED数据管显示温度。
1、AVR单片机读取DS18B20实验,并通过学习板上在LED数码管显示温度。
2、晶振频率为内部1MHz。
3、DS18B20由PA7口实现单总线访问,实现读取温度。
4、低层驱动函数中带有中断保护,程序可直接用于商业产品中。
5、LED数码管显示采用定时器中断方式,全中断驱动,不需要主程序管理,
只要把要显示的内部放到显示缓存区就行了。
6、进行此实验请插上SPI短路块。
7、DS18B20的电源脚接到VCC及GND上面,数据线接到PF2口。
11:48 2007-10-170
*/
#include "iom128v.h" /*包含相关头文件*/
#include "ds1820.h"
#include "led4.h"
/*
延时函数
延时单位为:mS。
CPU频率为:1MHz。
*/
void delay_ms(unsigned int i) {
unsigned char b;
while (i --) {
for (b = 1; b; b++);
}
}
/*IO口初始化函数*/
void io_init(void) {
DDRA = 0x00; /*方向输入*/
PORTA = 0xFF; /*打开上拉*/
DDRB = 0xFF; /*方向输出*/
PORTB = 0xFF; /*输出高电平*/
DDRC = 0x00; /*不用的IO口建议设置为输入带上拉*/
PORTC = 0xFF;
DDRD = 0x00;
PORTD = 0xFF;
DDRE = 0x00;
PORTE = 0xFF;
DDRF = 0x00;
PORTF = 0xFF;
DDRG = 0x00;
PORTG = 0xFF;
}
/*十六进制转十进制函数*/
void int_to_bcd(unsigned int temp) {
unsigned char i;
for (i = 0; i < 4; i++) {
led_buf[i] = temp % 10; /*提取当前变量最低位*/
temp = temp / 10; /*去掉当前最低位值*/
}
}
/*
主函数
实现系统的初始化操作。
周期性读取温度。
然后放入显示缓存区。
上面两个任务之间完全独立运行,方便移植。
*/
void main(void) {
unsigned int i;
io_init();
delay_ms(200);
ds1820_reset(); /*复位D18B20*/
disp_init(); /*启动显示任务*/
led_buf[4] = 1; /*小数点位置*/
while (1) {
ds1820_start(); /*启动一次转换*/
delay_ms(2000); /*等待转换结束*/
i = ds1820_read_temp(); /*读取温度数值*/
i = (i * 10) / 16; /*数值处理*/
int_to_bcd(i); /*整值分解*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -