c语言红外测距传感器函数 红外线测距传感器原理图

C语言转汇编语言(把下面的C语言转成单片机汇编语言)

; .\test5.SRC generated from: test5.c

创新互联主要从事成都网站设计、网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务城西,十余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220

; COMPILER INVOKED BY:

; E:\Program Files\keil\C51\BIN\C51.EXE test5.c BROWSE DEBUG OBJECTEXTEND SRC(.\test5.SRC)

$NOMOD51

NAME TEST5

P0 DATA 080H

P1 DATA 090H

P2 DATA 0A0H

P3 DATA 0B0H

T0 BIT 0B0H.4

AC BIT 0D0H.6

T1 BIT 0B0H.5

T2 BIT 090H.0

EA BIT 0A8H.7

IE DATA 0A8H

EXF2 BIT 0C8H.6

RD BIT 0B0H.7

ES BIT 0A8H.4

IP DATA 0B8H

RI BIT 098H.0

INT0 BIT 0B0H.2

CY BIT 0D0H.7

TI BIT 098H.1

INT1 BIT 0B0H.3

RCAP2H DATA 0CBH

PS BIT 0B8H.4

SP DATA 081H

T2EX BIT 090H.1

OV BIT 0D0H.2

RCAP2L DATA 0CAH

C_T2 BIT 0C8H.1

WR BIT 0B0H.6

RCLK BIT 0C8H.5

TCLK BIT 0C8H.4

SBUF DATA 099H

PCON DATA 087H

SCON DATA 098H

TMOD DATA 089H

TCON DATA 088H

IE0 BIT 088H.1

IE1 BIT 088H.3

B DATA 0F0H

CP_RL2 BIT 0C8H.0

ACC DATA 0E0H

ET0 BIT 0A8H.1

ET1 BIT 0A8H.3

TF0 BIT 088H.5

ET2 BIT 0A8H.5

TF1 BIT 088H.7

TF2 BIT 0C8H.7

RB8 BIT 098H.2

TH0 DATA 08CH

EX0 BIT 0A8H.0

IT0 BIT 088H.0

TH1 DATA 08DH

TB8 BIT 098H.3

EX1 BIT 0A8H.2

IT1 BIT 088H.2

TH2 DATA 0CDH

P BIT 0D0H.0

SM0 BIT 098H.7

TL0 DATA 08AH

SM1 BIT 098H.6

TL1 DATA 08BH

SM2 BIT 098H.5

TL2 DATA 0CCH

p21 BIT 0A0H.1

PT0 BIT 0B8H.1

p23 BIT 0A0H.3

PT1 BIT 0B8H.3

RS0 BIT 0D0H.3

PT2 BIT 0B8H.5

TR0 BIT 088H.4

RS1 BIT 0D0H.4

p25 BIT 0A0H.5

TR1 BIT 088H.6

TR2 BIT 0C8H.2

PX0 BIT 0B8H.0

PX1 BIT 0B8H.2

DPH DATA 083H

DPL DATA 082H

EXEN2 BIT 0C8H.3

REN BIT 098H.4

T2CON DATA 0C8H

RXD BIT 0B0H.0

TXD BIT 0B0H.1

F0 BIT 0D0H.5

PSW DATA 0D0H

?PR?timer0?TEST5 SEGMENT CODE

?PR?timer1?TEST5 SEGMENT CODE

?PR?_delay?TEST5 SEGMENT CODE

?PR?_pwm1?TEST5 SEGMENT CODE

?PR?_pwm0?TEST5 SEGMENT CODE

?PR?foot0?TEST5 SEGMENT CODE

?PR?foot1?TEST5 SEGMENT CODE

?PR?foot2?TEST5 SEGMENT CODE

?PR?foot3?TEST5 SEGMENT CODE

?PR?main?TEST5 SEGMENT CODE

?CO?TEST5 SEGMENT CODE

?DT?TEST5 SEGMENT DATA

EXTRN CODE (?C_STARTUP)

PUBLIC rud1

PUBLIC z

PUBLIC y

PUBLIC x

PUBLIC n

PUBLIC m

PUBLIC l

PUBLIC k

PUBLIC j

PUBLIC i

PUBLIC d

PUBLIC c?

PUBLIC b

PUBLIC a?

PUBLIC rud3

PUBLIC rud2

PUBLIC date1

PUBLIC date0

PUBLIC main

PUBLIC foot3

PUBLIC foot2

PUBLIC foot1

PUBLIC foot0

PUBLIC _pwm0

PUBLIC _pwm1

PUBLIC _delay

PUBLIC timer1

PUBLIC timer0

RSEG ?DT?TEST5

rud2: DS 2

rud3: DS 2

a?: DS 2

b: DS 2

c?: DS 2

d: DS 2

i: DS 2

j: DS 2

k: DS 2

l: DS 2

m: DS 2

n: DS 2

x: DS 2

y: DS 2

z: DS 2

rud1: DS 2

RSEG ?CO?TEST5

date0:

DW 004B0H

DW 004C9H

DW 004E2H

DW 004FBH

DW 00514H

DW 0052DH

DW 00546H

