📄 main.lst
字号:
1 .file "main.c"
2 .arch atmega16
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
11 .text
12 .Ltext0:
53 .global cc2
54 .data
57 cc2:
58 0000 2B30 3030 .string "+000 Degree"
58 2044 6567
58 7265 6500
59 .global cc1
62 cc1:
63 000c 5465 6D70 .string "Temprature!"
63 7261 7475
63 7265 2100
64 .global i
65 .global i
66 .section .bss
69 i:
70 0000 0000 .skip 2,0
71 .text
73 .global DELAY_1ms
75 DELAY_1ms:
77 .Ltext1:
1:delay.h **** /*-----------------------------------------------------------------------
2:delay.h **** 延时函数
3:delay.h **** 系统时钟:
4:delay.h **** -----------------------------------------------------------------------*/
5:delay.h **** /***********************************************************************/
6:delay.h **** /**********************************************************************/
7:delay.h **** /**************************************************************************************/
8:delay.h **** //函数名 :DELAY_1us
9:delay.h **** //属性 :私有
10:delay.h **** //功能 :延时1us
11:delay.h **** //输入参数 :无
12:delay.h **** //输出参数 :无
13:delay.h **** //返回值 :
14:delay.h **** //修改日期 :
15:delay.h **** //修改人 :
16:delay.h **** /**************************************************************************************/
17:delay.h **** #include <avr/io.h>
18:delay.h **** #include <avr/delay.h>
19:delay.h **** #define DELAY_1us() _delay_loop_2((unsigned int)((1)*CPU_CRYSTAL/4))
20:delay.h **** /*void DELAY_1us(void)
21:delay.h **** {
22:delay.h **** for (int i=0;i<40;i++) {
23:delay.h **** asm("nop");}//_delay_us();
24:delay.h **** }*/
25:delay.h **** /**************************************************************************************/
26:delay.h **** //函数名 :DELAY_nus
27:delay.h **** //属性 :私有
28:delay.h **** //功能 :延时N us
29:delay.h **** //输入参数 :n--延时时间
30:delay.h **** //输出参数 :无
31:delay.h **** //返回值 :
32:delay.h **** //修改日期 :
33:delay.h **** //修改人 :
34:delay.h **** /**************************************************************************************/
35:delay.h **** #define DELAY_nus(us) _delay_loop_2((unsigned int)((us*15)*CPU_CRYSTAL/4))
36:delay.h **** /*void DELAY_nus(unsigned int n)
37:delay.h **** {
38:delay.h **** unsigned int i=0;
39:delay.h **** for (i=0;i<n;i++)
40:delay.h **** DELAY_1us();
41:delay.h **** }*/
42:delay.h **** /**************************************************************************************/
43:delay.h **** //函数名 :main
44:delay.h **** //属性 :私有
45:delay.h **** //功能 :主函数
46:delay.h **** //输入参数 :
47:delay.h **** //输出参数 :
48:delay.h **** //返回值 :
49:delay.h **** //修改日期 :
50:delay.h **** //修改人 :
51:delay.h **** /**************************************************************************************/
52:delay.h **** void DELAY_1ms(void) //1ms延时函数
53:delay.h **** {
79 .LM1:
80 /* prologue: frame size=0 */
81 /* prologue end (size=0) */
54:delay.h **** unsigned int i;
55:delay.h **** for (i=0;i<(unsigned int)(XTAL*143-2);i++);
83 .LM2:
84 0000 8FE1 ldi r24,lo8(1567)
85 0002 96E0 ldi r25,hi8(1567)
86 .L5:
88 .LM3:
89 0004 0497 sbiw r24,4
90 0006 97FF sbrs r25,7
91 0008 FDCF rjmp .L5
92 /* epilogue: frame size=0 */
93 000a 0895 ret
94 /* epilogue end (size=1) */
95 /* function DELAY_1ms size 6 (5) */
100 .Lscope0:
103 .global DELAY_nms
105 DELAY_nms:
56:delay.h **** }
57:delay.h **** /**************************************************************************************/
58:delay.h **** //函数名 :main
59:delay.h **** //属性 :私有
60:delay.h **** //功能 :主函数
61:delay.h **** //输入参数 :
62:delay.h **** //输出参数 :
63:delay.h **** //返回值 :
64:delay.h **** //修改日期 :
65:delay.h **** //修改人 :
66:delay.h **** /**************************************************************************************/
67:delay.h **** void DELAY_nms(unsigned int n) //N ms延时函数
68:delay.h **** {
107 .LM4:
108 /* prologue: frame size=0 */
109 000c CF93 push r28
110 000e DF93 push r29
111 /* prologue end (size=2) */
69:delay.h **** unsigned int i=0;
70:delay.h **** for (i=0;i<n;i++)
113 .LM5:
114 0010 0097 sbiw r24,0
115 0012 29F0 breq .L33
116 0014 EC01 movw r28,r24
117 .L31:
71:delay.h **** DELAY_1ms();
119 .LM6:
120 0016 0E94 0000 call DELAY_1ms
122 .LM7:
123 001a 2197 sbiw r28,1
124 001c E1F7 brne .L31
125 .L33:
126 /* epilogue: frame size=0 */
127 001e DF91 pop r29
128 0020 CF91 pop r28
129 0022 0895 ret
130 /* epilogue end (size=3) */
131 /* function DELAY_nms size 13 (8) */
136 .Lscope1:
138 .global ds18b20_config
140 ds18b20_config:
142 .Ltext2:
1:ds18b20.h **** /*
2:ds18b20.h **** http://www.21icbbs.com/club/bbs/bbsView.asp?boardid=9
3:ds18b20.h ****
4:ds18b20.h **** 基于WinAVR的DS18B20源程序,供参考
5:ds18b20.h ****
6:ds18b20.h **** */
7:ds18b20.h **** /********************************************************
8:ds18b20.h **** * 文件: ds18b20.c
9:ds18b20.h **** * 功能: AVR微控制器 VS 温度芯片DS18B20(TO-92)
10:ds18b20.h **** * 工具: WinAVR20040404(AVR-GCC)
11:ds18b20.h **** * 作者: 孤欲化境(qjy_dali)
12:ds18b20.h **** * E-mail: qjy_dali@sohu.com
13:ds18b20.h **** * 日期: 6/02/2004
14:ds18b20.h **** * 版本: 1.41
15:ds18b20.h **** * 声明: 你可随意地拷贝,复制或修改这个程序,但请你注明
16:ds18b20.h **** * 你的修改。本作者不对这个程序的后果负责,无论是明
17:ds18b20.h **** * 确的,还是隐含的(^_^)。自由软件不是万能的,但它
18:ds18b20.h **** * 的确是令人振奋的。支持一下GCC!!!
19:ds18b20.h **** ********************************************************
20:ds18b20.h **** */
21:ds18b20.h **** #include <avr/io.h>
22:ds18b20.h **** #ifndef _DS18B20_H_
23:ds18b20.h **** #define _DS18B20_H_
24:ds18b20.h ****
25:ds18b20.h ****
26:ds18b20.h **** /* 我的一线温度芯片DS18B20被连接到AVR微控制器ATmega8
27:ds18b20.h **** * -16PI(PDIP28)的PD3(INT1)引脚,但是我只是用了PD3功能而
28:ds18b20.h **** * 没有使用中断INT1功能。DS18B20(TO-92)的连接如下:
29:ds18b20.h **** * +-------------+-------------------------------------+
30:ds18b20.h **** * | Pin-1(GND) | GND(ground) |
31:ds18b20.h **** * +-------------+-------------------------------------|
32:ds18b20.h **** * | Pin-2(DQ) | 通过240欧姆的电阻连接到ATmega8的 |
33:ds18b20.h **** * | | PD3引脚,同时用一个3K的电阻上拉到 |
34:ds18b20.h **** * | | VCC(5V)。 |
35:ds18b20.h **** * +-------------+-------------------------------------+
36:ds18b20.h **** * | Pin-3(VD) | GND(ground) |
37:ds18b20.h **** * +-------------+-------------------------------------+
38:ds18b20.h **** * 说明:很显然,我采用的是"总线窃电"模式,这是DS-
39:ds18b20.h **** * 18B20数据手册认可的工作模式之一。串联240欧姆电阻的用意
40:ds18b20.h **** * 是为了防止有缺陷的用户程序损坏DS18B20的可能性。例如,
41:ds18b20.h **** * 如果用户没有正确地用OC(集电极开路)或OD(漏极开路)结构去
42:ds18b20.h **** * 驱动DS18B20,而是错误地选择了推挽式结构,则DS18B20会立
43:ds18b20.h **** * 即或在"被虐待"一段时间后"死翘翘"(^_^)。当然,240欧姆的
44:ds18b20.h **** * 取值未必是最恰当的,设计者可自己去优化。这需要设计者仔细
45:ds18b20.h **** * 阅读数据手册。
46:ds18b20.h **** *
47:ds18b20.h **** * 此外,我采用了DS18B20的默认精度(12位),并未修改,我
48:ds18b20.h **** * 也没有使用它的其它功能。简而言之,这只是一个简单的读取温度
49:ds18b20.h **** * 的实例。用户可以自己去改进,自己去研究数据手册(我并未完全
50:ds18b20.h **** * 看,只看了想看的一点点 ^_^ )。但是我可以肯定一点,这个程
51:ds18b20.h **** * 序我是实践过的!并且成功地读取了温度值!
52:ds18b20.h **** *
53:ds18b20.h **** * 请注意我是如何驱动DS18B20的:我是用AVR的方向寄存器
54:ds18b20.h **** * 而不是输出端口寄存器! 同时预先在输出端口寄存器中写入0。
55:ds18b20.h **** * 这实际上相当于一个三态门:只不过输入被接地,使它成了一
56:ds18b20.h **** * 个OC门,使能端成了这个OC门的实际输入!
57:ds18b20.h **** *
58:ds18b20.h **** * 1-wire总线的电气特性与I2C总线相似,具有线与功能,所
59:ds18b20.h **** * 以,总线上的任一设备都可在合适的时间强行拉低总线,但是总线
60:ds18b20.h **** * 要呈现高电平,则必须是每一个设备都释放了总线。就像我下面的
61:ds18b20.h **** * 宏DQ_TO_1(),它只是释放了总线,但不是说总线一定被强行驱动
62:ds18b20.h **** * 至高电平,总线的高电平是由上拉电阻实现的。
63:ds18b20.h **** */
64:ds18b20.h **** #define DQ_18B20 (1<<3) // PD3
65:ds18b20.h **** #define DQ_TO_0() (DDRD |= DQ_18B20) // PD3='0', 输出状态
66:ds18b20.h **** #define DQ_TO_1() (DDRD &= ~DQ_18B20) // PD3='float' 输入状态-高阻
67:ds18b20.h **** #define DQ_status() (PIND & DQ_18B20) // read PD3 pin
68:ds18b20.h ****
69:ds18b20.h **** /* 请认真检查你的AVR微控制器的时钟频率! 特别注意:频率
70:ds18b20.h **** * 定义的单位是MHz! 并且请使用浮点数! 假如你的晶振是12MHz,
71:ds18b20.h **** * 你应该写成12.0000或12.0之类。
72:ds18b20.h **** * 我的实验电路的晶振是:11.0592MHz
73:ds18b20.h **** */
74:ds18b20.h **** #ifndef CPU_CRYSTAL
75:ds18b20.h **** #define CPU_CRYSTAL (11.0592)
76:ds18b20.h **** #endif
77:ds18b20.h **** #define SUCC 1
78:ds18b20.h **** #define FAIL 0
79:ds18b20.h **** /* 请包含WinAVR系统提供的延时头文件"delay.h",其中给出
80:ds18b20.h **** * 两个延时模块,我用16位的那个(16-bit count, 4 cycles/l-
81:ds18b20.h **** * oop.),细节请看这个头文件。
82:ds18b20.h **** */
83:ds18b20.h **** #define wait_us(us) _delay_loop_2((unsigned int)((us)*CPU_CRYSTAL/4))
84:ds18b20.h ****
85:ds18b20.h ****
86:ds18b20.h **** /*---------------- 函数原型声明 ------------------*/
87:ds18b20.h **** // 1个初始化模块
88:ds18b20.h **** void ds18b20_config(void); // 配置端口
89:ds18b20.h **** void DS18B20_HEX_to_LCD(unsigned int x,char *p);
90:ds18b20.h **** // 3个基本模块
91:ds18b20.h **** unsigned char ds18b20_reset(void); // 复位DS18B20
92:ds18b20.h **** void ds18b20_write(unsigned char dat); // 写字节到DS18B20
93:ds18b20.h **** unsigned char ds18b20_read(void); // 读字节从DS18B20
94:ds18b20.h ****
95:ds18b20.h **** // 2个应用模块
96:ds18b20.h **** void convert_T(void); // 启动温度转换
97:ds18b20.h **** unsigned int read_T(void); // 读取转换值
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -