一、实验步骤
1、打开ICCAVR7 >> 打开工程>> 配置好端口 >> 将程序下载到ATmega162
2、打开sscom32.exe >> 配置选项如下
然后就会接收到数据。将数据复制出来粘贴到temp_data.txt中,运行printf.exe
就可以看到温度数据。
PS:可以通过串口猎手工具将温度数据通过画图展示出来。
工程源文件代码:
1 /********************************************************************
2 * 温度传感器LM75试验
3 * 功能: 用串口打印当前温度的值,通过串口调试助手显示
4 * 目标器件:ATmega162v
5 * 晶振: RC 8MHZ
6 * 熔丝位设置:EE 99 FF
7 * 编译环境:ICCAVR 7
8 * 版本: V1.0 (2012/08/09)
9 *******************************************************************/
10 #define F_CPU 8000000
11 #define UBRR 9600
12 #define MYUBRR F_CPU / (16 *( UBRR + 1))
13
14 #include <iom162v.h>
15 #include <macros.h>
16
17 typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */
18 typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */
19 typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
20 typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */
21 typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */
22 typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */
23 typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
24 typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
25
26 #define SETBIT(val, bitn) (val |= (1<<(bitn)))
27 #define CLRBIT(val, bitn) (val &=~(1<<(bitn)))
28 #define GETBIT(val, bitn) (val &= (1<<(bitn)))
29 //PC0 模拟I2C数据传输位
30 #define LM75_SDA 0
31 //PC1 模拟I2C时钟控制位
32 #define LM75_SCL 1
33 #define LM75_OS 2
34 //LM75A has a 7-bit slave address
35
36 //----------------lm75地址、配置字-----------------//
37 //1001 010 0 写
38 #define LM75_WR_ADDRESS 0x94
39 //1001 010 1 读
40 #define LM75_RD_ADDRESS 0x95
41 //指针寄存器选择 TEMP
42 #define LM75_POINT 0x00
43 U8 temp[2];
44
45 void delayus(U8 del)
46 {
47 while(del--);
48 }
49 /********************************************************************
50 * 函数功能:初始化温度传感器LM75
51 * 注意事项:
52 * 提示说明:
53 * 输 入:
54 * 返 回:
55 * *****************************************************************/
56 void init_lm75(void)
57 {
58 SETBIT(DDRC,LM75_SDA); //设置IO 位输出
59 SETBIT(DDRC,LM75_SCL);
60
61 SETBIT(PORTC,LM75_SDA); //输出 置1
62 delayus(5);
63 SETBIT(PORTC,LM75_SCL);
64 delayus(5);
65
66 CLRBIT(PORTC,LM75_SDA); //输出 清0
67 delayus(5);
68 CLRBIT(PORTC,LM75_SCL);
69 delayus(5);
70 }
71 /********************************************************************
72 * 函数功能:发送一字节数据给LM75函数
73 * 注意事项:
74 * 提示说明:
75 * 输 入:
76 * 返 回:
77 * *****************************************************************/
78 U8 sendbyte_lm75(U8 buf)
79 {
80 U8 i = 0;
81 SETBIT(DDRC,LM75_SDA); //设置IO为输出
82 SETBIT(DDRC,LM75_SCL);
83 //将数据串行输出
84 for(i = 8;i > 0;i--){
85 CLRBIT(PORTC,LM75_SCL);
86 delayus(5);
87 if(buf & 0x80) //bit7 == 1
88 SETBIT(PORTC,LM75_SDA);
89 else //bit7 == 0
90 CLRBIT(PORTC,LM75_SDA);
91 buf <<= 1;
92 SETBIT(PORTC,LM75_SCL);
93 delayus(5);
94 }
95
96 CLRBIT(PORTC,LM75_SCL);
97 delayus(20); //wait for ack
98 SETBIT(PORTC,LM75_SDA);
99 delayus(5);
100 CLRBIT(DDRC,LM75_SDA); //set SDA input
101 SETBIT(PORTC,LM75_SCL);
102 delayus(20);
103
104 if(GETBIT(PINC,LM75_SDA)){ //fail
105 SETBIT(DDRC,LM75_SCL);
106 CLRBIT(PORTC,LM75_SCL);
107 return 0;
108 }else{ //成功返回 地址
109 SETBIT(DDRC,LM75_SCL);
110 CLRBIT(PORTC,LM75_SCL);
111 return LM75_RD_ADDRESS;
112 }
113
114 }
115 /********************************************************************
116 * 函数功能:从LM75获取一字节数据函数
117 * 注意事项:
118 * 提示说明:
119 * 输 入:
120 * 返 回:
121 * *****************************************************************/
122 U8 getbyte_lm75(void)
123 {
124 U8 i = 0,buf = 0;
125 CLRBIT(DDRC,LM75_SDA); //数据输入
126 SETBIT(DDRC,LM75_SCL); //时钟输出
127 for(i = 0;i < 8;i++){
128 CLRBIT(PORTC,LM75_SCL); /*置时钟线为低,准备接收数据位*/
129 delayus(20);
130 SETBIT(PORTC,LM75_SCL); /*置时钟线为高使数据线上数据有效*/
131 delayus(10);
132 buf <<= 1;
133 if(GETBIT(PINC,LM75_SDA)){ /*读数据位,接收的数据位放入buf中*/
134 buf += 1;
135 delayus(10);
136 }
137 CLRBIT(PORTC,LM75_SCL);
138 }
139 return buf;
140 }
141
142 /********************************************************************
143 * 函数功能:
144 * 注意事项:
145 * 提示说明:
146 * 输 入:
147 * 返 回:
148 * *****************************************************************/
149 void stop_lm75(void)
150 {
151 SETBIT(DDRC,LM75_SDA);
152 SETBIT(DDRC,LM75_SCL);
153
154 CLRBIT(PORTC,LM75_SDA);
155 delayus(20);
156 SETBIT(PORTC,LM75_SCL);
157 delayus(20);
158 SETBIT(PORTC,LM75_SDA);
159 delayus(20);
160 }
161 /********************************************************************
162 * 函数功能:主控器进行应答信号,(可以是应答或非应答信号)
163 * 注意事项:
164 * 提示说明:
165 * 输 入:
166 * 返 回:
167 * *****************************************************************/
168 void ack_lm75(U8 ack)
169 {
170 SETBIT(DDRC,LM75_SDA);
171 SETBIT(DDRC,LM75_SCL);
172
173 if(ack)
174 CLRBIT(PORTC,LM75_SDA);
175 else
176 SETBIT(PORTC,LM75_SDA);
177
178 delayus(3);
179 SETBIT(PORTC,LM75_SCL);
180 delayus(5);
181 CLRBIT(PORTC,LM75_SCL);
182 delayus(2);
183 }
184 /********************************************************************
185 * 函数功能:获取温度值
186 * 注意事项:
187 * 提示说明:
188 * 输 入:
189 * 返 回:
190 * *****************************************************************/
191 U8 temperature_lm75(void)
192 {
193 //U8 temp[2];
194 U8 i;
195
196 init_lm75();
197 //I2CSendByte( 0x90 | ((DeviceAdr&0x07)<<1) | 0x01 ); // Send Device Adress 1010 A2/P2 A1/P1 A0/P0 R/W=1(Read)
198 if(sendbyte_lm75(LM75_RD_ADDRESS) == 0) //发送LM75的地址:读写位 1001 A2 A1 A
199 return 0; //发送地址出错,返回0
200
201 temp[1] = getbyte_lm75();
202 ack_lm75(1);
203 temp[0] = getbyte_lm75();
204 ack_lm75(0);
205
206 stop_lm75();
207
208 if(temp[1] & 0x80) //temperature was minus负的
209 temp[1] = ~temp[1]+0x80;
210
211 return 1;
212 //return 0;
213 }
214 /********************************************************************
215 * 函数功能:串口初始化
216 * 注意事项:
217 * 提示说明:
218 * 输 入:
219 * 返 回:
220 * *****************************************************************/
221 void USART_Init( unsigned int ubrr )
222 {
223 UCSR0B = 0x00; //关闭USART1
224 UCSR0A = 0x00; //不使用倍速发送
225 UCSR0C = (1<<URSEL0)|(1<<UCSZ00)|(1<<UCSZ01);//数据位为八位
226 UBRR0L = ubrr%256;
227 UBRR0H = ubrr/256;
228 UCSR0B = (1<<RXEN0)|(1<<TXEN0);
229 //UCSR0B =(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0); //发送使能,接收使能,接收中断使能
230 }
231 /********************************************************************
232 * 函数功能:打印一个字节
233 * 注意事项:
234 * 提示说明:
235 * 输 入:
236 * 返 回:
237 * *****************************************************************/
238 void putch(unsigned char data)
239 {
240 while (!( UCSR0A & (1<<UDRE0))); //表明发送器一准备就绪
241 UDR0 = data;
242 }
243 /********************************************************************
244 * 函数功能:延时ms函数
245 * 注意事项:
246 * 提示说明:
247 * 输 入:
248 * 返 回:
249 * *****************************************************************/
250 void delay_ms(long int s)
251 {
252 int t;
253 while(s--)
254 {
255 for(t=1000;t>0;t--)
256 ;
257 }
258 }
259
260 /********************************************************************
261 * 函数功能:主函数
262 * 注意事项:
263 * 提示说明:
264 * 输 入:
265 * 返 回:
266 * *****************************************************************/
267 void main(void)
268 {
269 CLKPR = (1<<CLKPCE);
270 CLKPR = 0x00;
271 USART_Init(MYUBRR);
272
273 while(1){
274 //display(0);
275 temperature_lm75();
276 putch('A');
277 putch(temp[1]);
278 putch('.');
279 putch(temp[0]);
280 putch('C');
281 delay_ms(1000);
282 }
283 }
printf.exe代码:
View Code
1 #include<stdlib.h>
2 #include<string.h>
3 #include<stdio.h>
4 #include<dos.h>
5
6 int main(void){
7 FILE *stream;
8 char ch;
9 char msg[2];
10 int data;
11 float temper;
12 int point,i;
13 int a,b;
14
15 stream = fopen("temp_data.txt", "rb");
16 fseek(stream, 0, SEEK_SET);
17 do{
18 fgets(msg,3,stream);
19
20 if(msg[0]>'9')
21 a=msg[0]-54;
22 else
23 a=msg[0]-48;
24
25 if(msg[1]>'9')
26 b=msg[1]-54;
27 else
28 b=msg[1]-48;
29
30 data=a*16+b;
31 temper=data/2;
32
33 point=temper;
34 for(i=0;i<point;i+=2)
35 printf(".");
36 printf("%-3.1f ",temper);
37 printf("\n");
38 ch=fgetc(stream);
39 }while(ch!=EOF);
40 fclose(stream);
41 ch=getchar();
42 if(ch==1)
43 return 0;
44 }