⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lst

📁 avr单片机操作温度传感器18B20的软件含仿真。
💻 LST
📖 第 1 页 / 共 5 页
字号:
   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 + -