一个简单的单片机程序问题
函数功能:用LED灯数码管显示计数器对T0的计数值。 #include<reg52.h> unsigned char x; unsigned char s[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; sbit P34=P3^4; delay1ms(int i) //1秒基准延时函数 { int j; while(i--) {for(j=0;j<115;j++);} } void display(unsigned char x) { P2=0xef; P0=s[x/1000]; delay1ms(5); P2=0xdf; P0=s[x%1000/100]; delay1ms(5); P2=0xbf; P0=s[x%1000%100/10]; delay1ms(5); P2=0x7f; P0=s[x%1000%100%10]; delay1ms(5); } void main(void) { TMOD=0x06;//TMOD=000 0110B EA=1; //开放总中断 ET0=1; //允许定时器T0的中断 EX0=1;//允许外中断INT0 IT0=1;//INT0为下负脉冲触发方式(TCON的,处理外部中断) TR0=1;//启动T0(TCON的处理定时器工作的) TH0=TL0=256-1;//计数器T0高8位赋初值25566 while(1) { //x=TL0; display(x); } } //INT0终端函数(中断服务函数) void clear() interrupt 0 { x=0; } //T0 计数器中断 () void Key_counter() interrupt 1 { if(P34==0) { delay1ms(20); if(P34==0) { x=(x+1)%10000; //因为是4位数码管显示 所以要把计的数控制在10000以内(000~999) } } } 有几个小问题: 1.这个程序执行的流程可以大致说一下吗? 2.在主函数的while里面,为什么要把x=TL0注释掉? 3.void clear() interrupt 0里面的x=0;可以理解为对x赋初值吗? 谢谢!
1 大致分为3 个模块,显示函数,中断,主函数,流程如下:首先进入主函数,打开计数器开关和外部中断开关,然后进入中断服务函数,开始计数. 2,在while(),只需显示就可以了,因为在中断中已经对x计数赋值了,所以不需要了 3.可以那样理解,不过最好说成清零,因为在keil c 中默认初值为0,如果你不对其进行赋值的话. 不知道是你自己写的程序不?主函数里面最好不要放中断设置,放到初始化函数中,这样就显得有条理了.我也是学单片机的,大家共同交流
答:我就是学单片机的,其实你所说的“ 1、中断源 2、中断声请 3、开放中断 4、保护现场 5、中断服务 6、恢复现场 7、中断返回 ”。只是中断的内部一些机制,主...详情>>
答:这是很正常的开机上电自检!没必要紧张!详情>>
问:我的惠普打印机安装WINDOWS打印机软件时搜索了HP Deskjet D240...
答:HP官方驱动下载,只要填上你打印机的型号就能找到合适的驱动。详情>>