DW 0055FH

DW 00578H

DW 00591H

DW 005AAH

DW 005C3H

DW 005DCH

DW 005F5H

DW 0060EH

DW 00627H

DW 00640H

DW 00659H

DW 00672H

DW 0068BH

DW 006A4H

DW 006BDH

DW 006D6H

DW 006EFH

DW 00708H

date1:

DW 003E8H

DW 00401H

DW 0041AH

DW 00433H

DW 0044CH

DW 00465H

DW 0047EH

DW 00497H

DW 004B0H

DW 004C9H

DW 004E2H

DW 004FBH

DW 00514H

DW 0052DH

DW 00546H

DW 0055FH

DW 00578H

DW 00591H

DW 005AAH

DW 005C3H

DW 005DCH

DW 005F5H

DW 0060EH

DW 00627H

DW 00640H

DW 00659H

DW 00672H

DW 0068BH

DW 006A4H

DW 006BDH

DW 006D6H

DW 006EFH

DW 00708H

DW 00721H

DW 0073AH

DW 00753H

DW 0076CH

DW 00785H

DW 0079EH

DW 007B7H

DW 007D0H

; # include reg52.h

; #define uchar unsigned char

; #define uint unsigned int

; uint a,b,c,d,i,j,k,x,y,z,l,m,n,rud1,rud2,rud3;

; sbit p21=P2^1;

; sbit p23=P2^3;//

; sbit p25=P2^5; //

; int code date0[]={1200,1225,1250,1275,1300,

; 1325,1350,1375,1400,

; 1425,1450,1475,1500,

; 1525,1550,1575,1600,

; 1625,1650,1675,1700,

; 1725,1750,1775,1800}; //p25 25个

;

; int code date1[]={1000,1025,1050,1075,1100,

; 1125,1150,1175,1200,

; 1225,1250,1275,1300,

; 1325,1350,1375,1400,

; 1425,1450,1475,1500,

; 1525,1550,1575,1600,

; 1625,1650,1675,1700,

; 1725,1750,1775,1800,

; 1825,1850,1875,1900,

; 1925,1950,1975,2000}; //p21p23 41个

;

CSEG AT 0000BH

LJMP timer0

; void timer0(void) interrupt 1

RSEG ?PR?timer0?TEST5

USING 0

timer0:

PUSH ACC

PUSH PSW

; SOURCE LINE # 26

; {

; p25=~p25;

; SOURCE LINE # 28

CPL p25

; c=20000-c;

; SOURCE LINE # 29

CLR C

MOV A,#020H

SUBB A,c?+01H

MOV c?+01H,A

MOV A,#04EH

SUBB A,c?

MOV c?,A

; TH0=-(c/256); TL0=-(c%256);

; SOURCE LINE # 30

CPL A

INC A

MOV TH0,A

MOV A,c?+01H

CPL A

INC A

MOV TL0,A

; }

; SOURCE LINE # 31

POP PSW

POP ACC

RETI

; END OF timer0

CSEG AT 0001BH

LJMP timer1

; void timer1(void) interrupt 3

RSEG ?PR?timer1?TEST5

USING 0

timer1:

PUSH ACC

PUSH PSW

; SOURCE LINE # 32

; {

;

; p21=~p21;

; SOURCE LINE # 35

CPL p21

; p23=~p23;

; SOURCE LINE # 36

CPL p23

; d=20000-d;

; SOURCE LINE # 37

CLR C

MOV A,#020H

SUBB A,d+01H

MOV d+01H,A

MOV A,#04EH

SUBB A,d

MOV d,A

; TH1=-(d/256); TL1=-(d%256);

; SOURCE LINE # 38

CPL A

INC A

MOV TH1,A

MOV A,d+01H

CPL A

INC A

MOV TL1,A

;

; }

; SOURCE LINE # 40

POP PSW

POP ACC

RETI

; END OF timer1

;

; void delay(t)

RSEG ?PR?_delay?TEST5

L?0033:

USING 0

MOV R7,#030H

MOV R6,#075H

LCALL _delay

LCALL _delay

LCALL _delay

LCALL _delay

_delay:

; SOURCE LINE # 42

;---- Variable 't?240' assigned to Register 'R6/R7' ----

; {for(l=1;l=t;l++);}

; SOURCE LINE # 43

MOV l,#00H

MOV l+01H,#01H

?C0003:

SETB C

MOV A,l+01H

SUBB A,R7

MOV A,l

SUBB A,R6

JNC ?C0006

INC l+01H

MOV A,l+01H

JNZ ?C0003

INC l

?C0028:

SJMP ?C0003

?C0006:

RET

; END OF _delay

;

; void pwm1(y)

RSEG ?PR?_pwm1?TEST5

L?0035:

USING 0

MOV A,j+01H

ADD A,ACC

MOV R7,A

MOV A,j

RLC A

MOV R6,A

MOV A,#LOW (date1)

ADD A,R7

MOV DPL,A

MOV A,#HIGH (date1)

ADDC A,R6

MOV DPH,A

CLR A

MOVC A,@A+DPTR

MOV R6,A

MOV A,#01H

MOVC A,@A+DPTR

MOV R7,A

_pwm1:

; SOURCE LINE # 45

;---- Variable 'y?341' assigned to Register 'R6/R7' ----

; {

; SOURCE LINE # 46

; b=y;

; SOURCE LINE # 47

MOV b,R6

MOV b+01H,R7

; d=b;

; SOURCE LINE # 48

MOV d,b

MOV d+01H,b+01H

; p21=1;

; SOURCE LINE # 49

SETB p21

; p23=1;

; SOURCE LINE # 50

SETB p23

; TH1=-(b/256); TL1=-(b%256);

; SOURCE LINE # 51

MOV A,b

CPL A

INC A

MOV TH1,A

MOV A,b+01H

CPL A

INC A

MOV TL1,A

; TR1=1;//启动定时器

; SOURCE LINE # 52

SETB TR1

; }

; SOURCE LINE # 53

RET

; END OF _pwm1

; void pwm0(x)

RSEG ?PR?_pwm0?TEST5

L?0034:

USING 0

MOV A,i+01H

ADD A,ACC

MOV R7,A

MOV A,i

RLC A

MOV R6,A

MOV A,#LOW (date0)

ADD A,R7

MOV DPL,A

MOV A,#HIGH (date0)

ADDC A,R6

MOV DPH,A

CLR A

MOVC A,@A+DPTR

MOV R6,A

MOV A,#01H

MOVC A,@A+DPTR

MOV R7,A

_pwm0:

; SOURCE LINE # 54

;---- Variable 'x?442' assigned to Register 'R6/R7' ----

; {

; SOURCE LINE # 55

; a=x;

; SOURCE LINE # 56

MOV a?,R6

MOV a?+01H,R7

; c=a;

; SOURCE LINE # 57

MOV c?,a?

MOV c?+01H,a?+01H

; p25=1;

; SOURCE LINE # 58

SETB p25

; TH0=-(a/256); TL0=-(a%256);

; SOURCE LINE # 59

MOV A,a?

CPL A

INC A

MOV TH0,A

MOV A,a?+01H

CPL A

INC A

MOV TL0,A

; TR0=1;//启动定时器

; SOURCE LINE # 60

SETB TR0

; }

; SOURCE LINE # 61

RET

; END OF _pwm0

; void foot0()

RSEG ?PR?foot0?TEST5

foot0:

USING 0

; SOURCE LINE # 62

; {

; SOURCE LINE # 63

; for(i=0;i24;i++)

; SOURCE LINE # 64

CLR A

MOV i,A

MOV i+01H,A

?C0009:

; {

; SOURCE LINE # 65

; pwm0(date0[i]);

; SOURCE LINE # 66

LCALL L?0034

; delay(888);

; SOURCE LINE # 67

MOV R7,#078H

MOV R6,#03H

LCALL _delay

; }

; SOURCE LINE # 68

INC i+01H

MOV A,i+01H

JNZ ?C0029

INC i

?C0029:

CLR C

SUBB A,#018H

MOV A,i

SUBB A,#00H

JC ?C0009

; }

; SOURCE LINE # 69

?C0012:

RET

; END OF foot0

; void foot1()

RSEG ?PR?foot1?TEST5

foot1:

USING 0

; SOURCE LINE # 70

; {

; SOURCE LINE # 71

; for(j=0;j14;j++)

; SOURCE LINE # 72

CLR A

MOV j,A

MOV j+01H,A

?C0013:

; { pwm1(date1[j]);

; SOURCE LINE # 73

LCALL L?0035

; delay(1332);

; SOURCE LINE # 74

MOV R7,#034H

MOV R6,#05H

LCALL _delay

; }

; SOURCE LINE # 75

INC j+01H

MOV A,j+01H

JNZ ?C0030

INC j

?C0030:

CLR C

SUBB A,#0EH

MOV A,j

SUBB A,#00H

JC ?C0013

; }

; SOURCE LINE # 76

?C0016:

RET

; END OF foot1

; void foot2()

RSEG ?PR?foot2?TEST5

foot2:

USING 0

; SOURCE LINE # 77

; {

; SOURCE LINE # 78

; for(i=24;i1;i--)

; SOURCE LINE # 79

MOV i,#00H

MOV i+01H,#018H

?C0017:

; {

; SOURCE LINE # 80

; pwm0(date0[i]);

; SOURCE LINE # 81

LCALL L?0034

; delay(888);

; SOURCE LINE # 82

MOV R7,#078H

MOV R6,#03H

LCALL _delay

; }

; SOURCE LINE # 83

MOV A,i+01H

DEC i+01H

JNZ ?C0031

DEC i

?C0031:

SETB C

MOV A,i+01H

SUBB A,#01H

MOV A,i

SUBB A,#00H

JNC ?C0017

; }

; SOURCE LINE # 84

?C0020:

RET

; END OF foot2

; void foot3()

RSEG ?PR?foot3?TEST5

foot3:

USING 0

; SOURCE LINE # 85

; {

; SOURCE LINE # 86

; for(j=14;j1;j--)

; SOURCE LINE # 87

MOV j,#00H

MOV j+01H,#0EH

?C0021:

; {

; SOURCE LINE # 88

; pwm1(date1[j]);

; SOURCE LINE # 89

LCALL L?0035

; delay(1332);

; SOURCE LINE # 90

MOV R7,#034H

MOV R6,#05H

LCALL _delay

; }

; SOURCE LINE # 91

MOV A,j+01H

DEC j+01H

JNZ ?C0032

DEC j

?C0032:

SETB C

MOV A,j+01H

SUBB A,#01H

MOV A,j

SUBB A,#00H

JNC ?C0021

; }

; SOURCE LINE # 92

?C0024:

RET

; END OF foot3

; void main(void)

RSEG ?PR?main?TEST5

main:

USING 0

; SOURCE LINE # 93

; {

; SOURCE LINE # 94

; p21=0;p23=0;p25=0;

; SOURCE LINE # 95

CLR p21

CLR p23

CLR p25

; TMOD=0x11;EA=1;ET0=1;ET1=1;

; SOURCE LINE # 96

MOV TMOD,#011H

SETB EA

SETB ET0

SETB ET1

; delay(30000); delay(30000); delay(30000); delay(30000);delay(30000);

; SOURCE LINE # 97

LCALL L?0033

; pwm0(1200);

; SOURCE LINE # 98

MOV R7,#0B0H

MOV R6,#04H

LCALL _pwm0

; pwm1(1000);

; SOURCE LINE # 99

MOV R7,#0E8H

DEC R6

LCALL _pwm1

; delay(30000); delay(30000); delay(30000); delay(30000);delay(30000);

; SOURCE LINE # 100

LCALL L?0033

?C0025:

; while(1)

; SOURCE LINE # 101

; {

; SOURCE LINE # 102

; p21=0;p23=0;p25=0;

; SOURCE LINE # 103

CLR p21

CLR p23

CLR p25

; foot0();//delay(30000);

; SOURCE LINE # 104

LCALL foot0

; foot1();//delay(30000);

; SOURCE LINE # 105

LCALL foot1

; foot2();//delay(30000);

; SOURCE LINE # 106

LCALL foot2

; foot3();//delay(30000);

; SOURCE LINE # 107

LCALL foot3

; }

; SOURCE LINE # 108

SJMP ?C0025

; END OF main

END

;--------------------------------------------------------

;我是用keil uvision2转的。

;你C语言编译时正常,但转成汇编后就编译有问题。

;错误信息如下:

;test5.src(138): error A8: ATTEMPT TO DEFINE AN ALREADY DEFINED LABEL

;我也不知道哪来的错误。

;希望可以帮到你。

C语言怎么写红外程序?实现遥控控制八个led。求程序和详细解释。

下面是一个用C写的遥控器程序.能在数码管上显示键码.

#include reg52.h

#define c(x) (x*110592/120000)

sbit Ir_Pin=P3^3;

unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,

0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阳极数码显示码0-F.

unsigned char code Led_Sel[]={0xe,0xd,0xb,0x7};

unsigned char Led_Buf[4]; //显示缓冲区

char Led_Index; //位选

unsigned char Ir_Buf[4]; //用于保存解码结果

//==============================================================

//数码管扫描

timer0() interrupt 1 using 1

{

TL0=65536-1000;

TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描

P0=0xff;

P2=Led_Sel[Led_Index]; //位选

P0=Led_Tab[Led_Buf[Led_Index]]; //段选

if(++Led_Index3) Led_Index=0; //四个扫描完了,到第一个数码管

}

//==============================================================

unsigned int Ir_Get_Low()

{

TL1=0;

TH1=0;

TR1=1;

while(!Ir_Pin (TH10x80)==0);

TR1=0;

return TH1*256+TL1;

}

//=============================================================

unsigned int Ir_Get_High()

{

TL1=0;

TH1=0;

TR1=1;

while(Ir_Pin (TH10x80)==0);

TR1=0;

return TH1*256+TL1;

}

//==============================================================

main()

{

unsigned int temp;

char i,j;

Led_Index=1;

TMOD=0x11;

TL0=65536-1000;

TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描

EA=1;

ET0=1;

TR0=1;

Led_Buf[0]=0;

Led_Buf[1]=0;

Led_Buf[2]=0;

Led_Buf[3]=0; //显示区设成0

do{

restart:

while(Ir_Pin);

temp=Ir_Get_Low();

if(tempc(8500) || tempc(9500)) continue;//引导脉冲低电平9000

temp=Ir_Get_High();

if(tempc(4000) || tempc(5000)) continue;//引导脉冲高电平4500

for(i=0;i4;i++) //4个字节

for(j=0;j8;j++) //每个字节8位

{

temp=Ir_Get_Low();

if(tempc(200) || tempc(800)) goto restart;

temp=Ir_Get_High();

if(tempc(200) || tempc(2000)) goto restart;

Ir_Buf[i]=1;

if(tempc(1120)) Ir_Buf[i]|=0x80;

}

Led_Buf[0]=Ir_Buf[2]0xf;

Led_Buf[1]=(Ir_Buf[2]/16)0xf;

Led_Buf[2]=Ir_Buf[3]0xf;

Led_Buf[3]=(Ir_Buf[3]/16)0xf; //显示结果

}while(1);

}

基于51单片机红外遥控代码(C语言)

以下文件是51单片机实现遥控解码,通过数码管显示键码的程序,P0口驱动数码管段选,p2.6和p2.7为数码管位选,接收头连到P3.2口。此程序以通过验证,可以直接编译使用,另外还有一个继电器和蜂鸣器的控制,不用可以屏蔽掉。

;********************************************************************************

;* 描述: *

;* 遥控键值读取器 *

;* 数码管显示, P0口为数码管的数据口 *

;* *

;********************************************************************************

;遥控键值解码-数码管显示 *

;********************************************************************************/

#include reg51.h

#include intrins.h

void IR_SHOW();

void delay(unsigned char x);//x*0.14MS

void delay1(unsigned char ms);

void beep();

sbit IRIN = P3^2;

sbit BEEP = P3^7;

sbit RELAY= P1^3;

sbit GEWEI= P2^7;

sbit SHIWEI= P2^6;

unsigned char IRCOM[8];

unsigned char code table[16] =

{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

main()

{

IE = 0x81; //允许总中断中断,使能 INT0 外部中断

TCON = 0x1; //触发方式为脉冲负边沿触发

delay(1);

IRIN=1;

BEEP=1;

RELAY=1;

for(;;)

{

IR_SHOW();

}

} //end main

void IR_IN() interrupt 0 using 0

{

unsigned char i,j,k,N=0;

EA = 0;

I1:

for (i=0;i4;i++)

{

if (IRIN==0) break;

if (i==3) {EA =1;return;}

}

delay(20);

if (IRIN==1) goto I1; //确认IR信号出现

while (!IRIN) //等 IR 变为高电平

{delay(1);}

for (j=0;j4;j++)

{

for (k=0;k8;k++)

{

while (IRIN) //等 IR 变为低电平

{delay(1);}

while (!IRIN) //等 IR 变为高电平

{delay(1);}

while (IRIN) //计算IR高电平时长

{

delay(1);

N++;

if (N=30) {EA=1;return;}

}

IRCOM[j]=IRCOM[j] 1;

if (N=8) {IRCOM[j] = IRCOM[j] | 0x80;}

N=0;

}//end for k

}//end for j

if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}

IRCOM[5]=IRCOM[2] 0x0F;

IRCOM[6]=IRCOM[2] 0xF0;

IRCOM[6]=IRCOM[6] 4;

beep();

EA = 1;

}

void IR_SHOW()

{

P0 = table[IRCOM[5]];

GEWEI = 0;

SHIWEI = 1;

delay1(4);

P0 = table[IRCOM[6]];

SHIWEI = 0;

GEWEI = 1;

delay1(4);

}

void beep()

{

unsigned char i;

for (i=0;i100;i++)

{

delay(5);

BEEP=!BEEP;

}

BEEP=1;

}

void delay(unsigned char x)//x*0.14MS

{

unsigned char i;

while(x--)

{

for (i = 0; i13; i++) {}

}

}

void delay1(unsigned char ms)

{

unsigned char i;

while(ms--)

{

for(i = 0; i120; i++)

{

_nop_();

_nop_();

_nop_();

_nop_();

}

}

}

求红外线计数器c语言程序

#includereg51.h

#includeintrins.h

#define NOP _nop_()

#define KEY_PRESS

#include "WIN24C02.H"

unsigned char code table[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x71};

///////////////////////////////

#define uchar unsigned char

uchar times=0;

uchar dis_buf[4]={0};

uchar key_flag=0;

uchar key_cnt=0;

uchar exint_flag=0;

uchar buzzer_cnt=0;

uchar int_flag=0;

unsigned int int_cnt=0;

///////////////////////////////////

sbit ir_Induction=P1^0;

sbit ming=P3^7;

sbit ir_s=P3^2;

sbit iic_sda=P0^5;

sbit iic_clk=P0^4;

unsigned int ir_num=0;

sfr isp_wdt = 0xE1;

sfr isp_data = 0xE2;

sfr isp_addrh = 0xE3;

sfr isp_addrl = 0xE4;

sfr isp_cmd = 0xE5;

sfr isp_trig = 0xE6;

sfr isp_contr = 0xE7;

/*****************************************/

/***************STC89CXX_EEPROM扇区擦除程序*************************/

void STC89CXX_EEPROM_Erase(unsigned char t_addr)

{

isp_addrh = t_addr; //可以不要 扇区里任意一个字节的地址都是扇区地址,无需求首地址,单片机会自己处理

isp_addrl = 0;

// EA = 0; //关中断

isp_contr = 0x81;

isp_cmd = 3; //扇区擦除,要某字节为空,必须擦除1个扇区

isp_trig = 0x46; //先送0x46再送 0xb9 ISP/IAP 触发寄存器,每次都需要如此

isp_trig = 0xb9; //送完0xb9后 ISP/IAP 立即被触发启动

// EA = 1;

// 开中断

}

/***********************************************/

void STC89CXX_EEPROM_Char_Write(unsigned int Write_addr ,unsigned int Write_data)

{

isp_data = (Write_data8)0xff;

isp_addrh = Write_addr/256; //送地址高位

isp_addrl = Write_addr%256; //地址低位

// EA = 0; /* 关中断 */

isp_contr = 0x81;

isp_cmd = 2; //送扇区命令

isp_trig = 0x46;

isp_trig = 0xb9;

isp_data = Write_data0xff;

isp_addrl = (Write_addr+1)%256;

isp_contr = 0x81;

isp_cmd = 2; //送扇区命令

isp_trig = 0x46;

isp_trig = 0xb9;

// EA = 1;

/* 开中断 */

}

/**************************************************************/

unsigned int STC89CXX_EEPROM_Char_Read(unsigned int Read_addr)

{

unsigned int temp=0;

isp_addrh = Read_addr/256; //送地址高字节

isp_addrl = Read_addr%256; //送地址低字节(从0开始到num-1为止)

// EA = 0; /* 关中断 */

isp_contr = 0x81; /*20M,是0x80 orl 1 */

isp_cmd = 1; // 1表示字节读

isp_trig = 0x46; //先送0x46再送 0xb9 ISP/IAP 触发寄存器,每次都需要如此

isp_trig = 0xb9; //送完0xb9后 ISP/IAP 立即被触发启动

temp= (isp_data8);

isp_addrl = (Read_addr+1)%256;

isp_contr = 0x81; /*20M,是0x80 orl 1 */

isp_cmd = 1; // 1表示字节读

isp_trig = 0x46; //先送0x46再送 0xb9 ISP/IAP 触发寄存器,每次都需要如此

isp_trig = 0xb9;

temp|=isp_data;

// EA = 1; //空指令

/* 开中断 */

return(temp);

}

static void iic_start()

{

iic_sda=1;

iic_clk=1;

NOP;

iic_sda=0;

iic_clk=0;

}

static void iic_stop()

{

iic_clk=0;

iic_sda=0;

iic_clk=1;

NOP;

iic_sda=1;

}

static void iic_write_byte(uchar dat)

{

uchar i;

for(i=0;i8;i++)

{

iic_clk=0;

iic_sda=dat0x80;

NOP;

iic_clk=1;

NOP;

dat=1;

}

iic_clk=0;

}

static uchar recive_ack()

{

uchar i=0;

iic_clk=0;

NOP;

//iic_sda=1;

NOP;

iic_clk=1;

NOP;

NOP;

while(iic_sda);

iic_clk=0;

// if(i==200)

// return 0 ;

//else

return 1;

}

static void send_ack()

{

uchar i=0;

iic_sda=1;

NOP;

iic_clk=0;

NOP;

iic_sda=0;

NOP;

iic_clk=1;

NOP;

iic_clk=0;

iic_sda=1;

}

void iic_write(uchar addr,uchar dat)

{

iic_start();

iic_write_byte(0xa0);

recive_ack();

iic_write_byte(addr);

recive_ack();

iic_write_byte(dat);

recive_ack();

iic_stop();

}

static uchar iic_read_byte()

{

uchar i;

uchar dat=0;

for(i=0;i8;i++)

{

// iic_sda=0;

dat=1;

iic_clk=0;

NOP;

iic_clk=1;

NOP;

dat|=iic_sda;

}

iic_clk=0;

return dat;

}

uchar iic_read(uchar addr)

{

uchar dat;

iic_start();

iic_write_byte(0xa0);

recive_ack();

iic_write_byte(addr);

recive_ack();

iic_start();

iic_write_byte(0xa1);

recive_ack();

dat=iic_read_byte();

iic_stop();

return dat;

}

void delay(unsigned int z)

{

unsigned int x,y;

for(x=z;x0;x--)

{

for(y=100;y0;y--);

}

}

void iic_writes(uchar addr,void *buf,uchar num)

{

uchar i;

uchar *pt=(uchar *)buf;

for(i=0;inum;i++)

{

iic_write(addr+i,pt[i]);

delay(10);

}

}

void iic_reads(uchar addr,void *buf,uchar num)

{

uchar i;

uchar *pt=(uchar *)buf;

for(i=0;inum;i++)

{

pt[i]=iic_read(addr+i);

//delay(3);

}

}

sbit KEY1=P3^6;

unsigned char i_com=0x88;

//unsigned char flag=0;

void timer0_init()

{

TMOD=0x11;

TH0=0xfd;

TL0=0x80;

ET0=1;

TR0=1;

TH1=0xfd;

TL1=0x80;

ET1=1;

TR1=1;

}

void ch_value( )

{

dis_buf[0]=(ir_num/1000)%10;

dis_buf[1]=(ir_num/100)%10;

dis_buf[2]=(ir_num/10)%10;

dis_buf[3]=(ir_num)%10;

}

void timer0_isq()interrupt 1

{

TH0=0xf8;

TL0=0x84;

P2=0xff;

P0= (8(times));

P2=table[dis_buf[times]];

times=++times%4;

}

void display()

{

P2=0xff;

P0= (i_com(0));

P2=table[dis_buf[0]];

delay(3);

P2=0xff;

P0= (i_com(1));

P2=table[dis_buf[1]];

delay(3);

P2=0xff;

P0= (i_com(2));

P2=table[dis_buf[2]];

delay(3);

P2=0xff;

P0= (i_com(3));

P2=table[dis_buf[3]];

delay(3);

}

void int_0() interrupt 0

{

// EA=0;

//display();

exint_flag=1;

int_flag=1;

EX0=0;

ir_num++;

#ifdef KEY_PRESS

// IE0=0;

#endif

// EA=1;

}

void timer1_isq()interrupt 3

{

TH1=0xfa;

TL1=0x84;

if(key_flag(++key_cnt==10))

{

if(KEY1)

{

key_flag=0;

}

key_cnt=0;

}

if(int_flag(++int_cnt==20))

{

#ifdef KEY_PRESS

if(ir_s)

#else

if(!ir_s)

#endif

{

int_flag=0;

}

int_cnt=0;

}

if(exint_flag)

{

ming=0;

}

if(exint_flag(++buzzer_cnt==40))

{

ming=1;

buzzer_cnt=0;

exint_flag=0;

}

}

void main()

{

delay(500);

timer0_init();

WIN24C02_init(); //24c02初始化子程序

EX0=1;

IT0=1;

IE0=0;

EA=1;

PT0=1;

// ir_num=STC89CXX_EEPROM_Char_Read(0x2000);

iic_reads(0x10,ir_num,2);

//ir_num=WIN24C02_read(0x00)|(WIN24C02_read(0x01)8);

ch_value();

while(1)

{

if(ir_s==1)

{

ir_s=0;

}

ch_value();

//display();

if(!EX0)

{

if(ir_num=9999)

ir_num=0;

iic_writes(0x10,ir_num,2);

while(int_flagKEY1);//display();

//STC89CXX_EEPROM_Erase(0x20);

//STC89CXX_EEPROM_Char_Write(0x2000,ir_num);//存数据到EEPROM

// WIN24C02_write(0x00,ir_num0xff);

// WIN24C02_write(0x01,(ir_num8)0xff);

//IE0=0;

ch_value();

#ifdef KEY_PRESS

IE0=0;

#else

IE0=0;

#endif

EX0=1;

}

if(!KEY1)

{

// display();

EX0=0;

ir_num=0;

//STC89CXX_EEPROM_Erase(0x20);

//STC89CXX_EEPROM_Char_Write(0x2000,ir_num);//存数据到EEPROM

iic_writes(0x10,ir_num,2);

// WIN24C02_write(0x00,ir_num0xff);

// WIN24C02_write(0x01,(ir_num8)0xff);

ch_value();

// EA=1;

while(!KEY1);

IE0=0;

EX0=1;

}

}

}

急求《单片机C语言程序设计实训100例——基于8051+Proteus仿真》第三部分综合设计C语言源代码

这本书一共5章节,你说第三部分指的哪里?

第五章才是综合设计部分啊,而且这部分有好多例程,也不知道你要哪部分?

第1章 8051单片机C语言程序设计概述 1

1.1 8051单片机引脚 1

1.2 数据与程序内存 5

1.3 特殊功能寄存器 6

1.4 外部中断、定时器/计数器及串口应用 8

1.5 有符号与无符号数应用、数位分解、位操作 9

1.6 变量、存储类型与存储模式 11

1.7 关于C语言运算符的优先级 13

1.8 字符编码 15

1.9 数组、字符串与指针 16

1.10 流程控制 18

1.11 可重入函数和中断函数 19

1.12 C语言在单片机系统开发中的优势 20

第2章 Proteus操作基础 21

2.1 Proteus操作界面简介 21

2.2 仿真电路原理图设计 22

2.3 元件选择 25

2.4 调试仿真 29

2.5 Proteus与Vision 3的联合调试 29

2.6 Proteus在8051单片机应用系统开发的优势 30

第3章 基础程序设计 32

3.1 闪烁的LED 32

3.2 双向来回的流水灯 34

3.3 花样流水灯 36

3.4 LED模拟交通灯 38

3.5 分立式数码管循环显示0~9 40

3.6 集成式数码管动态扫描显示 41

3.7 按键调节数码管闪烁增减显示 44

3.8 数码管显示4×4键盘矩阵按键 46

3.9 普通开关与拨码开关应用 49

3.10 继电器及双向可控硅控制照明设备 51

3.11 INT0中断计数 53

3.12 INT0及INT1中断计数 55

3.13 TIMER0控制单只LED闪烁 58

3.14 TIMER0控制数码管动态管显示 62

3.15 TIMER0控制8×8LED点阵屏显示数字 65

3.16 TIMER0控制门铃声音输出 68

3.17 定时器控制交通指示灯 70

3.18 TIMER1控制音阶演奏 72

3.19 TIMER0、TIMER1及TIMER2实现外部信号计数与显示 75

3.20 TIMER0、TIMER1及INT0控制报警器与旋转灯 77

3.21 按键控制定时器选播多段音乐 79

3.22 键控看门狗 82

3.23 双机串口双向通信 84

3.24 PC与单片机双向通信 90

3.25 单片机内置EEPROM读/写测试 95

第4章 硬件应用 99

4.1 74HC138译码器与反向缓冲器控制数码管显示 100

4.2 串入并出芯片74HC595控制数码管显示四位数字 103

4.3 用74HC164驱动多只数码管显示 106

4.4 并串转换器74HC165应用 110

4.5 用74HC148扩展中断 112

4.6 串口发送数据到2片8×8点阵屏滚动显示 115

4.7 数码管BCD解码驱动器CD4511与DM7447应用 117

4.8 62256RAM扩展内存 119

4.9 用8255实现接口扩展 121

4.10 可编程接口芯片8155应用 124

4.11 串行共阴显示驱动器控制4+2+2集成式数码管显示 129

4.12 14段与16段数码管演示 133

4.13 16键解码芯片74C922应用 136

4.14 1602字符液晶工作于8位模式直接驱动显示 139

4.15 1602液晶显示DS1302实时时钟 148

4.16 1602液晶屏工作于8位模式由74LS373控制显示 153

4.17 1602液晶屏工作于4位模式实时显示当前时间 155

4.18 1602液晶屏显示DS12887实时时钟 159

4.19 时钟日历芯片PCF8583应用 167

4.20 2×20串行字符液晶屏显示 174

4.21 LGM12864液晶屏显示程序 177

4.22 TG126410液晶屏串行模式显示 184

4.23 Nokia7110液晶屏菜单控制程序 192

4.24 T6963C液晶屏图文演示 199

4.25 ADC0832 A/D转换与LCD显示 211

4.26 用DAC0832生成锯齿波 215

4.27 ADC0808 PWM实验 217

4.28 ADC0809 A/D转换与显示 220

4.29 用DAC0808实现数字调压 221

4.30 16位A/D转换芯片LTC1864应用 223

4.31 I2C接口存储器AT24C04读/写与显示 225

4.32 I2C存储器设计的中文硬件字库应用 233

4.33 I2C接口4通道A/D与单通道D/A转换器PCF8591应用 237

4.34 I2C接口DS1621温度传感器测试 241

4.35 用兼容I2C接口的MAX6953驱动4片5×7点阵显示器 246

4.36 用I2C接口控制MAX6955驱动16段数码管显示 250

4.37 I2C接口数字电位器AD5242应用 254

4.38 SPI接口存储器AT25F1024读/写与显示 257

4.39 SPI接口温度传感器TC72应用测试 264

4.40 温度传感器LM35全量程应用测试 268

4.41 SHT75温湿度传感器测试 272

4.42 直流电机正、反转及PWM调速控制 278

4.43 正反转可控的步进电机 281

4.44 ULN2803驱动点阵屏仿电梯数字滚动显示 284

4.45 液晶显示MPX4250压力值 286

4.46 12864LCD显示24C08保存的开机画面 289

4.47 用M145026与M145027设计的无线收发系统 293

4.48 DS18B20温度传感器测试 296

4.49 1-Wire式可寻址开关DS2405应用测试 303

4.50 MMC存储卡测试 307

第5章 综合设计 316

5.1 带日历时钟及温度显示的电子万年历 316

5.2 用8051+1601LCD设计的整型计算器 321

5.3 电子秤仿真设计 328

5.4 1602液晶屏显示仿手机键盘按键字符 332

5.5 用24C04与1602液晶屏设计的简易加密电子锁 336

5.6 1-Wire总线器件ROM搜索与多点温度监测 341

5.7 高仿真数码管电子钟设计 356

5.8 用DS1302与12864LCD设计的可调式中文电子日历 360

5.9 用T6963C液晶屏设计的指针式电子钟 366

5.10 T6963C液晶屏中文显示温度与时间 370

5.11 T6963C液晶屏曲线显示ADC0832两路A/D转换结果 372

5.12 温度控制直流电机转速 374

5.13 用74LS595与74LS154设计的16×16点阵屏 377

5.14 用8255与74LS154设计的16×16点阵屏 379

5.15 红外遥控收发仿真 381

5.16 GP2D12红外测距传感器应用 388

5.17 三端可调正稳压器LM317应用测试 395

5.18 数码管显示的K型热电偶温度计 399

5.19 交流电压检测与数字显示仿真 403

5.20 用MCP3421与RTD-PT100设计的铂电阻温度计 407

5.21 可接收串口信息的带中英文硬字库的80×16 LED点阵屏 414

5.22 模拟射击训练游戏 422

5.23 GPS仿真 427

5.24 温室监控系统仿真 431

5.25 基于Modbus总线的数据采集与开关控制系统设计仿真 437

建议你到脚本之家网站去搜索一下看看有没有这本书的电子档。

C51红外测距的C语言程序

给楼主建议: 去 我的领地 5d6d 的 proteus 论坛看看那里有很多 仿真实例,包括仿真图 和 源码


分享标题:c语言红外测距传感器函数 红外线测距传感器原理图
URL地址:http://pwwzsj.com/article/hiiojg.html