#include <REG51.H>
#define uint unsigned int
#define uchar unsigned char
uint sec;
uint min=0;
uint hour=0;
uint tcnt;
sbit k0=P3^2;
sbit k1=P3^3;
sbit k2=P3^4;
sbit k3=P3^5;
sbit k4=P3^6;
sbit k5=P3^0;
sbit k6=P3^1;
unsigned char table[]=
{0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x40,0x00};
//void display(unsigned char a,unsigned char b,unsigned char c);
void display(void);
void delay(unsigned int z)
{
unsigned int x;
unsigned char y;
for(x=z;x>0;x--)
for(y=200;y>0;y--);
}
void display()
{
P1=0xfe;P2=0x00;
P2=table[sec%10];
delay(3);
P1=0xfd;P2=0x00;
P2=table[sec/10]; //秒數的個位
delay(3);
P1=0xfb;P2=0x00;
P2=table[10];
delay(3);
P1=0xf7;P2=0x00;
P2=table[min%10];
delay(3);
P1=0xef;P2=0x00;
P2=table[min/10];
delay(3);
P1=0xdf;P2=0x00;
P2=table[10];
delay(3);
P1=0xbf;P2=0x00;
P2=table[hour%10];
delay(3);
P1=0x7f;P2=0x00;
P2=table[hour/10];
delay(3);
}
main()
{
TCON=0x01;
TMOD=0x02;
TH0=0x06;
TL0=0x06;
TR0=1;
ET0=1;
EA=1;
EX0=1;
PX0=1;
while(1)
{
display();
}
}
void service_int0() interrupt 0
{
if(k5==0)
{ sec++;
if(sec==60)
sec=0;
}
if(k6==0)
{sec--;
if(sec==0)
sec=59;
}
if(k3==0)
{ min++;
if(min==60)
min=0;
}
if(k4==0)
{ min--;
if(min==0)
min=59;
}
if(k1==0)
{ hour++;
if(hour==24)
hour=0;
}
if(k2==0)
{ hour--;
if(hour==0)
hour=23;
}
}
void t0(void)interrupt 1 using 0
{
tcnt++;
if(tcnt==4000)
{
tcnt=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
2. 單片機程序,程序沒問題,編譯不出來怎麼回事
單片機的內存地址0003H是中斷子程序入口,你從000H開始編輯程序,然後接了個SJMP跳轉到START,但是你的START程序沒有另起地址,假設SJMP是兩個位元組指令的話,那麼你的START程序段的地址就是0003H,把中斷子程序入口堵住了,所以你的程序就產生了警告。
3. 單片機c語言keil編譯程序老是提示 KEYS.H(11): error C129: missing ';' before 'key'
你這個程序也是做成了頭文件了吧,在主程序中用#include定義包含這個頭文件的位置是在typedef unsigned char uint8; 前面了吧,這樣typedef的定義就無效了,交換一下順序。
4. 我編了一段51單片機程序,在keil中運行,然後一直處於編譯狀態,等了半天也沒有編譯好,請問是什麼原因
那就是程序沒有編好
5. 單片機編譯C語言程序,出現問題了!
你應該是新手吧,沒有位定義就用了啊!
應該是這樣的:
sbit
LEDK
=P1^7;
timer0()
interrupt
1
using
1
{
LEDK=!LEDK;
TH0=-50000/256;
TL0=-50000%256;
}
6. 有關單片機的錯誤,不管我編譯什麼程序都是這樣
基本是工程建錯了。先建工程,選型號,我一般選ATMEL-》AT89S51,新建文件,保存為*.asm,在窗口最左側的soure group點右鍵,選擇ADD files to group,找到剛建的*.asm文件,點擊add,再點close,寫程序,build。
7. 51單片機程序編譯完後為什麼還是顯示錯誤,工程什麼的都已經建立好了。
工程什麼的都已經建立好了,只一個起步,不代表什麼的。
51單片機程序編譯完後為什麼還是顯示錯誤,這不可能,只要有錯誤,編譯就不會完成的。
你程序有錯誤,不等於編譯一遍就對了,不找錯誤,就是編譯一百遍也沒有用。
8. 單片機程序WAVE6000編譯的一段程序,一直提示重復定義,怎麼改
#define Ra-La 11.9改成#define Ra_La 11.9 回為在C語言中只能用下線
int i;在你的程序中沒用用該變數,不用定義,多定義了在編譯時就會出現警告
9. 單片機程序不知道哪裡錯了,總是編譯不出來,高手指教
ACALL DIS11
ACALL CLEARRAM
ACALL DISPLAYS
ACALL DISPLAYV
MOV GEWEI,#0AH ; 開機顯示
MOV SHIWEI,#0AH
MOV BAIWEI,#0AH
MOV QIANWEI,#0AH
INC SJIAN1
你的第一類錯誤,很多變數在使用前都沒有預先定義
ACALL DELAY2
第二類錯誤是,程序中用到的很多跳轉標號和調用的子程序都沒有定義
JB P3.2 JB是判斷語句,後要有跳轉的偏移地址
第三類錯誤就是,有些匯編指令的書寫格式不對
10. 單片機程序編譯有一個錯誤,請幫忙解決
你給出的程序問題很大,像樓上說的,ORG偽指令
ORG 0000H
JMP MAIN
ORG 0003H
JMP EX0_INTERRUPT
;ORG 000BH
;......
在程序的開始,就要寫主程序的入口地址,以及中斷程序的入口地址。
MAIN:程序結尾的END不能忘掉,
MOV R0 #0A0H
MOV R2 #08H
這是你程序錯誤的原因。像含有多個操作數的指令,中間都會有分號存在。
MOV R0,#0A0H
MOV R2,#08H
注意,分號是英文的,不是中文的。
還有一點啊,你不是寫C語言的,不是每句話結束都要用分號的,在匯編中分號只是注釋符號。。。
ORG 0000H
JMP MAIN
ORG 0013H
JMP EX1_INTERRUPT ;有中斷來了,就跳
MAIN:
MOV R0,#0A0H
MOV R2,#008H
SETB IT1
SETB EA
SETB EX1
MOV DPTR,#7FF8H
MOVX @DPTR,A
HERE:SJMP HERE ;此處應是等待中斷,中斷完成還是跳回此處。
;下面是中斷程序
EX0_INTERRUPT: ;我是從0013H地址跳過來的
MOVX A,@DPTR
MOV @R0,A
MOV P1,@R0
INC DPTR
INC R0
DJNZ R2,DONE
RETI ;中斷子程序結束
DONE:MOVX @DPTR,A
RETI ;中斷子程序結束
RET ;這個程序結束的END不能丟
恩,就這樣了,祝樓主學習順利。
樓上的iie2010:
SETB IT1
SETB EA
SETB EX1
這三句話只說明中斷時外部中斷1,下降沿觸發。
呵呵。。