标题:
这个单片机定时器控制数码管动态扫描代码有什么问题吗?
[打印本页]
作者:
机械嗷嗷嗷
时间:
2021-7-25 12:20
标题:
这个单片机定时器控制数码管动态扫描代码有什么问题吗?
#include "reg52.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit Wei1=P2^2;//这里的引脚是控制74ch138的
sbit Wei2=P2^3;
sbit Wei3=P2^4;
u8 code Duan[10]={0x3f, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};//控制数码管的段选
u8 cut=0;
u8 sec1=0;
u8 sec2=0;
u8 min=0;
void main()
{
u8 i=0;
TMOD=0x01;
TH0=0xB8;
TL0=0x00;
TR0=1;
while(1)
{
if(TF0==1)
{
TF0=0
TH0=0xB8;
TL0=0x00;
cut++;
if(cut>=50)
{
cut=0;//
我在这里设置了一个断点,运行到这显示了t1=0.46149300sec,可根据设想应该是经过1秒后才会运行到这里啊
sec1++;
if(sec1>=9)
{
sec1=0;
sec2++;
if(sec2>=6)
{
sec2=0;
min++;//暂时忽略min涨到10及以上的情况
}
}
}
} //定时器的代码
switch(i)
{
case(0): Wei1=0 ;Wei2=0 ;Wei3=0;P0=Duan[0];i++;break;
case(1): Wei1=1 ;Wei2=0 ;Wei3=0;P0=Duan[0];i++;break;
case(2): Wei1=0 ;Wei2=1 ;Wei3=0;P0=Duan[0];i++;break;
case(3): Wei1=1 ;Wei2=1 ;Wei3=0;P0=Duan[0];i++;break;
case(4): Wei1=0 ;Wei2=0 ;Wei3=1;P0=Duan[0];i++;break;
case(5): Wei1=1 ;Wei2=0 ;Wei3=1;P0=Duan[min];i++;break;
case(6): Wei1=0 ;Wei2=1 ;Wei3=1;P0=Duan[sec2];i++;break;
case(7): Wei1=1 ;Wei2=1 ;Wei3=1;P0=Duan[sec1];i=0;break;
}
//数码管动态扫描
}
}
能指教一下吗?
作者:
isyido
时间:
2021-7-25 15:14
首先检查定时器的设置是否正确(计算公公式),再一个是,建议是精简定时器中断中的处理。
作者:
huashanhui20
时间:
2021-7-25 15:17
你可能晶振没有设好
作者:
lkc8210
时间:
2021-7-25 16:23
TH0=0xB8;
TL0=0x00;
cut++;
if(cut>=50)
{
cut=0;/我在这里设置了一个断点,运行到这显示了t1=0.46149300sec,可根据设想应该是经过1秒后才会运行到这里啊
按推理,中断是20ms,0xB800,是按11.0592Mhz来算的吧?
11.0592 x 1/0.46149300 = 23.9639Mhz
你用什么去仿真的?Keil吗?
你是不是设置了24Mhz?
20210725_162155.png
(23.11 KB, 下载次数: 35)
下载附件
2021-7-25 16:22 上传
作者:
wulin
时间:
2021-7-25 21:20
楼主逐条对照,就能发现问题在哪里。
#include "reg52.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit Wei1=P2^2;//这里的引脚是控制74ch138的
sbit Wei2=P2^3;
sbit Wei3=P2^4;
u8 code Duan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管段码
u16 cut=0;
u8 sec=0;
u8 min=0;
void main()
{
u8 i=0;
TMOD=0x01;
TH0 = 0xF8;
TL0 = 0xCD;
TR0=1;
while(1)
{
if(TF0==1)//2ms
{
TF0=0;
TH0 = 0xF8;
TL0 = 0xCD;
cut++;
if(cut>=500)
{
cut=0;
sec++;
if(sec>=60)
{
sec=0;
min++;
if(min>=60)
min=0;
}
}
//定时器的代码
switch(i)
{//数码管动态扫描
case(0): Wei1=0 ;Wei2=0 ;Wei3=0;P0=0x40;i++;break;
case(1): Wei1=1 ;Wei2=0 ;Wei3=0;P0=0x40;i++;break;
case(2): Wei1=0 ;Wei2=1 ;Wei3=0;P0=0x40;i++;break;
case(3): Wei1=1 ;Wei2=1 ;Wei3=0;P0=0x40;i++;break;
case(4): Wei1=0 ;Wei2=0 ;Wei3=1;P0=Duan[min/10];i++;break;
case(5): Wei1=1 ;Wei2=0 ;Wei3=1;P0=Duan[min%10]|0x80;i++;break;//加小数点
case(6): Wei1=0 ;Wei2=1 ;Wei3=1;P0=Duan[sec/10];i++;break;
case(7): Wei1=1 ;Wei2=1 ;Wei3=1;P0=Duan[sec%10];i=0;break;
}
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1