关于51单片机利用内部定时计数器使数码管前两位数从00变到59 的问题

# include <reg51.h>
# define uint unsigned int
# define uchar unsigned char
uchar code weixuan []={0xfe,0xfd,0xff,0xff,0xff,0xff,0xff,0xff};
uchar code duanxuan []={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar xianshi [10];
uint m,n;
void delay (uint i)
{
uint j=30;
for (;i>0;i--)
for (;j>0;j--);
}
void main ()
{
uint i,j;
TMOD=0x01; //确定工作方式
EA=1; //开总中断
ET0=1; //开定时计数器0中断
TR0=1; //打开定时器0
TH0=(65536-50000)/256; //给定时器赋初值
TL0=(65536-50000)%256;

xianshi [0]=duanxuan [n%100/10];
xianshi [1]=duanxuan [n%10];
xianshi [2]=0x00;
xianshi [3]=0x00;
xianshi [4]=0x00;
xianshi [5]=0x00;
xianshi [6]=0x00;
xianshi [7]=0x00;
for (i=0;i<8;i++)
{
P1=weixuan [i];
P0=xianshi [i];
delay (1);
P0=0x00;
}
}
void time0 () interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
m++;
if (m==20)
{
m=0;
n++;
}
}
如题,还需要怎么修改,我感觉中断没有使n的值加一

第1个回答  2015-04-20
看手册啊,没用过这东西
不过估计是中断里处理不对,中断先清中断标志,不用重新配置计时器。
第2个回答  推荐于2016-09-10
① n 值操作符合程序自加要求,但不符合时钟要求(秒的有效值是0-59),判断:程序功能为秒表;
② 该程序 n 能引起的问题只有:每隔655次(共18时12分16秒) 35 到 36 的显示,都会出现一次 35 到 0(n=65535,+1=0),修正方法:制定有效显示范围,从程序看出,只需显示2位数,即0-99秒,可以设置 n 的范围为 0-99(n=++n%100),那 n 也就用不上 uint 型了,uchar 够了。
③ 未分析出 有 00 直接到59 的显示过程,请LZ 将问题描述清楚。
④ m 的值可以使用 uchar 型的(非必须项)追问

不会写实现秒表功能的程序

本回答被提问者采纳

单片机c51考试基础部分:要求用两个数码管动态显示两位十进制数00~59...
include<reg52.h>#define Port P0sbit seg1 = P2^0;sbit seg2 = P2^1;unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f, 0x6f};\/\/共阴极数码管 unsigned char time1,time2,time;unsigned char count;bit flag;void Timer0_Init(){ TMOD=0x01;...

...使前两个数码管实现00到59的秒表功能,希望大神用汇编和中断_百度知 ...
请设计一个2位静态数码管从00到59显示的程序 include <reg51.h> unsigned char show[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};int n, j;qc()interrupt 1 using 3 {TH0=(65336-10000)\/256;TL0=(65336-10000)%256;n++;if (n>=100){n=0;j++;if (j>=60)j=...

AT89c51单片机程序控制两个数码管显示00-59秒表的程序要怎么编啊...
display(second)子函数与两个数码管的连接方式有关 void main(void )\/\/主程序 { TMOD=0x01;\/\/ 定时器1工作方式一 ET0=1;EA=1;TH0=(65536-10000)\/256;\/\/定时10ms TL0=(65536-10000)%256;TR0=0;\/\/上电先不启动 while(1){ if(key1==0)\/\/判断按键是否按下 { Delay1ms(10);\/\/延时...

定时器延时问题(51单片机,c语言)
你的这两个函数void delayms(uint)和void display(uchar,uchar,uchar,uchar)我可以肯定的告诉你,没有问题。你的这个程序其实就是想显示0000~5959之间的数,而且这个数是每20秒+1顺序递增的。之所以没有任何反应,那是你的主程序没有挂起,也就是在while(1)里没有没有大括号,程序执行一次就结束了...

51单片机中用定时器定时1毫秒,怎么编写
假设晶振为12MHz,不用中断时程序语句如下:TMOD=0x01;\/\/定时器0工作方式1 TH0=(65536-1000)\/256;\/\/装入初值 TL0=(65536-1000)%256;TF0=0;\/\/清溢出标志;TR0=1;\/\/启动定时器0 while(TF0==0);\/\/等待定时时间到 TR0=0;TF0=0;...

利用单片机串口,设计两位数的秒计数(0-59)?
利用单片机串口,驱动两位数码管显示秒计数,可以用两片74LS164串联接在串口引脚RXD、TXD上,串口工作在方式0,这样,用串口发送方式输出两位数码管显示秒计数。如下仿真图。

单片机用C语言写两个数码管显示0到59循环的程序在归0
ET0=1;\/\/开定时器0中断 TR0=1;\/\/启动定时器0 while(1){ if ( tt==20 ){ tt=0;if ( wei==1 ) { i++; } } if ( i==59 ) { i=0; } led2=0;P1=(led_zx[i%10]);led1=1;mdelay(50);led1=0;P1=(led_zx[i\/10]);led2=1;mdelay(50);} } void timer0...

用C语言51单片机编写数码管从00到99的循环程序
{ TMOD=0x01;ET0=1;EA=1;TR0=1;TH0=0x3c;TL0=0xaf;} void time_1s (void) interrupt 1 { int ncount;TH0=0x3c;TL0=0xaf;ncount++;if(ncount<20) return;{ ncount=0;i++;if(i==100) i=0;} }

51单片机中写数码管59秒循环计时的程序可以不用计时器吗?用延时函数可...
既然能计数,那说明是你的数码管部分的程序没写好。直接delay(1000)就约等于1s 了,不过你这样最好计数小一点,因为这个延时程序执行完了之后还要执行显示函数。还有一种方法就是自己估算一下显示函数需要花多长时间,然后在while里同时执行delay和显示函数,这时候就要定义一个变量,全局变量 ...

关于51单片机定时器问题
定时器为 50ms 中断,程序 的内容 是 1s 数码管 更新一个数0-F,1s 流动 一个 LED灯,一个周期 是 8s 而不是 1s。想要 周期为 1s 的话,定时器的时间应该 是 125ms,一次性 都 定时不到,就只能是 定时 25ms,分5次,为一 颗灯 的时间,40次 为一个数码管 数值 的时间。

相似回答