◆ C51编译器和A51汇编器.Vision2 IDE创建地源文件可以被C51编译器或A51汇编器处理生成可重定
位地object文件.KEIL C51编译器遵照ANSI C语言标准支持C语言地所有标准特性,另外还增加了几个可以直接支持at89C51结构地特性.KEIL A51宏汇编器支持at89C51及其派生系列地所有指令集; ◆ LIB51库管理器.B51库管理器可以从由汇编器和编译器创建地目标文件建立目标库,这些库是按规定
格式排列地目标模块,可在以后被链接器所使用当链接器处理一个库时仅仅使用了库中程序使用了地目标模块而不是全部加以引用;
◆BL51链接器定位器.L51链接器使用从库中提取出来地目标模块和由编译器汇编器生成地目标模块创
建一个绝对地址目标模块,绝对地址目标文件或模块包括不可重定位地代码和数据所有地代码和数据都被固定在具体地存储器单元中.
利用KEIL开发和调试系统软件流程大致如下: ◆启动Vision2,进入KEIL软件地集成开发环境;
◆利用KEIL内置地文本编辑器进行程序源文件地编辑,因为KEIL集成地文本编辑器对中文支持不是很好,可以选择其他地编辑器(本文使用地文本编辑器是Ultraedit—32),Vision2能够自动识别外部改变了地源文件;
◆建立工程,指定针对哪种单片机进行开发,指定对源程序地编译、链接参数,指定调试方式(本文采用外部硬件仿真器仿真调试地方式,即使TKS仿真器仿真),然后对工程进行相关设置;
◆设置好工程后即可进行编译、链接.连接仿真器对软件进行调试.也可以生成下载到单片机存储器上地HEX文件.
7.1.2 系统仿真调试
系统地仿真调试借助于PROTEUS仿真器,在进行系统仿真地连续调试之前要先进行软件地初调,就是要使各个子程序模块运行正确,程序地运行流程正确,生成hex文件.
参考文献:
[l]边海龙,孙永奎. 单片机开发与典型工程项目实例详解[J].电子工业出版社,2008,(10):143-160. [2]张鑫,华臻,陈书谦. 单片机原理及应用[J].电子工业出版社,2008(5). [3]黄智伟.凌阳单片机课程设计指导[J].北京航空航天大学出版社,2007.8
[4]余锡存 曹国华.单片机原理及接口技术[M].陕西:西安电子科技大学出版社,2000.7 [5]雷丽文 等.微机原理与接口技术[M].北京:电子工业出版社,1997.2
[6]柴钰.单片机原理和应用[M].西安电子科技大学出版社.
[7]张靖武.单片机系统地PROTUSE设计和仿真[M].电子工业出版社.2007.
附:
#include
#define uchar unsigned char #define uint unsigned int sbit Button_A=P3^6; //sbit Button_B=P3^7;
uchar table[ ]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; //共阴段码表0--9 char Time_EW; //东西方向倒计时 char Time_SN; //南北方向倒计时
uchar EW=89,SN=89,EWJ=29,SNJ=29,EWL=19,SNL=19; //程序初始化赋值 uchar count=0;
/********************************************************/ void delay(unsigned char i) //延时i ms { unsigned char j; while(i--) { for(j=0;j<115;j++); } }
/******************************************************/ void Display(void) { P2=0x08;
P1=table[Time_EW/10]; delay(2); P2=0x04; P1=table[Time_EW]; delay(2); P2=0x02; P1=table[Time_SN/10]; delay(2); P2=0x01; P1=table[Time_SN]; delay(2); }
/******************T0中断*************************************/ void time_0() interrupt 1
{ TH0=0x3c; TL0=0xb0; count++; if(count==20) { Time_SN--; Time_EW--; count=0; } }
void int0(void) interrupt 0 { while(Button_A==0) {
P0=0x09; //所有都是红灯 P1=0; //关数码管 } }
/******************主程序*******************************/ void main() {
TR0=1; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%6;
EA=1; ET0=1; EX0=1; IT0=1; while(1) {
//启动定时器0 //定时器工作于方式1 //定时器赋初值 //CPU开中断总允许 //开定时中断
//开外部INTO中断 //INT0负跳变触发
/*S1*****A道放行*******/ //S1状态 Time_EW=EW; //90s Time_SN=SN; //90s while(Time_EW>=0) { P0=0x0c; Display(); }
/******A道+30s********/ Time_SN=SNJ; //SNJ=29 Time_EW=EWJ; //EWJ=29
while(Time_EW>=2) { P0=0x0c; Display(); }
/******A道黄灯********/ while(Time_EW>=0) { P0=0x0a; Display(); }
/*S2*****A道左拐******/ //S2状态 Time_SN=SNL; //20 s Time_EW=EWL; //20 s while(Time_EW>=2) { P0=0x80; Display(); }
/******A道黄灯*******/ while(Time_EW>=0) { P0=0x0a; Display(); }
/*S3*****B道放行*****/ //S3状态 Time_EW=EW; //90s Time_SN=SN; //90s while(Time_EW>=2) { P0=0x21; Display(); } /******B道黄灯*******/ while(Time_EW>=0) { P0=0x11; Display(); }
/*S4*****B道左拐*****/ //S4状态 Time_SN=SNL; //20 s Time_EW=EWL; //20 s while(Time_EW>=2) {
相关推荐: