6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C51 6.1 C51 6.1.1 C51 C51 ANSI C MCS-51 C51 ANSI C C51 6.1 6.1 C51 bit Byte bit sbit 1 0 1 unsigned char 8 1 0 255 Signed char 8 11 128 127 unsigned int 16 2 0 65535 signed int 16 2 32768 32767 unsigned long 32 4 0 4294967295 Signed long 32 4 2147483648 2147483647 float 32 4 1.176E 38 3.40E 38( 6 ) double 64 8 1.176E 38 3.40E 38( 10 ) 6.1.2 C51 C51 C51 data bdata idata pdata xdata code C51 MCS-51 6.2 6.2 C51 MCS-51 (bit) (Byte) data 8 1 0 255 128 RAM bdata 8 1 32 47 RAM 20H 2FH idata 8 1 0 255 RAM 00H FFH pdata 8 1 0 255 256 RAM MOVX @Ri xdata 16 2 0 65535 64K RAM MOVX @DPTR code 16 2 0 65535 64K ROM MOVC @DPTR RAM RAM 1
data bdata idata RAM pdata xdata code C51 ANSI C C++ char data var1 /* data RAM */ bit bdata flags // bdata RAM float idata x y z // x y z idata RAM unsigned int pdata dimension // pdata MOVX @Ri unsigned char xdata vector[10][4][4] // xdata RAM 10 4 4=160 SMALL COMPACT LARGE char var1 SMALL var1 data COMPACT var1 idata LARGE var1 xdata 6.3 6.3 128 data SMALL RAM COMPACT 256 pdata R0 R1 64KB xdata DPTR LARGE 6.1.3 C51 MCS-51 SFR MCS-51 21 SFR RAM 128 8 SFR SFR C51 sfr sbit SFR RAM I/O (1) SFR SFR sfr sbit C C51 sfr sbit sfr PSW=0xD0 // PSW D0H sfr TMOD=0x89 // / TMOD 89H sfr P1=0x90 // P1 90H sbit CY=0xD7 // CY D7H sbit AC=0xD0^6 // AC D6H sbit RS0=0xD0^3 // D3H 2
sfr sbit SFR (2) SFR MCS-51 SFR Keil C Keil C INC SFR #include aduc812.h // ADI Aduc812 main() TL0=0xb0; // 0 TH0=0x3c; TR0=1; // 0 (3) I/O RAM RAM I/O #include <absacc.h> // XBYTE RAM #define PA XBYTE[0xffec] // PA I/O oxffec main() PA=0x3A; // 3AH 0xffec I/O (4) C51 bit bit lock // lock bit dirention // direction bit bit bit func(bit b0,bit b1) bit a; return a; #progma disable using n bit *bitno; bit bitarray[10]; 3
bdata bdata int bdata a // a char bdata b[4] // b sbit sbit a0=a^0 // a0 a 0 sbit a12=a^12 // a12 a 12 sbit b03=b[0]^3 // b[0] 3 sbit b36=b[3]^6 // b[3] 6 sbit bdata sbit 6.2 C51 C51 ANSI C 6.2.1 C51 (1) C51 * (2) j j i i j 1 j 1 (3) (2a+3b)*c/d C51 C 6.1 4 6.1 C51
int a b //a (double) a+b // a+b double 6.2.2 C51 (1),C51 (2) a>b a=3 < b=2 C51 1 0 a>=b a 4 b 3 1 a 2 0 6.2.3 C51 (1) C51 && (2) 0 a&&b&&c a 0 b c 0 6.2.4 C51 C51 5
& var3 var1 & bvar2 var3 var1 bvar2 var3 var1 bvar2 var1 var2 << var1 var<<2 >> var1 var2>>5 MCS-51 C51 6.2.5 C51 (1) = (2) = a=(b=4)+(c=6) 10 a 10 (3) = IEEE long int long int long int long int long long int (4) C51 * ^ << >> a += b // a = (a+b) x *= a+b // x = (x*(a+b)) a &= b // a = (a&b) a <<= 4 // a = (a<<4) 6.3 C51 C51 6
6.3.1 n [n] [ ] (1) [ ] int demo1[10] // 10 int a[5]=1 2 3 4 5 // a[0]=1 a[1]=2 a[2]=3 a[3]=4 a[4]=5 int b[6]=1 2 6 // b[0]=1 b[1]=2 b[2]=6 b[3]=b[4]=b[5]=0 (2) [ ] [ ] float demo2[3][4] //demo2 3 4 12 int a[3][4]=1 2 3 4 5 6 7 8 9 10 11 12 // int b[3][4]=1 2 3 4 5 6 7 8 // 0 (3) char a[12]= Chong Qing // char add[3][6]="weight","height","width"; // 6.3.2 C51 (1) char xdata *px // px RAM // Px 2 char xdata *data py // px RAM // Py RAM 2 7
(2) * char *pz pz pz 3 6.4 6.5 6.4 3 +0 +1 +2 6.5 idata xdata pdata data code 1 2 3 4 5 0x55 0x8000 RAM #include <absacc.h> XBYTE[0x8000]=0x41 //XBYTE absacc.h #define XBYTE ((unsigned char *) 0x2000L) XBYTE (unsigned char *) 0x2000L 2 xdata 0000 XBYTE RAM XBYTE[8000] 0x8000 RAM 6.3.3 C51 (1) struct // date struct date int month int day int year (2) 8
date date1 date2 // date date1 date2 struct student int no char name[20] int grade wangxiao liping // date1 date2 (3) date1.year = 2003 date1.month = 12 date1.day = 25 C51 6.4 C51 ANSI C C51 C51 6.4.1 C51 if switch/case (1) if C51 if if if 1 else 2 if 1 1 else if 2 2 else if 3 3 if if if if if else else if 6.1 0.000 9999 4 4 0.000 9.999 10.00 99.99 100.0 999.9 1000 9999 0 1 2 3 int ftochar(float valp) int dotno=0; if(valp<10.0) dotno=0; else if((valp>=10.0)&&(valp<100.0)) dotno=1; else if((valp>=100.0)&&(valp<1000.0)) dotno=2; else if(valp>=1000.0) dotno=3; return dotno; 9
(2) switch/case switch/case C51 switch case 1 1 break case 2 2 break case n n break default n+1 switch case break switch case default case case default case break switch case 6.2 AT89C51 P1.0 P1.1 4 P2.0 P2.3 4 LED #include <at89x51.h> void main() char a; do a=p1; a=a&0x03; // 6 P2=P2&0xf0; switch (a) case0 P2=P2 0x01 break case1 P2=P2 0x02 break case2 P2=P2 0x04 break case3 P2=P2 0x08 while(1) 6.4.2 C51 4 10
(1) if goto if goto loop if goto loop loop if goto loop if goto loop goto goto goto (2) while while while // while 0 while (3) do-while do-while do // while do-while 0 0 6.3 sample 10 float avg(float *sample) float sum=0 char no=0 11
do sum += sample[no] no++ while(no<10) return (sum/10) (4) for for for 1 2 3 1 2 0 3 2 for 1 2 3 6.4 1 100 printf( ) #include<aduc812.h> #include<atdio.h> int getsum (void) main( ) SCON = 0x50 // Keil C printf( ) SCON TMOD = TMOD 0x20 // T1 2 TH1 = 0xfd // 9600bps T1 0xfd TL1 =0xfd TR1 = 1 // T1 TI = 1 // printf("%d\n",getsum()); do while(1); int getsum (void) int sum=0 int n for (n=1;n<=100;n++) sum=sum+n return sum 12
6.4.3 C51 C51 C51 interrupt n using r interrupt using n n 0 5 0 / 0 1 / 1 / 2 6 MCS-51 r 0 3 6.5 Aduc812 12MHz P1.0 2 #include<aduc812.h> int t0int_no = 0 sbit p11 = P1^0 main( ) TMOD = 0x1 // T0 1 TH0 = 0x3c // 50ms 1 TL0 = 0xb0 IE = 0x82 // TR0 = 1 p11 = 0 // do while(1); // SJMP $ void time0_int ( void ) interrupt 1 TH0 = 0x3c // TL0 = 0xb0 t0int_no++ // 20 P1.0 if( t0int_no >= 20 ) t0int_no = 0 p11= ~p11 6.5 C51 6.5.1 (1) 13
C C main( ) C C 2 C51 (2) int char float double void return 6.5.2 ( ) ANSI C C51 6.6 C51 6.6 6.3 sample 8 14
#include<aduc812.h> #include<stdio.h> float demo[ ]=67.5,2.0,3.0,4.0,5.0,30.6,7.0,8.0,9.0,10.0; float avg2(float*); main() SCON = 0x50 // SCON printf( ) 2 TMOD = TMOD 0x20 // T1 2 TH1 = 0xfd // 9600bps T1 0xfd TL1 =0xfd TR1 = 1 // T1 TI = 1 // printf("%f\n",avg2(demo)) do while(1); float avg2(float *sample) float max,min,sum; char no=1; max=min=sum=sample[0]; for(no=1;no<10;no++) if(max < sample[no]) max=sample[no]; if(min > sample[no]) min=sample[no]; sum += sample[no]; return ((sum-max-min)/8); 6.7 6.2 8155 8155PA 8 8 LED 1 6.2 6.7 15
8155 COM8155 8000H PA PA8155 8001H PB PB8155 8002H PC PC8155 8003H PB 8155PB 02H #include<at89x51.h> #include <absacc.h> #define COM8155 XBYTE[0x8000] #define PB8155 XBYTE[0x8002] int t0int_no=0; main() TMOD=0x1; TH0=0x3c; TL0=0xb0; IE=0x82; TR0=1; p11=0; do while(1); void time0_int(void) interrupt 1 TH0=0x3c; TL0=0xb0; t0int_no++; if(t0int_no>=20) t0int_no=0; PB8155=disp_word; disp_word= disp_word<<1; if( disp_word = =0) disp_word = 0x01; LED 8155 PB LED LED 6.8 Aduc812 4 4 1/4 16
20ms 4 1 4 1 #include<aduc812.h> unsigned char data disp_buffer[4]=12,0,0,0; 6.3 6.8 unsigned char dispno=0; unsigned char data disp_buffer[4]=1,2,3,4; unsigned char code segment_table[]=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f sbit ledb3=p3^4; sbit ledb2=p3^5; sbit ledb1=p3^6; sbit ledb0=p3^7; main() TMOD=0x1; TH0=0xee; // 11.0592MHz 5ms 1 TL0=0x00; IE=0x82; TR0=1; p11=0; do while(1); void time0_int(void) interrupt 1 17
TH0=0xee; TL0=0x00; P0=0x00; P3=P3 0xf0; P0=segment_table[disp_buffer[dispno]]; // 4 // disp_buffer switch(dispno) case 0: ledb3=0; break; // 0 case 1: ledb2=0; break; // 1 case 2: ledb1=0; break; // 2 case 3: ledb0=0; break; // 3 default: break; dispno++; if(dispno>3) dispno=0; // 3 0 6.9 6.1 4 LCD 0.000 9999 4 4 5 unsigned char * float_char(float valp) char idata disp[5]; // 4 if(valp<10.0) // 0.000 9.999 1000 4 0 disp[4]=0; valp *=1000.0; else if((valp>=10.0)&&(valp<100.0)) // 10.00 99.99 100 4 1 disp[4]=1; valp *=100.0; else if((valp>=100.0)&&(valp<1000.0)) // 100.0 999.9 10 4 2 disp[4]=2; valp *=10.0; 18
else if(valp>=1000.0) disp[4]=3; // 1000 9999 3 disp[0]=(int)valp/1000; // disp[1]=((int)valp%1000)/100; // disp[2]=(((int)valp%1000)%100)/10; // disp[3]=(((int)valp%1000)%100)%10; // return disp; // 6.10 Aduc812 ADC6 0 5V ADCCON1 ADCCON2 ADCCON3 Aduc812 A/D 4 #include<aduc812.h> float adc(void) main( ) ADCCON1=0x7c; //ADC 8 9 ADCCON2=(ADCCON2&0xf0) 0x06; // 6 SCONV=1; // A/D for( ) printf( %f\n adc( )); float adc(void) char status; float ftemp; do status=adccon3&0x80; // ADCCON3 while(status!= 0); ftemp=(adcdatah&0x0f)*256+adcdatal; // A/D ftemp=ftemp*5.0 /4095.0; // SCONV=1; // return ftemp; 6.11 Aduc812 D/A Aduc812 2 12 D/A 4 void dac(int dac1 int dac2) DACCON=0x7f; DAC0H=(dac1/256)&0x0f; // 19
DAC0L=dac1%256; DAC0H=(dac2/256)&0x0f; DAC0L=dac2%256; // C51 C51 C51 C51 C C51 ANSI C MCS-51 bits bit data bdata idata pdata xdata code C51 interrupt using C51 ANSI C C51 I/O 6 1 C51 Turbo C 2 C51 3 C51 data bdata idata 4 1 100 3 5 / 0 6 demo[0] demo[3] 4 7 MCS-51 P1 8 P2 8 LED P1 LED 8 6.3 10 9 6.3 P1.0 P1.3 4 4 20