有关模块化编程和非模块化编程的问题?
C51编程:同一程序模块化编程和非模块化编程为什么出现模块化的编译通过后在硬件上通不过呢? [雷影] 2006-8-2 1:10:09
不得不请教各位高手了:同一程序模块化编程和非模块化编程,为什么出现模块化的编译通
过后在硬件上通不过呢?不是提倡要模块化编程吗?结果却是非模块化编程在硬件上能顺利
工作,但是模块化的不行。下面是两种编程的原程序。
模块化编程:
文件1:dingshiqimain.c
#include <reg51.h>
display();
main()
{
TMOD=0x01;//定时器0方式1
TH0=(65536-50000)/256;//50ms定时初值
TL0=(65536-50000)%256;//50ms定时初值
EA=1;//开总中断
ET0=1;//开分中断
TR0=1;//启动定时
while(1)
{
display();//循环调用显示函数
}
}
文件2:display.c
#include <reg51.h>
#define uchar unsigned char
sbit P0_6=P0^6;//十位数码管公共极
sbit P0_7=P0^7;//个位数码管公共极
uchar min_buffer1,min_buffer0;//十位,个位显示缓冲区
extern min;//引用timer0interrupt.c定时中断文件的变量
delay3ms();//数码管显示的时间
uchar code discode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴
极数码管的段码
/************************************
*显示函数
*************************************/
display()
{
min_buffer0=min%10;//取分的个位
min_buffer1=min/10;//取分的十位
P1=discode[min_buffer1];//取分的十位显示段码送P1口
P0_6=0;//开十位数码管
delay3ms();//显示时间3ms
P0_6=1;//关十位数码管
P1=discode[min_buffer0];//取分的个位显示段码送P1口
P0_7=0;//开个位数码管
delay3ms();//显示时间3ms
P0_7=1;//关个位数码管
}
delay3ms()
{
uchar v,w;
for(v=0;v <6;v++)
for(w=0;w <248;w++);
}
文件3:timer0interrupt.c
#include <reg51.h>
#define uchar unsigned char
uchar secflag=0;//秒标志位
uchar sec=0;//秒初值
uchar min=15;//分初值
extern min_buffer1,min_buffer0;//引用display.c显示文件中的变量
/******************************************************
*定时器T0的中断函数
*******************************************************/
timer0interrupt() interrupt 1 using 0
{
TH0=(65536-50000)/256;//重新付初值
TL0=(65536-50000)%256;//重新付初值
secflag++;//秒标志加1
if(secflag==20)//是否一秒到
{
secflag=0;
sec++;
if(sec==60)//是否一分中到
{
sec=0;
--min;//分减一
if(min==0)//分是否减到为0
{
TR0=0;//停止定时器
}
}
}
}
非模块编程:
#include <reg51.h>
#define uchar unsigned char
sbit P0_6=P0^6;
sbit P0_7=P0^7;
uchar min_buffer0,min_buffer1;
uchar secflag=0;
uchar sec=0;
uchar min=15;
uchar code discode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
display();
delay3ms();
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
display();
while(1)
{
display();
}
}
display()
{
min_buffer0=min%10;
min_buffer1=min/10;
P1=discode[min_buffer1];
P0_6=0;
delay3ms();
P0_6=1;
P1=discode[min_buffer0];
P0_7=0;
delay3ms();
P0_7=1;
}
delay3ms()
{
uchar v,w;
for(v=0;v <6;v++)
for(w=0;w <248;w++);
}
timer0interrupt() interrupt 1 using 0
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
secflag++;
if(secflag==20)
{
secflag=0;
sec++;
if(sec==60)
{
sec=0;
--min;
if(min==0)
{
TR0=0;
}
}
}
}
发表时间:2006年8月2日8:09:52