完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 tangbenchang 于 2014-2-14 15:48 编辑 程序如图所示,使用定时器做数码管显示,从0-9。编译成功,仿真的时候数码管不显示,调试发现定时器不工作的样子。烦请各位指点迷津。 ![]() |
|
相关推荐
18个回答
|
|
这是所有的程序么,没发现 void XXXX()interrupt 1中断函数,主的主程序里应让 EA=1 ET0=1 打开中断开关,装载TH0 TL0应在中断函数里填写
|
|
|
|
![]() |
|
|
|
1.没有中断函数,如果shumaguan()是中断函数的话,应该有中断号,其次主函数while中不用调用中断函数。
2.总中断EA T0中断ET0 都没有打开 3.不明白楼主为什么中断使硬件自动清零 TF1:定时器1溢出标志位。当定时器1计满溢出时,由硬件使TF1置“1”,并且申请中断。进入中断服务程序后,由硬件自动清“0”,在查询方式下用软件清“0”。 |
|
|
|
不想用中断去加1,主要是用通过if(TF0==1)判断溢出标志位再重装处置,然后软件清标志位。 |
|
|
|
我的思路是,初始化函数里面是定时器初始化,主函数一开始调用初始化函数进行系统初始化,while主循环调用shumaguan函数,通过if判断定时器溢出标志TF0,如果溢出,软件清零并重装初值。 |
|
|
|
shumaguan主要是判断溢出标志位TF0,然后在函数里面对显示函数变量加1,。我就是想用软件查询标志位才没有开中断的。 |
|
|
|
本帖最后由 me860 于 2014-2-15 17:59 编辑
好吧,我对于查询方式的使用方法忘干净了 现在这个程序的问题应该出在shumaguan函数 其中的两个变量(局部变量)的作用域只限于这个函数,每当shumaguan函数运行变量值+1,当退出shumaguan函数时这俩个变量就失效了,当再次进入shumaguan函数时,两个变量用重新被赋值,重复上面的过程,这两个变量永远不会达到你想要的值,最简单的方法是把这两个变量声明为全局变量,即在main函数前声明即可,你声明的count 、a 这两就是全局变量,还可以在shumaguan函数中用static uchar counter = 0声明为静态局部变量 |
|
|
|
不用在main函数里判断计时器溢出的=。= 计时器溢出了,单片机会自动跳到对应计时器中断函数去的。 |
|
|
|
计时器中断,这个我做了,现在主要是想验证软件查询计时溢出标志。 |
|
|
|
我把shumaguan函数的两个变量都定义为全局变量了,还是不会计数,程序运行起来好像是计数器没有打开的样子,但是如果我打开中断,它就会计数。。 程序在while(1)里面一直重复着数码管函数,而计数是后台运行的,相当于程序一直在执行shumaguan函数,那两个变量定义成局部变量也是可以的吧。 |
|
|
|
如果你用debug调试会发现,这个子函数的全局变量和局部变量的差别,我已经用你的程序实验过了,只不过我是用LED灯试验的,TF0工作正常 |
|
|
|
我也写了一个程序,可是也是好像不计数,定时器也依次打开关闭,变量也定义为全局变量了,还是不行啊,不计数
我的程序源码: #include #define uchar unsigned char #define uint unsigned int uint offset=0; uint count=0; void init_sys(); void shumaguan(); void display(uint offset); void timer0(); void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } ***it dula=P2^5; ***it wela=P2^6; uchar code shuma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8E,0X89,0X7F,0XBF}; void main() { init_sys(); while(1) { shumaguan(); } } void init_sys() { dula=0; wela=0; TMOD=0x01; TH0=0x3c; TL0=0xB0; TR0=1; } void init_timer0() { TH0=0x3c; TL0=0xB0; TR0=1; } void shumaguan() { //uint count=0; if(TF0==1) { count++; TF0=0; TR0=0; //TH0=0x3c; //TL0=0xB0; init_timer0(); } if(count==20) { count=0; display(offset); } } void display(uint offset) { wela=0; dula=0; P0=0xdd; wela=1; delay(1); wela=0; P0=shuma[offset]; dula=1; delay(1); dula=0; } 请大神看看 |
|
|
|
只在数码管上指定位显示了0
|
|
|
|
P0=shuma[offset]; //你的shuma[offset]中,offset没有操作,当然没有变化了,参照楼主写的那个显示函数就行 |
|
|
|
#include #define uchar unsigned char #define uint unsigned int uint offset=0; uint count=0; void init_sys(); void shumaguan(); void display(uint offset); void timer0(); void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } ***it dula=P2^5; ***it wela=P2^6; uchar code shuma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8E,0X89,0X7F,0XBF}; void main() { init_sys(); while(1) { shumaguan(); } } void init_sys() { dula=0; wela=0; TMOD=0x01; TH0=0x3c; TL0=0xB0; TR0=1; } void init_timer0() { TH0=0x3c; TL0=0xB0; TR0=1; } void shumaguan() { //uint count=0; if(TF0==1) { count++; TF0=0; TR0=0; //TH0=0x3c; //TL0=0xB0; init_timer0(); } if(count==20) { count=0; display(offset);你的计数时间到了,变量offset没有加1,它的初始值是零,显示的肯定是零。 } } void display(uint offset) { wela=0; dula=0; P0=0xdd; wela=1; delay(1); wela=0; P0=shuma[offset];这里的变量offset时间到了没加1,初始值是0显示肯定是0 dula=1; delay(1); dula=0; } |
|
|
|
糊涂糊涂了,忘了++了,明天试一下也不知道行不行 |
|
|
|
对的对的,忘了++ |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-ubuntu18.04通过网线共享网络
210 浏览 0 评论
384 浏览 0 评论
712 浏览 0 评论
I.MX6ULL-飞凌 ElfBoard ELF1板卡 - 如何在Ubuntu中编译OpenCV库(X86架构)
1455 浏览 0 评论
1352 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
9244 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-6-26 21:51 , Processed in 1.048235 second(s), Total 103, Slave 86 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191