?? 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 + -