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语言红外测距传感器函数 红外线测距传感器原理图
文章起源:http://cdiso.cn/article/hiiojg.html