大家帮我看看这个单片机的c语言编程吧,不知道怎么的用keil编译总是说中断服务程序附近有错误,谢谢啦!

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table_dula[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code table_wela[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
sbit dula=P2^6;
sbit wela=P2^7;
uchar shi,fen,miao;
uchar count=0;
void delay(uint z)
{
uint x;
uchar y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()
{
dula=1;
P0=table_dula[8];
dula=0;
P0=0xff;
wela=1;
P0=table_wela[1];
wela=0;
delay(5);
dula=1;
P0=table_dula[8];
dula=0;
P0=0xff;
wela=1;
P0=table_wela[2];
wela=0;
delay(5);
dula=1;
P0=table_dula[8];
dula=0;
P0=0xff;
wela=1;
P0=table_wela[3];
wela=0;
delay(5);
dula=1;
P0=table_dula[8];
dula=0;
P0=0xff;
wela=1;
P0=table_wela[4];
wela=0;
delay(5);
dula=1;
P0=table_dula[8];
dula=0;
P0=0xff;
wela=1;
P0=table_wela[5];
wela=0;
delay(5);
dula=1;
P0=table_dula[8];
dula=0;
P0=0xff;
wela=1;
P0=table_wela[6];
wela=0;
delay(5);
}
void disp_shumaguan()
{
dula=1;
P0=table_dula[shi/10];
dula=0;
P0=0xff;
wela=1;
P0=table_wela[1];
wela=0;
delay(5);
dula=1;
P0=table_dula[shi%10];
dula=0;
P0=0xff;
wela=1;
P0=table_wela[2];
wela=0;
delay(5);
dula=1;
P0=table_dula[fen/10];
dula=0;
P0=0xff;
wela=1;
P0=table_wela[3];
wela=0;
delay(5);
dula=1;
P0=table_dula[fen%10];
dula=0;
P0=0xff;
wela=1;
P0=table_wela[4];
wela=0;
delay(5);
dula=1;
P0=table_dula[miao/10];
dula=0;
P0=0xff;
wela=1;
P0=table_wela[5];
wela=0;
delay(5);
dula=1;
P0=table_dula[miao%10];
dula=0;
P0=0xff;
wela=1;
P0=table_wela[6];
wela=0;
delay(5);
}
void algorithm()
{
count++;
if(count == 20)
{
count = 0;
miao++;
if(miao == 60)
{
fen++;
miao = 0;
if(fen == 60)
{
shi++;
fen = 0;
if(shi == 24)
{
shi = 0;
}
}
}
void timer0init()
{
TOMD=0x01;
TH0=(65536-46083)/256;
TL0=(65536-46083)%256;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
init();
timer0init();
while(1)
{
disp_shumaguan();
}
}
void timer0() interrupt 1
{
TH0=(65536-46083)/256;
TL0=(65536-46083)%256;
algorithm();
}

中断中TH0和TL0的赋值应该是整数,比如说:
TH0=50000;
TL0=50000;相当于定时50ms,或者是
TH0=0Xac;
TL0=0x12;
此时是将十六进制数转化成十进制数算的,你这样的赋值方式
TH0=(65536-46083)/256;
TL0=(65536-46083)%256;
是不正确的,这是它内部寄存器的存储方式,单片机内部只能识别二进制数,所以是按二进制给值的。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-01-01
意见如下:
1 程序写的有够烂,建议楼主多读点程序规范之类的书,是在看不下去。

2 语法错误两处:(1) 在 shi = 0; 后加两个 }
(2)TOMD 改成TMOD
第2个回答  2012-01-02
语法错误两处:(1) 在 shi = 0; 后加两个 }
(2)TOMD 改成TMOD
第3个回答  2012-01-02
TOMD 改成TMOD

单片机C语言程序,看不懂,求讲解
该子程序是在硬件产生中断的时候,跳转到相应中断入口后,再跳转到这个中断服务程序的。请注意函数后面的“interrupt x”声明,这是C51的扩展内容。“用示波器测波形是测p1.0引脚,为什么是这个引脚,怎么确定的?p1_0不是个变量名吗?”P1_0这个符号在前面的头文件 t89c51cc02.h 中有定义。至于“...

(keli和Protus仿真软件)单片机中断实验程序代码,小部分有错误,求修改...
P0口的数码管属于后台程序,他一直循环计数 0~8 。他能被任何一个中段所打断,并且该中断退出后,P0口的数码管能接着被打断之前的数字继续计数,而不是从 0 重新开始,这一点你的程序没有做到。P2口的数码管由 INT0 中断控制,中断一次,只完成一次 0~8 的计数。他可以打断 P0 口,而不能打...

单片机c语言中interrupt4表示什么意思
1. 首先,打开常用的嵌入式开发工具Keil,它是51单片机编程的首选平台。2. 在编写C代码时,你需要设置相关的中断处理函数,比如处理串行端口的中断。代码中会包含对interrupt4的定义和调用。3. 编写完代码后,务必检查语法和逻辑,确保没有错误。然后生成十六进制文件并保存。4. 接着,使用专用的烧录软件...

51单片机c语言编程头文件的问题
另外注意:你在两个文件里定义的beep 和 Beep 是不一样的,这才是错误的原因。

单片机C语言编程 keil 调试总是针对数组赋值出现left side of asn-op...
一般这种错误都是左式不是变量,而是一个表达式才会出现 你先检查一下是否复制的时候,有不可见的字符复制过来了?手动输一遍左式看看。

关于单片机C语言的问题
1:你的示例中没有中断服务程序;2:中断发生后,如果当时没有其它同级或更高级的中断服务程序在执行,会马上停在正在执行的主程序,并记住这个位置,然后进入中断函数(当然CPU还要做些必要的处理,如压栈等操作);3:中断函数完后,程序会返回当初停止的那个位置,继续往下执行;4:示例中,当程序开始...

单片机汇编语言的几个疑问
这一点C语言就比较好,以函数方式实现,少写括号编译通不过,不像汇编,少些个RET照样能通过。另外,编写程序时应养成一种习惯:对程序体中的寄存器操作尽量不要直接使用其地址,比如:MOV 30H,A,这里直接写30H不好,因为大的汇编程序对寄存器地址的调整是很常见的现象,一旦修改,程序中每个地方都...

怎么知道单片机的rom ram是否已经用完
程序编译以后会有RAM和ROM的使用信息,超过了你就知道了。中断的存储空间,现在基本上是中断那只存一个跳转指令,跳转到中断服务程序,不过中断里面还是尽量少放指令,减少程序在中断的耽搁时间,尽量把处理放在主程序里。

使用单片机开发产品时用C语言多吗
因为汇编可以帮助理解硬件,有助于理解优化C语言程序,另外汇编对一些实时性高的场合(如中断服务程序,DSP数据处理程序)和底层硬件的应用场合(如keil C51、ARM的启动程序)都需要汇编来编写。但总体上来讲,用单片机开发产品的时候绝大多数还是用C语言。建议在掌握汇编的基础上使用C开发产品。

关于C51单片机单片机的几个问题
1、徐汉斌版单片机微型计算机原理教材P144上说“中断服务程序最后一条指令必须是中断返回指令RETI”,这句话是不是错了?如果最后一句话是跳转指令不是也可以么,只不过程序不会回到断点处罢了,PC也会填充跳转处PC地址 --写跳转指令、或者写其它什么指令,都行,随你便。单片机都会执行。--只是,...

相似回答