问答

汇集网友智慧,解决技术难题

21ic问答首页 - 51单片机的计数器1方式0为什么不能实现计数功能?

单片机 技术交流 protues仿真 C语言

51单片机的计数器1方式0为什么不能实现计数功能?

家人幸福2022-09-20
51单片机的计数器1方式0为什么在Protues仿真不能实现计数功能?程序代码如下,求大神看一下.
#include<reg52.h> //包含52系列单片机头文件
#define uint unsigned int
#define uchar unsigned char //宏定义
sbit dula=P2^6; //申明单片机的P2.6口为段选锁存器的输入端
sbit wela=P2^7; //申明单片机的P2.7口为位选锁存器的输入端
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint); //延时子函数
void display(uchar bai,uchar shi,uchar ge) //显示子函数
{
dula=1; //打开段选锁存器
P0=table[bai];//将计数值的百位数字送到P0口
dula=0; //关闭段选锁存器
P0=0xff; //送位选信号前关闭所有显示
wela=1; //打开位选锁存器
P0=0xfe; //第一位数码管显示
wela=0; //关闭位选所存器
delayms(50);//调用延时函数延时50毫秒
dula=1; //打开段选锁存器
P0=table[shi];//将计数值的十位数字送到P0口
dula=0; //关闭段选锁存器
P0=0xff; //送位选信号前关闭所有显示
wela=1; //打开位选锁存器
P0=0xfd; //第二位数码管显示
wela=0; //关闭位选所存器
delayms(50);//调用延时函数延时50毫秒
dula=1; //打开段选锁存器
P0=table[ge];//将计数值的个位数字送到P0口
dula=0; //关闭段选锁存器
P0=0xff; //送位选信号前关闭所有显示
wela=1; //打开位选锁存器
P0=0xfb; //第三位数码管显示
wela=0; //关闭位选所存器
delayms(50);//调用延时函数延时50毫秒
}
void delayms(uint xms) //声明延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);//i=xms,即延时x毫秒
}
uint read()//读取计数值函数
{
uchar tl,th1,th2;
uint val;
while(1)//大循环
{
th1=TH1;//读取计数器1的高8位
tl=TL1; //读取计数器1的低8位
th2=TH1; //再次读取计数器1的高8位
if(th1==th2)//判断计数器的低8位是否向高8位产生了进位
break;//如果产生了进位再次读取计数器的高8位和低8位,如果没有则跳出循环
}
val=th1*32+tl;//
return val;
}
void main()//主函数
{
uchar a,b,c;
uint num;
TMOD=0x40;//设定计数器1的工作方式为方式0(0100 0000)
TH1=0;
TL1=0;//给计数器0的高8位和低8位赋初值
TR1=1;//启动计数器1,开始计数
while(1)//大循环
{
num=read();//将读取计数器1函数的返回值放到num中
if(num>=100);//判断计数值是否达到了150次,如果没有则跳出
{
num=0;
TH1=0;
TL1=0;//如果达到了150次将计数值清0并将计数器0的低8位和高8位重新赋值,重新开始计数
}
a=num/100; //将计数值的百位分离出
b=num%100/10; //将计数值的十位分离出
c=num%10; //将计数值的个位分离出
display(a,b,c);//调用显示函数,显示计数值
}
}
回答 +关注 0
381人浏览 1人回答问题 分享 举报
1 个回答
  • 好象少了下面两句
    EA  = 1;                //开总中断
    ET1= 1;                //开定时/计数器1中断

    好象没有定时器中断函数
    void Timer1_Counter() interrupt 3
    {

    }


    家人幸福 2022-9-21 08:35 回复TA
    这个问题一直在困扰着我,求大神指导。 
    家人幸福 2022-9-21 08:34 回复TA
    我没有用计数器的中断来实现计数,计数器0方式0、1、2和计数器1的方式1、2我都没有用到中断,都可以实现我想要的计数效果,只有计数器1方式0不能实现我想要的仿真计数效果。 

您需要登录后才可以回复 登录 | 注册