📄 lin_send.lst
字号:
C51 COMPILER V6.12 LIN_SEND 10/12/2008 16:28:17 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE LIN_SEND
OBJECT MODULE PLACED IN .\lin_send.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\lin_send.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2
3 sbit SLNP = P1^3; //定义控制睡眠模式的引脚
*** ERROR C202 IN LINE 3 OF .\LIN_SEND.C: 'P1': undefined identifier
4
5 l_u8 BreakReceived=0;
*** ERROR C129 IN LINE 5 OF .\LIN_SEND.C: missing ';' before 'BreakReceived'
6 l_u8 USART_DataReceived=0;
7 l_u8 WaitReceived=0;
8 l_u8 DataTemp;
9 //extern l_u8 PID = 0xF0;
10
11 void l_sys_init(void) //系51单片机统初始化函数
12 {
13 l_u8 i;
14 init_LCD(); //初始化液晶显示
15 clear_LCD();//清屏
16 //INT1 引脚的配置
17 PX1=0; //优先级置0
18 IT1=1; //下降沿触发
19 //T0定时/计数器配置
20 TMOD=TMOD|0X01; //设置T0为16位定时器 ,工作在方式1模式
21 PT0=0X01;//优先级置1,表示优先级最高
22 //T1定时/计数器配置 :
23 TMOD=TMOD|0X20; //设置T1为8位之装载定时器,工作在方式2模式
24 TH1=0xFA; //设置T1的值,使波特率为4800Baud
25
26 //COM
27 PCON=0X00;
28 //********TJA1020模式设置*******
29 //TJA1020有4种模式 分别为睡眠模式,准备模式,普通斜率模式,低斜率模式
30 TH0=-25000/256;//延时25ms //将TH0设为0x9F
31 TL0=-25000%256; //将TL0设为0x58
32 TR0=1;//启动定时器0
33
34 do
35 {
36 TXD=1;
37 RXD=1;
38 SLNP=0; //sbit SLNP=P1^3; 单片机和TJA1020收发器一上电进入睡眠模式
39 i=200;
40 while(i--);//延时
41 SLNP=1; //把TJA1020模式设置成普通斜率模式
42 i=200;
43 while(i--); //延时
44 }
45 while(TXD==0&&TF0==0); // 如果设置成功 则 TXD=1
46 TR0=0;//关闭T0定时/计数器 定时
47
48 if(TF0==1)//超过25ms返回 表示设置模式失败
49 {
50 TF0=0;
51 //return(1);
52 }
53 TF0=0;
C51 COMPILER V6.12 LIN_SEND 10/12/2008 16:28:17 PAGE 2
54
55
56 EA=1;//开总中断标志
57 }
58
59 void l_send_break(void) //发送同步间隔函数
60 {
61 PCON=0x00;//SMODE置0
62 TH1=0xF4;//将波特率设为正常数据传输速率的一般,为了保证发同步间隔时保持至少13个显示电平(低电平)
63 TL1=TH1;
64 TR1=1;
65 SCON=0X40;//方式1,不允许接受
66 SBUF=0X80; //二进制为1000 0000,先发低位,再发高位,这里发送同步间隔场,
67 //同步间隔场要求先显形电平(低电平),后隐性电平(高电平)
68 while(TI==0);
69 TI=0;
70 BreakReceived=1;
71
72
73
74 TR1=1;
75 SCON=0X50;//串口模式工作在方式1,许接受数据
76
77 }
78
79
80 void delay(l_u16 tm) //延时函数
81 {
82 while(tm--);
83 }
84
85
86 void l_send_bytes (l_u8 bytes)//发送字节 用来发同步场
87 {
88 PCON=0x00;//SMODE置0
89 TL1=TH1=0xFA; //设置T1的值,使波特率为4800Baud
90 TR1=1;
91 SCON=0X50;//串口模式工作在方式1 允许接收数据
92 SBUF=bytes;//将数据放到SBUF上准备发送
93 while(TI==0);
94 TI=0;
95 USART_DataReceived=1;
96 TR1=0;
97
98
99 }
100
101
102 l_u8 checksum8(l_u8 *chk8,l_u8 num) //求校验和,即数据场所有字节的和的反码
103 { //*chk8是要加的字节,num是字节个数)
104 l_u8 temp=0;//存放所有字节的和
105 for( ;num>0;num--)
106 {
107 temp=temp+*chk8;
108 chk8++;
109 } //求到所有字节的和
110 return(0xff-temp);//求字节何的反码并返回
111 }
112
113
114 void l_send_data(l_u8 * temp,l_u8 num) //发送数据场和校验和,*temp是存放数据的数组,num数据的个数
115 {
C51 COMPILER V6.12 LIN_SEND 10/12/2008 16:28:17 PAGE 3
116 l_u8 l_chksum,m;//l_chksumw是发送字节的个数 ,m是用来暂时存放校验和的
117
118 TL1=TH1;//TH1=FA,波特率为4800Baud
119 SCON=0X50;
120 TR1=1;
121
122 for(l_chksum=0;l_chksum<num;l_chksum++) //连续发送8个数据,并显示发送的数据
123 {
124 SBUF=*temp;
125 while(TI==0);
126 TI=0;
127 USART_DataReceived=1;
128 if(l_chksum==4) gotoxy(2,0); //发送完4个后 显示换行
129 display_LCD_number(*temp); //显示发送的数据
130 display_LCD_string(" "); //每发一个数据用一个空格隔开
131 temp++;
132 }
133 temp=temp-num;//再指向首地址
134 m=checksum8(temp,num); //求这个8个数据的校验和
135 SBUF=m; // 发送校验和
136 while(TI==0);
137 TI=0;
138 USART_DataReceived=1;
139
140 display_LCD_string(" <S>");
141
142 USART_DataReceived=1;
143 }
144
145 static void RevHeader(void) interrupt 4 //接收串口中断函数
146 {
147 ES=0;//关串口中断
148 if(RI==1)//如果RI=1,表示接收完毕
149 { RI=0;
150 DataTemp=SBUF;//将SBUF的数据放到DateTemp里 为存到receive_data[n]里作准备
151 WaitReceived=1;
152
153 }
154 ES=1;//开串口中断
155 return; //中断返回
156 }
157
158
159
160
C51 COMPILATION COMPLETE. 0 WARNING(S), 2 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -