我用的是定時器1做串口0,然后想用定時器0定時中斷消抖。定時2MS。我看了規格書,也參考了一些網上的程序,然后自己寫了下面的程序,但是定時不正確。來個人幫忙解答一下,感激不禁。
我是這么想的,系統時鐘設置為內部16MHz, 所以周期是不是等于1/16us? 0000H—FFFFH=65536 溢出一次*1/16us約等于4.096ms,對?
設置TH0=80H, TL0=00H. 是65536的一半32768. 所以溢出一次為2ms。
程序可以運行,但是定時不正確,是有什么問題?
單片機源程序如下:
#include "n76e003.h"
#include "stdio.h"
#define uint32 unsigned int
#define uchar unsigned char
uchar timer=0;
uchar key;
uchar key_backup=0;
sbit s1 = P0^0;
sbit s2 = P1^0;
sbit s3 = P1^1;
sbit s4 = P1^2;
sbit s5 = P1^3;
sbit s6 = P1^4;
void UART0_Init(uint32 Baud)
{
P0M1=0x85; P0M2=0x7A;
P1M1=0x1F; P1M2=0xE0;
CKSWT=0x20; //開啟內部高速 16MHz
CKEN|=0x20; //高速內部振蕩器使能
CKDIV=0x00;
SCON = 0x52; //模式1 REN=1 TI=1
TMOD|= 0x20; //定時器1模式2
PCON|= 0x80; //使能雙bei波特率
CKCON|= 0x10; //定時器1為系統時鐘 T1M=1
T3CON&= 0xDF; //選擇定時器1
TH1=256-(1000000/Baud+1);
TR1=1; //定時器1啟動
}
void Send_Data(unsigned char c)
{
TI=0;
SBUF=c;
while(TI==0);
}
uchar key_scan(void)
{
uchar keycode=0;
P0M1=0x85; P0M2=0x7A;
P1M1=0x1F; P1M2=0xE0;
if(s1==0){ keycode=1; return keycode; }
else if(s2==0){ keycode=2; return keycode; }
else if(s3==0){ keycode=3; return keycode; }
else if(s4==0){ keycode=4; return keycode; }
else if(s5==0){ keycode=5; return keycode; }
else if(s6==0){ keycode=6; return keycode; }
else { keycode=0; return keycode; }
}
int main()
{
UART0_Init(9600);
CKSWT=0x20; //開啟內部高速 16MHz
CKEN|=0x20; //高速內部振蕩器使能
CKDIV=0x00; //FSYS = FOSC
TMOD|= 0x01; TMOD&= 0xF1; //設置 T0 為模式 1
CKCON|=0x08; //定時器0為系統時鐘 T0M=1 16MHz = 1/16us
TH0 = 128; //為 T0 賦初值 定時 2ms 32768*1/16us=2ms
TL0 = 128;
EA=1; //總中斷開啟
ES=1; //串口0中斷開啟
ET1=0; //T1中斷關閉
ET0=1; //T0中斷開啟
TR0=1; //啟動T0
while(1)
{
key=key_scan();
if(++timer>10)
{
timer=0; //有按鍵按下
if(key!=key_backup)
{
key_backup=key;
}
else
{
if(key_backup==1)
{
Send_Data(0x01);
}
else if(key_backup==2)
{
Send_Data(0x02);
}
else if(key_backup==3)
{
Send_Data(0x03);
}
else if(key_backup==4)
{
Send_Data(0x04);
}
else if(key_backup==5)
{
Send_Data(0x05);
}
else if(key_backup==6)
{
Send_Data(0x06);
}
key_backup=0;
}
}
}
//2ms
void Timer0_ISR(void) interrupt 1 //中斷服務
{
TH0 = 0x80;
TL0 = 0x00;
timer++;
}
|