📄 led8.lst
字号:
C51 COMPILER V6.12 LED8 02/24/2005 10:39:02 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE LED8
OBJECT MODULE PLACED IN .\Led8.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE .\Led8.c DEBUG OBJECTEXTEND
stmt level source
1 #include <AT89X51.h> // use philips 89v51RD2
2 sfr WDTC = 0xC0; //watch dog
3 sfr WDTD = 0x85;
4
5 void initial_system(); ////串口方式1,允许接收,定时器1方式2,定时器0方式1
6 char get(); //读取串口,如超过312.5uS则置超时标志 time_overflow=0xFF
7 void put(char);
8 void display(); //显示disp_buffer[0~13]中的数,16bit表示一位LED,disp_buffer[1]==最左边的LED disp_buffer[0
-].7==1表示同时显示一个小数点,其他LED以此类推
9 void self_test(); //自测模式,依次点亮LED的每一笔段
10 void delay(unsigned int time); //软件延时
11 void ModbusCrc(unsigned char x);// modbus协议CRC校验, R7为输入校验字节,CRC2为校验字
12 void clear_dog(); // clear watch dog time
13
14 unsigned char code SEG7[]={0x7D,0x0C,0xB5,0x9D,0xCC,0xD9,0xF9,0x0D,0xFD,0xDD,0xED,0xF8,0x71,0xBC,0xF1,0xE1
-,0x80,0x70,0x00};//字符0~9,'A'~'F','-','L',' '
15 unsigned char xdata buffer[25];
16 unsigned char xdata disp_buffer[14];//一个是串口接收缓存,另一个是显示缓存
17 unsigned char time_overflow; //超时标志位
18 unsigned int CRC2; //用于CRC校验函数的变量
19
20 main(){
21 1 unsigned char i;
22 1 initial_system();
23 1 while(1)
24 1 {
25 2 while(get()!= 0x01)
26 2 ; //wait myself address
27 2 buffer[0]= 0x01;
28 2 i= 1;
29 2 time_overflow=0x00;
30 2 while(time_overflow==0x00){
31 3 buffer[i]= get();
32 3 i++;
33 3 if(i>25) i=25;
34 3 }
35 2 if(i<25){ //三个功能:06H--写一位LED, 10H--写全部7位LED, 16H--自测,依次点亮LED的每一笔段
36 3 switch(buffer[1]){ //select the fuction code
37 4 case 0x10: //写多寄存器,格式: 01,10,00,01,00,07,0e,14Byte data,CRC_high,CRC_low
38 4 if(i!=24 || buffer[2]!=0x00 || buffer[3]!=0x00 || buffer[4]!=0x00 || buffer[5]!=0x07 || buffer[6]!=0x
-0E)//一共收23位数据,加上超时出错执行一次i++,所以i=24
39 4 break; //地址不是从0001开始的,写字节数不等于14 word的,都认为出错
40 4 for(i=0,CRC2=0xFFFF;i<21;i++)
41 4 ModbusCrc(buffer[i]);//计算crc
42 4 if((buffer[22]==CRC2/256) && (buffer[21]==CRC2%256)){
43 5 for(i=0;i<14;i++)
44 5 disp_buffer[i]= buffer[i+7];
45 5 display();
46 5 for(i=0,CRC2=0xFFFF;i<6;i++) //计算并返回报文
47 5 ModbusCrc(buffer[i]);
48 5 buffer[6]= CRC2%256;
49 5 buffer[7]= CRC2/256;
50 5 for(i=0;i<8;i++)
51 5 put(buffer[i]);
52 5 }
C51 COMPILER V6.12 LED8 02/24/2005 10:39:02 PAGE 2
53 4 break;
54 4 case 0x06: //写单寄存器,格式: 01,06,address_high,address_low,data_high,data_low,CRC
55 4 if(i!=9 || buffer[2]!=0x00 || buffer[3]>0x06)
56 4 break; //地址不是从0001开始的,都认为出错
57 4 for(i=0,CRC2=0xFFFF;i<6;i++)
58 4 ModbusCrc(buffer[i]);//计算crc
59 4 if((buffer[7]==CRC2/256) && (buffer[6]==CRC2%256)){
60 5 i= buffer[3];
61 5 disp_buffer[i*2]= buffer[4];
62 5 disp_buffer[i*2+1]= buffer[5];
63 5 display();
64 5 for(i=0;i<8;i++)
65 5 put(buffer[i]); //正常处理返回报文
66 5 }
67 4 break;
68 4 case 0x16: //附加功能自我测试,格式: 01,16,ff,ff,ff,ff,ff,ff,ff,ff,CRC
69 4 for(i=0,CRC2=0xFFFF;i<10;i++)
70 4 ModbusCrc(buffer[i]);//计算crc
71 4 if(buffer[2]==0xff && buffer[3]==0xff && buffer[4]==0xff && buffer[5]==0xff && buffer[6]==0xff && buf
-fer[7]==0xff && buffer[8]==0xff && buffer[9]==0xff)
72 4 if((buffer[11]==CRC2/256) && (buffer[10]==CRC2%256)){
73 5 for(i=0;i<12;i++)
74 5 put(buffer[i]);
75 5 self_test();
76 5 }
77 4 break;
78 4 case 0x03:
79 4 for(i=0,CRC2=0xFFFF;i<6;i++)
80 4 ModbusCrc(buffer[i]);//计算crc
81 4 disp_buffer[0]=1;//---------
82 4 display();//------------
83 4 if((buffer[4]==0) && (buffer[5]==1) && (buffer[6]==CRC2%256) && (buffer[7]==CRC2/256)){//只允许读一个
-字节
84 5 buffer[2]= 2;//byte of counts
85 5 buffer[3]= buffer[4]= 0;//response data
86 5 for(i=0,CRC2=0xFFFF;i<5;i++)
87 5 ModbusCrc(buffer[i]);//计算crc
88 5 buffer[5]= CRC2%256; buffer[6]=CRC2/256;//CRC
89 5 for(i=0;i<7;i++)
90 5 put(buffer[i]);
91 5 }
92 4 break;
93 4 }
94 3 }
95 2 }
96 1 }
97
98 void initial_system(){
99 1 unsigned char i;
100 1 P2= 0xff;
101 1 P0= 0xff; //笔段全亮
102 1 delay(65000);
103 1 delay(65000);
104 1 SCON = 0x50; //串口方式1,允许接收
105 1 TMOD = 0x21; //定时器1方式2,定时器0方式1
106 1 TR1 = 1; //设定时器1开始计数
107 1 TH1=TL1= 0xFD; //11.0592MHz 9600波特率
108 1 TH0=TL0= 0x00;
109 1 TI = 1;
110 1 if((WDTC & 0x04)== 0){ //是上电复位,初始化显示
111 2 for(i=0;i<14;i++)
112 2 disp_buffer[i]= 0x10; // '-'
C51 COMPILER V6.12 LED8 02/24/2005 10:39:02 PAGE 3
113 2 }
114 1 display();
115 1 WDTC= 0x0b; // start watch_dog, about 5s overflow
116 1 }
117
118
119 void display(){
120 1 unsigned char i,ch,latch;
121 1 i= 0;
122 1 latch= 0x02;
123 1 while(latch >0){
124 2 ch= disp_buffer[i+1];
125 2 if (disp_buffer[i] < 0x80) //最高位为1,表示本位要显示一个小数点
126 2 P0= SEG7[ch];
127 2 else
128 2 P0= SEG7[ch] | 0x02; //显示一个小数点
129 2 P2= latch;
130 2 delay(20);
131 2 P2= 0x00;
132 2 latch= latch <<1;
133 2 i= i+2;
134 2 }
135 1 }
136
137 void self_test(){
138 1 unsigned char i;
139 1 P2= 0xff;
140 1 P0= 0x01;
141 1 delay(50000);
142 1 delay(50000);
143 1 for(i=0;i<7;i++){
144 2 P0= P0<<1;
145 2 clear_dog();
146 2 delay(50000);
147 2 delay(50000);
148 2 }
149 1 P2= 0xff;
150 1 P0= 0xff; //笔段全亮
151 1 while(1);
152 1 }
153
154 void delay(unsigned int time){
155 1 unsigned int v_delay;
156 1 for(v_delay=0; v_delay<time; v_delay++);
157 1 }
158
159 void ModbusCrc(unsigned char x)
160 {
161 1 unsigned char k,v;
162 1 CRC2=CRC2^x;
163 1 for(k=0;k<8;k++)
164 1 {
165 2 v=CRC2 %2;
166 2 CRC2=CRC2>>1;
167 2 if(v==1) {CRC2=CRC2^0xa001;}
168 2 }
169 1 }
170
171 char get(){
172 1 time_overflow= 0x00;
173 1 TF0= 0;
174 1 TH0= 0xF0; //about 5ms @ 12 clock
C51 COMPILER V6.12 LED8 02/24/2005 10:39:02 PAGE 4
175 1 TR0=1; //计数一次=1.085us @ 11.0592MHz / 12 colck mode
176 1 while(RI==0){
177 2 clear_dog();
178 2 if(TF0==1){
179 3 time_overflow=0xFF;
180 3 return(0);
181 3 }
182 2 }
183 1 RI= 0;
184 1 return(SBUF);
185 1 }
186
187 void put(char ch)
188 {
189 1 TI= 0;
190 1 SBUF= ch;
191 1 while(!TI);
192 1 }
193
194 void clear_dog()
195 {
196 1 WDTC= 0x0b; //clear dog
197 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1008 ----
CONSTANT SIZE = 19 ----
XDATA SIZE = 39 ----
PDATA SIZE = ---- ----
DATA SIZE = 3 4
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -