📄 test.lst
字号:
C51 COMPILER V8.16 TEST 11/17/2008 15:31:21 PAGE 1
C51 COMPILER V8.16, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN test.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE test.c ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h>
2 #include "string.h"
3
4
5 sbit LED1 = P1^2;
6 sbit LED2 = P1^4;
7 sbit LED3 = P1^3;
8 //sbit LED1 = P3^6;
9 //sbit LED2 = P3^7;
10 sbit W_IN = P3^2;
11 sbit W_OUT = P3^4;
12
13 unsigned char w_timer=0;
14 unsigned int jiffies=0,x=0;
15 void clock_timer(void) interrupt 1 using 1{
16 1 jiffies++;
17 1 //if(x++==500){x=0;
18 1 w_timer++;//};
19 1 }
20
21 void clock_init(void){
22 1 jiffies = 0;
23 1 TMOD=0x02;
24 1 // TH0=TL0=0x9b;//12M
25 1 // TH0=TL0=0x7a;//16M
26 1 // TH0=TL0=0x75;//16.59M
27 1 // TH0=TL0=0x72;//17M
28 1 // TH0=TL0=0x37;//24M
29 1 TH0=TL0=0x40;//22M
30 1 EA=1;
31 1 ET0=1;
32 1
33 1 TR0=1;
34 1 }
35 void init_serialcomm(void)
36 {
37 1 SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
38 1 TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
39 1 PCON |= 0x80; //SMOD=1;
40 1 TH1 = 0xFF; //Baud:4800 fosc=11.0592MHz :f4
41 1 //IE |= 0x90; //Enable Serial Interrupt
42 1 TR1 = 1; // timer 1 run
43 1 RI=0;
44 1 TI=1;
45 1 }
46
47 void serial_out(unsigned char d){
48 1 while(!TI);
49 1 TI=0;
50 1 SBUF=(d);
51 1 }
52
53 //等待指定长度的串行数据到达,超时值为每两个字节之间的间隔时间而非等待整个串的时间.
54 //超时单位为time_out * 100uS
55 bit wait_serial(unsigned char *p, unsigned char len, unsigned char time_out){
C51 COMPILER V8.16 TEST 11/17/2008 15:31:21 PAGE 2
56 1 unsigned int time=jiffies;
57 1 unsigned char n=0;
58 1 do{
59 2 if (RI){
60 3 p[n++]=SBUF;
61 3 RI=0;
62 3 if(n==len)
63 3 return 0;
64 3 time=jiffies;
65 3 }
66 2 }while(jiffies-time < time_out);
67 1 return 1;
68 1 }
69
70 #define W_LP 6 //低电平/前引导
71 #define W_HP 12 //高电平
72 #define W_FS 18 //引导/结束
73 #define HEAD_CODE 100 //前导码个数
74
75 #define DEBUG 0
76
77 #define W_BUF_LEN 24
78 unsigned char w_buf[W_BUF_LEN];
79
80 unsigned char w_recv_step=0;
81 unsigned char w_recv_data;
82 unsigned char w_recv_last_time; //上一次翻转的时间
83 unsigned char w_recv_width; //脉冲宽度
84 bit w_recv_status,w_recv_last_status;
85 bit recv_over = 0;
86 #define START_RECV() {w_recv_step=0; recv_over=0;}
87 #define STOP_RECV() {recv_over=1;}
88 void w_recv(void){
89 1 //正式写程序时,应在调用该函数前就做检测,以节省时间.以下检测应删去.
90 1 if(recv_over)
91 1 return;
92 1
93 1 w_recv_status=W_IN;
94 1 LED1=!w_recv_status;
95 1
96 1 if (w_recv_last_status == w_recv_status){//信号脚无变化,无信号到达,直接返回,返回前仅处理超时.
97 2 if (w_recv_step == 0)//w_recv_step==0时无需处理超时
98 2 return;
99 2 w_recv_width = w_timer - w_recv_last_time;
100 2 if (w_recv_width > W_FS + W_LP/2){//超时处理
101 3 w_recv_step = 0;
102 3 #if DEBUG
//serial_out(0x53);
//serial_out(w_recv_width);
#endif
106 3 }
107 2 return;
108 2 }
109 1 w_recv_last_status = w_recv_status;//记下本次电平值
110 1 w_recv_width = w_timer - w_recv_last_time;//如果上一个信号已完成,记录信号宽度,如果当前为第一个信号,该
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -