| 求电路图! |
| void timer0()interrupt 0 不是0 是1,你好好看看中断级别。 |
| 解决没有??什么问题 |
| 定时器没跑吧 |
xht9951 发表于 2016-11-18 12:17 非常感谢 |
zl2168 发表于 2016-11-18 11:20 非常感谢,学生下次一定注意 |
king@ 发表于 2016-11-19 21:55 非常感谢 |
| 先学学正确的东西。 |
xht9951 发表于 2016-11-18 12:17 “做为初学者来说,从一开始,就要养成良好编程的习惯,程序要加注释,层次要清晰。”对头!!! |
| 看了一下你的板子好像是天祥的。我只觉得你一个地方有问题,天祥的书里不是也说了嘛,中断函数里少放东西,尽量把计算和赋值提到外面来 |
|
电路图不一样。自行修改 #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P1^7; sbit wela=P1^6; uchar num,count; uint bai=0,shi=0,ge=0; void display(uint bai,uint shi,uint ge); uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,}; void delay1ms(void) //误差 -0.651041666667us { unsigned char a,b; for(b=102;b>0;b--) for(a=3;a>0;a--); } void main() { TMOD=0x00; TH0=(8192-8000)/32; TL0=(8192-8000)%32; EA=1; ET0=1; TR0=1; while(1) { display(bai,shi,ge); } } void display(uint bai,uint shi,uint ge) { bai=num/100; shi=(num - (bai*100))/10; ge=num%10; dula=1; P0=0X00; dula=0; wela=1; P0=0x7f; wela=0; dula=1; P0=table[ge]; delay1ms(); dula=1; P0=0X00; dula=0; wela=1; P0=0xbf; wela=0; dula=1; P0=table[shi]; delay1ms(); dula=1; P0=0X00; dula=0; wela=1; P0=0xdf; wela=0; dula=1; P0=table[bai]; delay1ms(); } void timer0()interrupt 1 { TH0=(8192-8000)/32; TL0=(8192-8000)%32; count++; if(count ==125) { count = 0; num++; if(num==999) num = 0; } } |
| 第一个是跳转到中断那里应该写,interrupt 1 第二个是每次显示数码管最好是先写消隐 ,第三是写完段码显示就不要段码控制为0,不然就显示动不了,延时时间太长。最后一个中断控制里计算个,十,百,最好提到主函数里,不然1秒计数就会产生很大的误差。 |
wuyibin2003 发表于 2016-11-18 08:39 中斷編號有誤。延時過長。 |
| 你程序里面数字变化的量num都没有看到有变化的地方,肯定一直是000啊 |
| 忘说了,我也是初学者,希望高手 不要喷我,谢谢~ |
|
TMOD=0x00;这名句改为 TMOD = 0X01; TMOE寄存器的低4位是设置T0定时器的工作模式; 59.void timer0()interrupt 0 这句改为:void timer0() interrupt 1 (此处中断号不对,0是外部中断,1是内部中断) 另:做为初学者来说,从一开始,就要养成良好编程的习惯,程序要加注释,层次要清晰。建议看宋学松老师的视频,(本论坛就有下载)不要看郭天祥老师的。。。。 写了这些,有没有HB啊 ![]() |
| 为什么有人学得快、学的好,有人学得慢、学的差?除了悟性、勤奋外,学习方法不好是一个重要原因! |
|
本帖最后由 zl2168 于 2016-11-18 11:22 编辑 为什么不吸取教训?上次给了你一个程序,还带keil调试,与别人的程序比较,不知你有什么体会?给你学习方法的建议有什么感想?不学理论,盲目实践,不是事倍功半,就是知其然,不知其所以然。 |
| 两种可能 一是可能数据传递不成功 二是 定时器没有计数 |