- 註冊時間
- 2014-12-14
- 最後登錄
- 2023-3-17
- 主題
- 查看
- 積分
- 20
- 閱讀權限
- 20
- 文章
- 14
- 相冊
- 0
- 日誌
- 0
狀態︰
離線
|
關於以下程式我想了解的是計時中斷副程式的TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
以及主程式的 IE=0x8A;
TMOD=0x11;
if (sw1==0){
while(sw1!=0);
cnt=(cnt+1)%2;
是什麼意思呢 ?
中斷副程式的-1000 據我所知為我所使用的震盪器是12MHz 所以掃描的速度為1u*1000 所以是1mS
但是不了解他的原理
而主程式的IE.TMOD則是完全沒有概念
在SW1的部分 我的開關是使用紅外線功能為 當感測到第一次 會開始計時 感測到第二次則會停止
但是不了為何程式的部分要這樣寫希望能解答
另外我的CNT=狀態 如高態低態這樣的想法是正確的嗎
以上希望能求解
# include<reg51.h>
sbit sw1=P1^7;
unsigned char seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x27,0x7f,0x67}; //0~9的字型碼
unsigned char com[]={0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x08};
unsigned char cnt=0,hour,min,sec,ms,index,disp[8];
/* 顯示副程式 */
void display(void)
{ disp[0]=seg[hour/10]; // 放小時的拾位數
disp[1]=seg[hour%10]; // 放小時的個位數
disp[2]=seg[min/10];
disp[3]=seg[min%10];
disp[4]=seg[sec/10];
disp[5]=seg[sec%10];
disp[6]=seg[ms/10];
disp[7]=seg[ms%10];
}
/****** T0 計時中斷的副程式 ******/
void timer0 (void) interrupt 1
{ TH0=(65536-1000)/256; // TH0存放商數
TL0=(65536-1000)%256; // TL0存放餘數
P2=0xff; // 顯示器不亮
P0=~disp[index]; // 顯示的字型碼由P1輸出
P2=~com[index]; //顯示器的掃描碼由P0輸出
index++;if(index>=8) index=0; //輪流掃描顯示器
}
/***** T1 計時中斷的副程式 *****/
void timer1 (void) interrupt 3
{ TH1=(65536-10000)/256; // TH1存放商數
TL1=(65536-10000)%256; // TL1存放餘數
if(cnt==1){
ms++;}
if(ms > 99){
ms=0;
sec++;}
if(sec > 59){
sec=0;
min++;}
if(min > 59){
min=0;
hour++;}
if((hour==23)&&(min==59)&&(sec==59)&&(ms==99)){
TR1=0;}
display(); //呼叫顯示副程式
}
/***** 主程式 *****/
void main( ){
IE=0x8A;
TMOD=0x11;
TR0=TR1=1; //啟動Timer 0 ,Timer 1
while(1){
if (sw1==0){
while(sw1!=0);
cnt=(cnt+1)%2;
}}} |
|