电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
问答
简易单片机频率的相关问题 无法显示频率值
已解决
73482
个问题
已帮助
5993
位优秀工程师
简易单片机频率的相关问题 无法显示频率值
ca0043d2abcf26e0
2020-06-27
浏览量:524
下面这个程序我编译的时候没问题,但仿真时频率值(仿真结果在下面)无法显示出来,希望有哪位大佬能帮我解答一下。
#include <AT89X51.H>
unsigned char code dispbit[]={0xfe0xfd0xfb0xf70xef0xdf0xbf0x7f}; //P2的扫描位
unsigned char code dispcode[]={0x3f0x060x5b0x4f0x66
0x6d0x7d0x070x7f0x6f0x000x40}; //数码管的字形编码
unsigned char dispbuf[8]={0000001010}; //初始化显示值
unsigned char temp[8]; //存放显示的数据
unsigned char dispcount; //显示计数器值
unsigned char T0count; //T0的计数器值
unsigned char timecount; //计时计数器值
unsigned int geshibaiqianwanswbwqw;//声明数码管个位变量、数码管十位变量、数码管百位变量、数码管千位变量...
bit flag; //标志位
unsigned long x; //频率值
//频率计算函数
void HzCal(void)
{
unsigned char i;
x=T0count*65536+TH0*256+TL0; //得到T0的16位计数器值
for(i=0;i<8;i++)
{
temp[i]=0;
}
i=0;
while(x/10) //拆分
{
temp[i]=x%10;
x=x/10;
i++;
}
temp[i]=x;
for(i=0;i<6;i++) //换算为显示数据
{
dispbuf[i]=temp[i];
}
T0count=0;
}
void main(void)
{
TMOD=0x15; //设置定时器工作方式
TH0=0;
TL0=0;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256; //初始化T1
TR1=1;
TR0=1;
ET0=1;
ET1=1;
EA=1; //开中断
while(1)
{
if(flag==1)
{
flag=0;
HzCal(); //频率计算函数
TH0=0;
TL0=0;
TR0=0;
}
if(timecount>=1000)//判断定时器1中断次数变量是否大于等于1000,即1s。
{
TR0=1;
timecount=0;//定时器1中断次数变量置0
flag=1;//数码管初始化标志位变量置1
ge=dispcode[dispbuf[0]];//数码管个位变量
shi=dispcode[dispbuf[1]];//数码管十位变量
bai=dispcode[dispbuf[2]];//数码管百位变量
qian=dispcode[dispbuf[3]];//数码管千位变量
wan=dispcode[dispbuf[4]];
sw=dispcode[dispbuf[5]];
bw=dispcode[dispbuf[6]];
qw=dispcode[dispbuf[7]];
}
if(timecount<1000&&flag==0)//判断定时器1中断次数变量是否小于1000和数码管初始化标志位变量是否等于0
{
ge=dispcode[0];//数码管个位变量为0
shi=dispcode[0];//数码管十位变量为0
bai=dispcode[0];//数码管百位变量为0
qian=dispcode[0];//数码管千位变量为0
wan=dispcode[0];
sw=dispcode[0];
bw=dispcode[0];
qw=dispcode[0];
}
}
}
//定时器T0中断服务子函数
void t0(void) interrupt 1 using 0
{
T0count++;
}
//定时器T1中断服务子函数
void t1(void) interrupt 3 using 0
{
unsigned char i;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256; //初始化T1预装值,1ms定时
timecount++; //扫描
P2=0xff;
switch(i)//让8位数码管以1ms间隔轮流刷新
{
case 0:
P0=ge;//数码管个位数值显示
P2=0xfe;//数码管个位显示位
i++;//选位变量先赋值再加加
break;
case 1:
P0=shi;//数码管十位数值显示
P2=0xfd;//数码管十位显示位
i++;//选位变量先赋值再加加
break;
case 2:
P0=bai;//数码管百位数值显示
P2=0xfb;//数码管百位显示位
i++;//选位变量先赋值再加加
break;
case 3:
P0=qian;//数码管千位数值显示
P2=0xf7;//数码管千位变量显示位
i++;//选位变量置0
break;
case 4:
P0=wan;//数码管千位数值显示
P2=0xef;//数码管千位变量显示位
i++;//选位变量置0
break;
case 5:
P0=sw;//数码管千位数值显示
P2=0xdf;//数码管千位变量显示位
i++;//选位变量置0
break;
case 6:
P0=bw;//数码管千位数值显示
P2=0xdf;//数码管千位变量显示位
i++;//选位变量置0
break;
case 7:
P0=qw;//数码管千位数值显示
P2=0xdf;//数码管千位变量显示位
i=0;//选位变量置0
break;
default : break;//自定义
}
}
显示全部
单片机
关注问题
写回答
0
0
收起
我来回答
上传资料:
选择文件
文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
所有亮答
数量:
1
xdsnet
定时器T1中断服务子函数部分的
具体逻辑你可能要捋一捋啊,从现在的代码看,中断调用后i一直是0的。
估计你应该让i变量变为静态变量。
发布于
2020-06-29
举报
评论 0
0
0
发布
相关问题
问题达人
换一批
文章
知识经验换现金
换一批
简易单片机频率的相关问题 无法显示频率值
写回答
关注问题
×
我要举报该内容,理由是:
内容质量差:
内容太水、伸手党
垃圾广告信息:
广告、招聘、推广、测试内容等
偏离问答主题:
与技术无关、讨论类
与社区已有内容重复:
违规内容:
色情、暴力、血腥、敏感信息等
不友善内容:
人事攻击、挑衅辱骂、恶意行为
以上选项都不是: