关于51单片机定时器问题

/利用定时/计数器T1产生定时时钟,由P1口控制8个发光二极管,一秒钟内,使8个指示灯依次一个一个闪动,(8个灯依次亮一遍为一个周期,即1秒钟),此时,P2口接静态数码管,1秒计一个数,计到F从0 再开始。下面是我写的程序,达不到要求,数码管计数特别快,LED8一直是亮的,不知道什么原因。(PS:我说清楚没?)希望大神指出错误,应该如何改正 谢谢了!
#include<reg51.h>
#include <intrins.h>

#define uchar unsigned char

uchar temp;a ; b;
b=0;
uchar code table[ ]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void main()
{
TMOD=0x01;
TH1=(65535-50000)/256;
TL1=(65535-50000)/256;
EA=1;ET1=1;TR1=1;
temp=0x01;//二极管高电平点亮
P1=temp;
while(1)
{
}
}

void timer1() interrupt 3
{
TH1=(65535-50000)/256;
TL1=(65535-50000)/256;
a++;
if (a==20)
{
a=0;
temp=_crol_(temp,1);
P1=temp;
P0=~table[b];//数码管是共阳极的
b++;
if (b>15)
b=0;
}
}

第1个回答  2014-09-05
第一 ,变量 定义 uchar temp;a;b; 中间的 2个 冒号 应该是 逗号(uchar tmep,a,b;),使用 分号的俺还真没 试过;
第二,定时器的 2处 初始化值 均错误,TL1=(65536-50000)%256,是 % 运算,不是 / 运行,TH1 是正确的。
第三,按12MHz 晶振计算,定时器为 50ms 中断,程序 的内容 是 1s 数码管 更新一个数0-F,1s 流动 一个 LED灯,一个周期 是 8s 而不是 1s。想要 周期为 1s 的话,定时器的时间应该 是 125ms,一次性 都 定时不到,就只能是 定时 25ms,分5次,为一 颗灯 的时间,40次 为一个数码管 数值 的时间。追问

前两条是我粗心了,谢谢指出来!
第三条是,我是想让8个灯亮一遍为1秒,可能我上面表达的不清楚,谢谢啦!
我刚刚改了,可是还是达不到我要的效果,发光管闪的更快,数码管也变快了,哪里出问题了呢

追答

LZ 修改了,是不是 该把修改 部分的 程序 贴出来啊??

追问

追答

首先 定时器 初值的计算 是 使用 65536-25000 计算,不是 65535。当然,这只是 相差 1us 而已,不影响 整体大局。如果LZ 说的 实际时间 不是 1s,而是 更短更快,那么 ,问题 就 出在 时钟上:
①晶振不是12MHz 的;
②如果晶振是 12MHz ,那么 就是单片机 支持 1T工作模式,时钟周期 缩短了 12倍。用秒表掐算,1s 钟的时候,数码管 应该显示了 12个数。这个可以通过 软件将定时器 分频 设置 成 12T模式 以解决,也可以直接将 计算值 放大12倍(如 5次 ×12=60次) 进行 计算。

追问

我换了一下IO口,把P2 口换成了P0口或者P1口就可以了,P2口不能做通用的IO口吗?谢谢啦

追答

没有一组 端口 是不能 当通用 IO 的,使用 P2口是 程序异常,LZ 还得 仔细 寻找原因,不管 哪个 端口,功能都一样。

本回答被提问者采纳
第2个回答  2014-09-05
只要TRX为1计数不会停止?

不会停。

执行中断服务程序后,各定时器是否继续计数?
不受影响。

在执行T0中断服务程序时,T1定时器溢出,由于优先级,不能执行T1中断服务程序,此时T1定时器各位如何变化?
继续。

定时器溢出后是否自动清零?
清。
希望能解决您的问题。追问

我使用的是定时计数器T1,没有用T0啊!能找到什么错误吗

相似回答