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