① 用c语言编写一个计数器(单片机为51型,数码管为共阴)要求有三个按键分别控制停止、加、减
一看到你说是计数器,又看到你要求有停止功能,意思是把Timer改为计数器,然后可以通过一个键停止计数对吧?
如果这样的话挺简单的,51单片机的计数器io口记得好像是P3^0和P3^1,但不管怎么,首先设置TMOD,将C/T位置1,这就改为计数器了,然后可以编写函数来对一个变量进行加减;同样利用51单片机的外部中断也可以实现计数功能,打开外部中断开关,在外部中断服务函数对计数变量进行加减;最简单的,直接利用io口高低电平变化来进行计数,编写if函数,只要某个io口电平变化了,就对计数变量进行加减。
如果你对这个有点陌生,那么回复我一起讨论或者我可以帮你写程序。
希望我的回答能帮助到你。
② 51单片机定时器进入中断问题
EA=1;允许中断
ET0=1;定时器中断使能
TR0=1;开定时器,开始计时,定时器开始工作;按机器周期向上加1,当定时器溢出(计数值大于65535),硬件产生中断,
进入中断和你写的函数没有关系,是定时器硬件控制进入中断,你的程序执行到哪中断,中断返回继续执行你的程序
③ 51单片机定时器T1中断使数码管计数0—F,每秒加1,想要将if()函数写到main()函数中,如何实现。
把初始化程序 Timer1Init(); 放在while(1) 的上面,你现在这样,每次循环都初始化了,就永远也不计数了 。另外,开机是显示8,是因为,开机P0口全为1,要过1秒后开始从0开始显示,可以在while(1)上面加一行 P0=0x3f; 这样,开机就显示0了。另外,这种定时1秒,定时器最好定时长点,如50ms ,你现在是定时1ms ,这中断频率太高了,如果有其它程序就会影响主程序的执行。
还有,if 语句下面的
if(i==1000)
{
//TR1=0;//要这行,就计数一遍就停了,要不停地计数就要删掉
i=0;
P0=smgan[n++];
if(n==16) n=0;
}