?? 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 **** 延時函數(shù)
3:delay.h **** 系統(tǒng)時鐘:
4:delay.h **** -----------------------------------------------------------------------*/
5:delay.h **** /***********************************************************************/
6:delay.h **** /**********************************************************************/
7:delay.h **** /**************************************************************************************/
8:delay.h **** //函數(shù)名 :DELAY_1us
9:delay.h **** //屬性 :私有
10:delay.h **** //功能 :延時1us
11:delay.h **** //輸入?yún)?shù) :無
12:delay.h **** //輸出參數(shù) :無
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 **** //函數(shù)名 :DELAY_nus
27:delay.h **** //屬性 :私有
28:delay.h **** //功能 :延時N us
29:delay.h **** //輸入?yún)?shù) :n--延時時間
30:delay.h **** //輸出參數(shù) :無
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 **** //函數(shù)名 :main
44:delay.h **** //屬性 :私有
45:delay.h **** //功能 :主函數(shù)
46:delay.h **** //輸入?yún)?shù) :
47:delay.h **** //輸出參數(shù) :
48:delay.h **** //返回值 :
49:delay.h **** //修改日期 :
50:delay.h **** //修改人 :
51:delay.h **** /**************************************************************************************/
52:delay.h **** void DELAY_1ms(void) //1ms延時函數(shù)
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 **** //函數(shù)名 :main
59:delay.h **** //屬性 :私有
60:delay.h **** //功能 :主函數(shù)
61:delay.h **** //輸入?yún)?shù) :
62:delay.h **** //輸出參數(shù) :
63:delay.h **** //返回值 :
64:delay.h **** //修改日期 :
65:delay.h **** //修改人 :
66:delay.h **** /**************************************************************************************/
67:delay.h **** void DELAY_nms(unsigned int n) //N ms延時函數(shù)
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 **** * 聲明: 你可隨意地拷貝,復(fù)制或修改這個程序,但請你注明
16:ds18b20.h **** * 你的修改。本作者不對這個程序的后果負(fù)責(zé),無論是明
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數(shù)據(jù)手冊認(rèn)可的工作模式之一。串聯(lián)240歐姆電阻的用意
40:ds18b20.h **** * 是為了防止有缺陷的用戶程序損壞DS18B20的可能性。例如,
41:ds18b20.h **** * 如果用戶沒有正確地用OC(集電極開路)或OD(漏極開路)結(jié)構(gòu)去
42:ds18b20.h **** * 驅(qū)動DS18B20,而是錯誤地選擇了推挽式結(jié)構(gòu),則DS18B20會立
43:ds18b20.h **** * 即或在"被虐待"一段時間后"死翹翹"(^_^)。當(dāng)然,240歐姆的
44:ds18b20.h **** * 取值未必是最恰當(dāng)?shù)模O(shè)計者可自己去優(yōu)化。這需要設(shè)計者仔細(xì)
45:ds18b20.h **** * 閱讀數(shù)據(jù)手冊。
46:ds18b20.h **** *
47:ds18b20.h **** * 此外,我采用了DS18B20的默認(rèn)精度(12位),并未修改,我
48:ds18b20.h **** * 也沒有使用它的其它功能。簡而言之,這只是一個簡單的讀取溫度
49:ds18b20.h **** * 的實例。用戶可以自己去改進(jìn),自己去研究數(shù)據(jù)手冊(我并未完全
50:ds18b20.h **** * 看,只看了想看的一點點 ^_^ )。但是我可以肯定一點,這個程
51:ds18b20.h **** * 序我是實踐過的!并且成功地讀取了溫度值!
52:ds18b20.h **** *
53:ds18b20.h **** * 請注意我是如何驅(qū)動DS18B20的:我是用AVR的方向寄存器
54:ds18b20.h **** * 而不是輸出端口寄存器! 同時預(yù)先在輸出端口寄存器中寫入0。
55:ds18b20.h **** * 這實際上相當(dāng)于一個三態(tài)門:只不過輸入被接地,使它成了一
56:ds18b20.h **** * 個OC門,使能端成了這個OC門的實際輸入!
57:ds18b20.h **** *
58:ds18b20.h **** * 1-wire總線的電氣特性與I2C總線相似,具有線與功能,所
59:ds18b20.h **** * 以,總線上的任一設(shè)備都可在合適的時間強(qiáng)行拉低總線,但是總線
60:ds18b20.h **** * 要呈現(xiàn)高電平,則必須是每一個設(shè)備都釋放了總線。就像我下面的
61:ds18b20.h **** * 宏DQ_TO_1(),它只是釋放了總線,但不是說總線一定被強(qiáng)行驅(qū)動
62:ds18b20.h **** * 至高電平,總線的高電平是由上拉電阻實現(xiàn)的。
63:ds18b20.h **** */
64:ds18b20.h **** #define DQ_18B20 (1<<3) // PD3
65:ds18b20.h **** #define DQ_TO_0() (DDRD |= DQ_18B20) // PD3='0', 輸出狀態(tài)
66:ds18b20.h **** #define DQ_TO_1() (DDRD &= ~DQ_18B20) // PD3='float' 輸入狀態(tài)-高阻
67:ds18b20.h **** #define DQ_status() (PIND & DQ_18B20) // read PD3 pin
68:ds18b20.h ****
69:ds18b20.h **** /* 請認(rèn)真檢查你的AVR微控制器的時鐘頻率! 特別注意:頻率
70:ds18b20.h **** * 定義的單位是MHz! 并且請使用浮點數(shù)! 假如你的晶振是12MHz,
71:ds18b20.h **** * 你應(yīng)該寫成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系統(tǒng)提供的延時頭文件"delay.h",其中給出
80:ds18b20.h **** * 兩個延時模塊,我用16位的那個(16-bit count, 4 cycles/l-
81:ds18b20.h **** * oop.),細(xì)節(jié)請看這個頭文件。
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 **** /*---------------- 函數(shù)原型聲明 ------------------*/
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); // 復(fù)位DS18B20
92:ds18b20.h **** void ds18b20_write(unsigned char dat); // 寫字節(jié)到DS18B20
93:ds18b20.h **** unsigned char ds18b20_read(void); // 讀字節(jié)從DS18B20
94:ds18b20.h ****
95:ds18b20.h **** // 2個應(yīng)用模塊
96:ds18b20.h **** void convert_T(void); // 啟動溫度轉(zhuǎn)換
97:ds18b20.h **** unsigned int read_T(void); // 讀取轉(zhuǎn)換值
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -