完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
下面这个程序我编译的时候没问题,但仿真时频率值(仿真结果在下面)无法显示出来,希望有哪位大佬能帮我解答一下。
#include 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;//自定义 } } |
|
相关推荐
1个回答
|
|
定时器T1中断服务子函数部分的具体逻辑你可能要捋一捋啊,从现在的代码看,中断调用后i一直是0的。估计你应该让i变量变为静态变量。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-mfgtools烧录流程之烧写原理
321 浏览 0 评论
请问SPH0641LU4H这款麦克风如何在不使用I2S的情况下,单纯通过GPIO来进行驱动且正常读取数据呢
325 浏览 0 评论
296 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第三十六章 照相机实验
313 浏览 0 评论
STM32模拟eeprom只有起始地址0x8001000正常其他地址都会造成单片机运行不正常怎么回事
276 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12079 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-31 06:29 , Processed in 0.580864 second(s), Total 72, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号