/利用定时/计数器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;
}
}
前两条是我粗心了,谢谢指出来!
第三条是,我是想让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 还得 仔细 寻找原因,不管 哪个 端口,功能都一样。
本回答被提问者采纳我使用的是定时计数器T1,没有用T0啊!能找到什么错误吗