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;
}