我用的是定时器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++;
}
|