📄 lm92.lst
字号:
C51 COMPILER V7.05 LM92 02/14/2006 09:16:42 PAGE 1
C51 COMPILER V7.05, COMPILATION OF MODULE LM92
OBJECT MODULE PLACED IN LM92.OBJ
COMPILER INVOKED BY: C:\SiLabs\MCU\IDEfiles\C51\BIN\C51.exe LM92.C DB OE
stmt level source
1 //参考程序A : //LM92.C
2 //LM92.C 程序功能: 读/写LM92并将温度值显示在SAA1064驱动的四位数码管上`.
3 #include <c8051f020.h> // SFR declarations
4 #include <intrins.h>
5 #define WRITE 0x00 // 写命令位
6 #define READ 0x01 // 读命令位
7 #define CHIP_B 0x70
8 #define SMB_START 0x08 // (MT&MR)主收发器发送起始位成功.再将从机写地址送SMB0DAT
9 #define SMB_RP_START 0x10 // (MT & MR)主收发器重复发送起始位成功,再将从机读地址送SMB0DAT
10 #define SMB_MTADDACK 0x18 // (MT)主收发器发送从地址+W成功;收到 ACK(从机应答)
11 #define SMB_MTDBACK 0x28 //(MT)主收发器发送数据字节成功;收到ACK(从机应答)
12 #define SMB_MRADDACK 0x40 // (MR)主收发器发送从地址+R成功;收到 ACK(从机应答)
13 #define SMB_MRDBACK 0x50 // (MR)主收发器接收数据成功;主机发送ACK
14 #define SMB_MRDBNACK 0x58 // (MR)主收发器接收数据成功;主机发送NACK
15 char COMMAND; //保存从地址 + R/W 位,用在 中断服务函数中
16 char COMMAND1;
17 char WORD; // 保存被传输的数据
18 unsigned char totalnumber,wrnumber,rdnumber;
19 unsigned char xdata SENDMODE;
20 bit SM_BUSY; // 开始收/发数据时,SM_BUSY被置1,完成操作时被清另.
21 unsigned char wr_data[8]; //用于存放输出数据的数组
22 unsigned char rd_data[8]; //用于存放输入数据的数组
23 void SYSCLK_Init (void);
24 void SMBUS_ISR (void);
25 char SLA_READ(char chip_select, char out_op, char number);//从LM92读出数据到主机的函数
26 void SLA_SEND(char chip_select, char *wr_data, char number); //从主机输出数据到LM92的函数
27 void sleep_ms(unsigned int count) //延时
28 {
29 1 unsigned char ii,jj;
30 1 for(ii=0;ii<count;ii++)
31 1 {
32 2 for(jj=0;jj<250;jj++)
33 2 _nop_();
34 2 }
35 1 }
36 void Initlm92(void)
37 {
38 1 wr_data[0] = 0x01; //地址指针指向配置寄存器
39 1 wr_data[1] = 0x00;
40 1 SLA_SEND(0x90,wr_data,0x02); //配置寄存器内容为00,LM92为连续采样模式
41 1 wr_data[0] = 0x03; //地址指针指向T_CRIT寄存器
42 1 wr_data[1] = 0x20;
43 1 wr_data[2] = 0x00;
44 1 SLA_SEND(0x90,wr_data,0x03); //T_CRIT寄存器16位 NO:03, 设置临界温度为+64度(2000h)
45 1 wr_data[0] = 0x04; //地址指针指向温度下限寄存器
46 1 wr_data[1] = 0x07;
47 1 wr_data[2] = 0x80;
48 1 SLA_SEND(0x90,wr_data,0x03); //Tlow寄存器16位 NO:04, 设置温度下限为+15度(0780h)
49 1 wr_data[0] = 0x05; //地址指针指向温度上限寄存器
50 1 wr_data[1] = 0x28;
51 1 wr_data[2] = 0x00;
52 1 SLA_SEND(0x90,wr_data,0x03); //Thigh寄存器16位 NO:05, 设置温度上限为+80度(2800h)
53 1 }
54 void MAIN (void)
55 {
C51 COMPILER V7.05 LM92 02/14/2006 09:16:42 PAGE 2
56 1 unsigned char j,temp; // 测试时要使用的变量
57 1 //LED数码管显示数字(0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)的字型码:
58 1 unsigned char Number[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,
59 1 0x5e,0x79,0x71};
60 1 unsigned int i;
61 1 WDTCN = 0xde; // 禁止看门狗定时
62 1 WDTCN = 0xad;
63 1 SYSCLK_Init(); // 初始化时钟
64 1 XBR0 = 0x01; // 配置交叉开关
65 1 XBR2 = 0x40; // 使能交叉开关和弱上拉
66 1 SMB0CN = 0x44; // 允许SMBus工作 ,应答信号为低电平 (AA = 1)
67 1 SMB0CR = 0xc9; // 设置SMBus工作速率 为100 kHz(系统时钟为11.0592MHZ)
68 1 EIE1 |= 2; // SMBus 中断使能
69 1 EA = 1; // 开全局中断
70 1 SM_BUSY = 0; // 第一次传送数据,清除SM_BUSY标志
71 1 SI = 0; //中断状态位清另
72 1 Initlm92(); //LM92初始化
73 1 while(1){
74 2 for(j=0;j<20;j++){ //延时
75 3 sleep_ms(200);
76 3 }
77 2 SLA_READ(0x90,0x00,0x02); // LM92读出温度值(两个字节,16位数据)
78 2 sleep_ms(200); //温度值在数组rd_data[0]和rd_data[1]中
79 2 wr_data[0] = 0x00; //数组wr_data[0]存放输出到SAA1064的数据
80 2 wr_data[1] = 0x17;
81 2 temp = rd_data[0]&&0x80; //判符号位(数据最高的一位)."1"为负号,"0"为正号
82 2 if(temp==0x80) wr_data[2]=0x40;
83 2 else wr_data[2] = 0x3f;
84 2 i = (rd_data[0]&0x7f)*0x100+rd_data[1];//温度值(在数组rd_data[0]中)数据处理
85 2 i = i>>3;
86 2 if (temp>0x80) //温度若为负值,先求补码
87 2 {
88 3 i=-i;
89 3 i=0x8000+i*5/8; //最低一位数对应的温度值为0.0625度,加符号位
90 3 }
91 2 else //温度若为正值,整理数据送SAA1064显示.
92 2 i=i*5/8; //最低一位数对应的温度值为0.0625度
93 2 temp = (i%1000)/100;
94 2 wr_data[3] = Number[temp]; //十位
95 2 temp = (i%100)/10;
96 2 wr_data[4] = Number[temp]|0x80; //个位
97 2 temp = (i%10);
98 2 wr_data[5] = Number[temp]; //小数位
99 2 SLA_SEND(CHIP_B,wr_data,0x06); //从主机输出到LM92的数据在wr_data为首地址的数组中
100 2 } //温度值送SAA1064显示:数据四位,控制码(17H)一位,子地址一位
101 1 } //温度值四位,共有六位数要输出到SAA1064去
102 void SYSCLK_Init (void)// 时钟初始化
103 { int i;
104 1 OSCXCN = 0x67; // 选择外部晶振(11.0592MHZ)
105 1 for (i=0; i < 256; i++) ; // 等待>1ms
106 1 while (!(OSCXCN & 0x80)) ; // 等待外部晶振建立
107 1 OSCICN = 0x88; // 使用外部晶振作时钟源(11.0592MHz)并允许时钟丢失检测
108 1 }
109 // Functions
110 // SLA_SEND:写入从器件的程序
111 // chip_select 为从器件地址
112 // out_op 是送SAA1064子数据
113 // number是要传送的字节的数目
114 void SLA_SEND(char chip_select, char *wr_data, char number) //从主机输出数据到LM92的函数
115
116 {
117 1 SENDMODE=0x01;
C51 COMPILER V7.05 LM92 02/14/2006 09:16:42 PAGE 3
118 1 totalnumber=number;
119 1 wrnumber=number;
120 1 while(SM_BUSY); // Wait while SMBus is busy.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -