c语言p21
1. 51单片机简单的c语言问题
#include <reg51.h>
sbit P10 = P1^0; //定义I/O口
sbit P11 = P1^1;
sbit P20 = P2^0;
sbit P21 = P2^1;
void InitT0(); //定时器0初始化函数
bit Flag_TimeOut; //定时时间到标志位
unsigned char T0INT_Count; //定时器0中断计数
void main()
{
InitT0();
Flag_TimeOut = 0;
P10 = 1; //检测输入要先输出高电平
while(P10); //检测P10口信号,若为高则一直检测,为低往下执行
TR0 = 1; //开启定时器开始计时
while(!Flag_TimeOut) //653ms没到 Flag_TimeOut为0 执行while循环
{ //这就是时间没到的检测,一直检测直到时间到
P11 = 1; //检测P11口状态
if(!P11) //为低输出状态
{
P20 = 1;
P21 = 0;
TR0 = 0; //关闭定时器
break; //这个就是检测到后跳出循环检测,也就是不再检测了
}
else //P11口为高
{
P20 = 0;
P21 = 1;
}
}
while(1); //停止
}
void InitT0()
{
T0INT_Count = 0; //定时器中断计数
TMOD = 0x01; //设置定时器0工作在定时器方式,工作方式1
TH0 = 0x00;
TL0 = 0xec; //写定时器初值 0x00ec 定时器T0中断一次时间为65.3ms (f=12MHz)
ET0 = 1; //开T0中断
EA= 1; //开总中断
}
void T0INT() interrupt 1 //定时器0中断函数
{
TH0 = 0x00;
TL0 = 0xec;
if(++T0INT_Count == 10) //当中断计数=10计时达到653ms 置Flag_TimeOut为1
{
Flag_TimeOut = 1;
}
}
我晕,不会看程序么?
我一个while循环里面一直在抓P11的信号
注意while和break
2. 51单片机求这个时钟的c语言程序
以下是四位数码管可调时带秒闪烁的c51单片机电子钟程序(c语言)。
/**** 本程序中,晶振为12MHz, ****/
/**** 时间控制采用定时中断控制方式。 ****/
/**** 模式和时间调整采用查询方式。 ****/
#include<reg52.h>
sbit P20=P2^0; //分个位控制端
sbit P21=P2^1; //分十位控制端
sbit P22=P2^2; //时个位控制端
sbit P23=P2^3; //时十位控制端
sbit led=P2^7; //second display led
sbit key0=P3^0; //模式设置
sbit key1=P3^1; //加
sbit key2=P3^2; //减
unsigned char hour,min,sec,T50ms;
unsigned char modstate; //模式状态
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//段码
void init(); //初始化子程序声明
void delay500us(unsigned char X); //延时子程序声明
void display(); //显示子程序声明
void display001(); //显示子程序声明
void display002(); //显示子程序声明
void keyscan(); //按键识别子程序声明
void main()
{
init();
while(1)
{
keyscan();
}
}
void init() //初始化子程序
{
TMOD=0x01;
TH0=(65536-49990)/256;
TL0=(65536-49990)%256;
ET0=1;
EA=1;
TR0=1;
}
void delay500us(unsigned char X)
{
unsigned char i,j;
for(i=X;i>0;i--)
for(j=248;j>0;j--);
}
void timer0() interrupt 1 //timer0中断服务子程序,定时时间为50ms,本程序加了10us的时间修正量
{
TMOD=0x01;
TH0=(65536-49990)/256;
TL0=(65536-49990)%256;
T50ms++;
if(T50ms>=20)
{
T50ms=0;
sec++;
if(sec>=60)
{
sec=0;
min++;
if(min>=60)
{
min=0;
hour++;
if(hour>=24)hour=0;
}
}
}
}
void display()
{
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[hour/10];
P23=0;
delay500us(5);
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[hour%10];
P22=0;
delay500us(5);
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[min/10];
P21=0;
delay500us(5);
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[min%10];
P20=0;
delay500us(5);
if(T50ms<=10)led=0;
if(T50ms>10)led=1;
}
void display001()
{
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[hour/10];
P23=0;
delay500us(10);
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[hour%10];
P22=0;
delay500us(10);
}
void display002()
{
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[min/10];
P21=0;
delay500us(10);
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[min%10];
P20=0;
delay500us(10);
}
void keyscan() //按键识别钟程序
{
while(modstate==0)
{
display();
if(key0==0)
{
display();
if(key0==0)modstate++; //这两句加在一起为延时10ms软件防抖设计。
while(key0==0)display001(); //等待按键释放。
}
}
//****************************************************************************//
while(modstate==1)
{
display001();
if(key0==0)
{
display001();
if(key0==0)modstate++; //这两句加在一起为延时10ms软件防抖设计。
while(key0==0)display002(); //等待按键释放。
}
if(key1==0)
{
display001();
if(key1==0)
{
hour++;
if(hour>=24)hour=0;
while(key1==0)display001();
}
}
if(key2==0)
{
display001();
if(key2==0)
{
hour--;
if(hour>=24)hour=0;
while(key2==0)display001();
}
}
}
//****************************************************************************//
while(modstate==2)
{
display002();
if(key0==0)
{
display002();
if(key0==0)modstate=0; //这两句加在一起为延时10ms软件防抖设计。
while(key0==0)display(); //等待按键释放。
}
if(key1==0)
{
display002();
if(key1==0)
{
min++;
if(min>=60)min=0;
while(key1==0)display002();
}
}
if(key2==0)
{
display002();
if(key2==0)
{
min--;
if(min>=60)min=0;
while(key2==0)display002();
}
}
}
}
3. 单片机C语言
保证连续运行,不停地产生中断
4. 解释c语言编写的交通灯程序
你这个程序和你发上来的图,是不符的。
无论是看图,还是看程序,都不能确定LED怎么接。
这是从哪抄来的程序吗,是想仿真呢,还是想做实物呢,还是完成作业呢。
交通灯的题目,在网络里,可以找到无数个,还不如搜索一个呢。
这么个不完整的图不完整的程序,图和程序也不相符的东西就不要再纠结了。
5. 还请c语言大神帮忙看一下,程序能用,但是想改善不知怎么改。
Delay(3000);
if(p12==0)
goto loop;
else
P3=0x01;
改为:(姑且称为时间分割法,每30ms检测一次)
int count=0;
do{
if(p12==0)
goto loop;
count++;
if(count<=100){
Delay(30);
}
else{
break;
}
}while(true)
P3=0x01;
好久了,单片机知识忘完了,你看可不可以用用中断、定时器啥的!
6. C语言转汇编语言(把下面的C语言转成单片机汇编语言)
; .\test5.SRC generated from: test5.c
; 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}; //p21&p23 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;i<24;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;j<14;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;i>1;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;j>1;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
;我也不知道哪来的错误。
;希望可以帮到你。
7. 求解读C语言
涉及嵌入式编程51单片机的东西?我这没有这头文件,没法编译通过,如果你可以编译通过,建议调试一下,多下几个断点,看看输入某个数据之后每步的相应变化情况,这个应该是数模转换,难道是显示器要显示各位数?
8. 求单片机 数字钟 c语言代码注释
#include<reg51.h>
unsigned char code su[11]={0x3f,0x06,0x5b,0X4F,0x66,0X6D,0x7d,0x07,0x7f,0x6f,0x40};//数码管显示
unsigned char xian[8]={0,0,10,0,0,10,0,0};
unsigned char sen=0,min=0,hou=0,sen2=0,min2=0,hou2=0,sen3=59,min3=59,hou3=23,num;//变量定义
//--------引脚定义
sbit ks=P1^4; //秒按键
sbit km=P1^5; //分按键
sbit kh=P1^6; //时按键
sbit ds=P1^7;
sbit bb=P3^4;
//-------8个数码管位显示接口
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
bit jp1,jp2,jp3;//位定义
int n=0,jp4;
//----演示程序
void daly()
{
unsigned char j;
for(j=60;j;j--);//for循环
}
//------数码管显示
void show()
{
xian[0]=hou/10; //时的十位
xian[1]=hou%10; //时的个位
xian[3]=min/10; //分的十位
xian[4]=min%10; //分的个位
xian[6]=sen/10; //秒的十位
xian[7]=sen%10; //秒的个位
P0=su[xian[7]]; //八段数码管显示秒的个位
P20=0; //动态显示,打开第一个数码管
daly(); //延时
P20=1; //动态显示,关闭第一个数码管
P0=su[xian[6]];//八段数码管显示秒的十位
P21=0;//动态显示,打开第二个数码管
daly();//延时
P21=1;//动态显示,打开第二个数码管
//--------------------
P0=su[xian[5]];//注:你xian[3]xian[5]都为从定义
P22=0;
daly();
P22=1;
//-------------分个位的显示
P0=su[xian[4]];
P23=0;
daly();
P23=1;
//-----------
P0=su[xian[3]];//注:你xian[3]xian[5]都为从定义
P24=0;
daly();
P24=1;
//------------分十位的显示
P0=su[xian[2]];
P25=0;
daly();
P25=1;
//-------------时个位的显示
P0=su[xian[1]];
P26=0;
daly();
P26=1;
//-----------时十位的显示
P0=su[xian[0]];
P27=0;
daly();
P27=1;
}
//---------按键程序
void key()
{
if((ks==0)&&(jp1==0))
{
jp1=1;//秒按键生效
daly();//消抖
if(ks==0) sen++; //秒加1
}
else if((ks==1)&&(jp1==1)) jp1=0;//秒按键未生效
if(sen==60)//等于60时
{
min++;//分加1
sen=0;//秒清零
}
if((km==0)&&(jp2==0))
{
jp2=1;//分按键生效
daly();//消抖
if(km==0) min++;//分加1
}
else if((km==1)&&(jp2==1)) jp2=0;//分按键未生效
if(min==60)//等于60时
{
hou++;//时加1
min=0;//分清零
}
if((kh==0)&&(jp3==0))
{
jp3=1;//时按键生效
daly(); //消抖
if(kh==0) hou++;//时加1
}
else if((kh==1)&&(jp3==1)) jp3=0;//时按键未生效
if(hou==24) hou=0;//时为24时,清零
if(ds==0)//定时操作
{
daly();//消抖
while(ds==0);
daly();
if(ds==1) jp4++;//定时按键生效,加一
if(jp4>1) jp4=0;//JP4只能是一。
/*注:就本人感觉而言这两句就是废话,一句就能完事:if(ds==1) jp4=1;*/
}
}
//-------从功能上看这是定时
dings()
{
EA=0; //关闭中断
TR0=0;//T0停止计数
hou2=hou;//把现有的时分秒,保留储存在hou2,min2,sen2
min2=min;
sen2=sen;
hou=0; //清零
min=0;
sen=0;
while(jp4==1) //等待直到按键生效
{
hou3=hou; //把现有的时分秒,保留储存在hou3,min3,sen3
min3=min;
sen3=sen;
show(); //现实
key();//按键扫描
hou3=hou;//把按键后更改的时分秒,也就是定时时间,保留储存在hou3,min3,sen3
min3=min;
sen3=sen;
}
hou=hou2;//把远有的时间分别还原
min=min2;
sen=sen2;
EA=1;//开中断
TR0=1;//T0计数
}
void main()
{
TMOD=0x01;//定时器0方式1
TH0=45535>>8;//赋初值
TL0=45535;
EA=1; //允许中断
ET0=1;//T0中断使能
EX1=1;//外部中断1
TR0=1;//T0开始计数
hou3=99;
min3=99;
sen3=99;
while(1)
{
show();//显示
key();//按键程序
dings();//定时操作
if(((hou*60+min))*60+sen>=((hou3*60+min3))*60+sen3 )//判断是否到了定时时间
{
bb=0;//蜂鸣器鸣叫(也可能是其他音乐芯片)
num++;
if(num>=500) //鸣叫延时
{
bb=1; //蜂鸣器关闭
num=0; //延时计数清零
jp4=0;//位清零
hou3=99;//重新赋值
min3=99;
sen3=99;
}
}
}
}
void_time0_(void)interrupt 1
{
TL0=45535; //定时器0重新赋值
TH0=45535>>8;
if(++n==50) //1秒
{
n=0;
sen++; //秒加1
if(sen==60) //加到60
{
min++;
sen=0;
}//分加1
if(min==60)//加到60
{
hou++;
min=0;
}//时加1
if(hou==24) hou=0;//24时,时变成0
}
}
说实话,这个程序编写的很烂。
9. c51单片机C语言编程 一个口保持输出高(1) 一个口保持输出低(0)怎么做 求完整程序加注释
#include<reg51.h>
sbit P20=P2^0;
sbit P21=P2^1; //定义位变量,将P2^0、P2^1口的值赋给变量P21、P20
void main()
{
while(1)
{
P20=0;
P21=1;
}
}
10. linux下用c语言创建进程树
有问题Q我吧,QQ: 402892954
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int p,p11,p12,p13,p21,p22;
while ((p=fork())==-1);
if (!p) {
printf("Parent with pid %d, parent pid %d.\n",getpid(),getppid());
while ((p11=fork())==-1);
if (!p11) {
printf("child11 with pid %d, parent pid %d.\n",getpid(),getppid());
while ((p21=fork())==-1);
if (!p21) {
printf("child21 with pid %d, parent pid %d.\n",getpid(),getppid());
exit(0);
}
else
wait(0);
while ((p22=fork())==-1);
if (!p22) {
printf("child22 with pid %d, parent pid %d.\n",getpid(),getppid());
exit(0);
}
else
wait(0);
exit(0);
}
else
wait(0);
while ((p12=fork())==-1);
if (!p12) {
printf("child12 with pid %d, parent pid %d.\n",getpid(),getppid());
exit(0);
}
else
wait(0);
while ((p13=fork())==-1);
if (!p13) {
printf("child13 with pid %d, parent pid %d.\n",getpid(),getppid());
exit(0);
}
else
wait(0);
exit(0);
}
else
wait(0);
return 0;
}