?? yj.lst
字號:
C51 COMPILER V8.02 YJ 06/20/2007 13:39:50 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE YJ
OBJECT MODULE PLACED IN yj.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE yj.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #define uchar unsigned char
2 #define uint unsigned int
3
4 #include "reg52.h"
5 #include "intrins.h"
6 #include "string.h"
7 #include "AD0831.h"
8 #include "diceng1602.h"
9 #include "DS18B20qudong.h"
10
11
12 sbit LED=P2^0;
13
14
15 sbit key1 = P2^4;
16 uchar counter = 0;
17
18
19
20 struct SRspGetData //21h:數據采集命令響應
21 {
22 uchar lHead[4]; //4
23 uchar iStart[2]; //2
24 uchar cLength[2]; //2
25 uchar iDestNum[2]; //目的站編號, 2
26 uchar iSourceNum[2]; //源站編號 2
27 uchar cPackageType; //包類型=2Bh 1
28 uchar cPackageCtrl; //包控制要求 1
29 uchar iCmdSequenceNum[2]; //應答序列編號 2
30 uchar cTData[2]; //溫度數據,2個字節
31 uchar cHData; //濕度數據,1個字節
32 uchar iFcs[2];
33 uchar iEnd[2];
34 }DataPack;
35
36
37 uchar command = 0;
38 uchar i=0;
39 uchar cRcv_Stat1=0;
40 uchar iRcv_Nmb1;
41 uchar iRcv_Nmb_Max;
42 union zhongjian2
43 {
44 uint i;
45 uchar ii[2];
46 }exchange_data2;
47
48 void InitT0()
49 {
50 1
51 1 //TMOD = 0x21;//定時器0工作于方式1. 16位 TMOD在串行中斷初始化中已經設置過
52 1 TH0 = 0x3C;
53 1 TL0 = 0xB0;
54 1 TR0 = 1;//定時器啟動
55 1
C51 COMPILER V8.02 YJ 06/20/2007 13:39:50 PAGE 2
56 1 //EA = 1;//開總中斷 在串行中斷初始化中已經設置過
57 1 ET0 = 1;//允許定時器0中斷
58 1
59 1 LED = 1;
60 1 }
61
62 void timer() interrupt 1
63 {
64 1 counter++;
65 1 if( counter == 14)
66 1 {
67 2 counter = 0;
68 2 LED = ~LED;//脈沖取反
69 2 TH0 = 0x3C;//重裝
70 2 TL0 = 0xB0;
71 2 }
72 1 }
73
74
75 void SendDat(uchar c)
76 {
77 1 key1 = 1;//要發送數據前,把485DIP角置高。因為此位為高時485為發送狀態
78 1 SBUF=c;
79 1 while(TI==0);//等待TI變高
80 1 TI=0;
81 1 key1 = 0;//發送完了以后,此位置0.為接收狀態
82 1
83 1
84 1 }
85
86 void InitRXD(void)
87 {
88 1 TMOD=0x21; //確定定時器工作模式
89 1 TH1=0xFD;
90 1 TL1=0xFD; //定時初值
91 1 PCON&=0x80; //SMOD=1
92 1 TR1=1; //開啟定時器1
93 1 SCON=0x50; //串口工作方式1
94 1 RI = 0;
95 1 TI = 0;
96 1 key1 = 0;//////////////////////////////////接收狀態
97 1
98 1 EA = 1;//開總中斷
99 1 ES = 1;//允許串行口中斷
100 1 PS = 1;//串行口中斷優先級高
101 1 }
102
103
104
105
106 void Rxd() interrupt 4
107 {
108 1
109 1 //uchar k;
110 1 uchar new_data,last_data,last_last_data;
111 1 uchar cRcv_Data1[50];
112 1 {
113 2 switch(cRcv_Stat1)
114 2 {
115 3 case 0:
116 3 if(RI);//接收數據;
117 3 new_data=SBUF;
C51 COMPILER V8.02 YJ 06/20/2007 13:39:50 PAGE 3
118 3 //
119 3 if(last_last_data==0x00 && last_data==0x02 && new_data==0xa6)
120 3 {
121 4
122 4 cRcv_Data1[5]=new_data;
123 4 cRcv_Data1[4]=last_data;
124 4 cRcv_Data1[3]=last_last_data;
125 4 cRcv_Data1[2]=0x00;
126 4 cRcv_Data1[1]=0x00;
127 4 cRcv_Data1[0]=0x00;
128 4
129 4 iRcv_Nmb1=6;
130 4 cRcv_Stat1=1; //是幀頭
131 4
132 4 }
133 3 else //
134 3 {
135 4 last_last_data=last_data;
136 4 last_data=new_data;
137 4 cRcv_Stat1=0;
138 4 }
139 3
140 3
141 3 break;
142 3 case 1:
143 3 if(RI);//接收數據;
144 3 cRcv_Data1[iRcv_Nmb1]=SBUF; //幀數據
145 3 if(iRcv_Nmb1==6)
146 3 exchange_data2.ii[0]=cRcv_Data1[iRcv_Nmb1];
147 3 if(iRcv_Nmb1==7)
148 3 exchange_data2.ii[1]=cRcv_Data1[iRcv_Nmb1];//計算有效數據長度,以此作為幀判斷的第一步
149 3
150 3 if(iRcv_Nmb1==exchange_data2.i+11) //判長度---1
151 3 {
152 4 iRcv_Nmb_Max=iRcv_Nmb1; //接收完一幀
153 4 cRcv_Stat1=0; //準備下一幀的接收
154 4 iRcv_Nmb1=0;
155 4
156 4 if((cRcv_Data1[iRcv_Nmb_Max]==0x0a)&&(cRcv_Data1[iRcv_Nmb_Max-1]==0x0d))//判結束字---2
157 4 {
158 5 for(i=0;i<=iRcv_Nmb_Max;i++) //接收數據回送,以便調試
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -