8051入门未例,代码模板

MCS-51 BASIC源程序

[程序开始处的程序说明]

/*********************************************************************************************
程序名:    
编写人:     
编写时间:  年 月 日
硬件支持:  
接口说明:    
修改日志:  
  NO.1-								
/*********************************************************************************************
说明:

/*********************************************************************************************/



[单片机SFR定义的头文件]

#include <REG51.h> //通用89C51头文件
#include <REG52.h> //通用89C52头文件
#include <STC11Fxx.H> //STC11Fxx或STC11Lxx系列单片机头文件
#include <STC12C2052AD.H> //STC12Cx052或STC12Cx052AD系列单片机头文件
#include <STC12C5A60S2.H> //STC12C5A60S2系列单片机头文件

[更多库函数头定义]

#include <assert.h>    //设定插入点
#include <ctype.h>     //字符处理
#include <errno.h>     //定义错误码
#include <float.h>     //浮点数处理
#include <fstream.h>    //文件输入/输出
#include <iomanip.h>    //参数化输入/输出
#include <iostream.h>   //数据流输入/输出
#include <limits.h>    //定义各种数据类型最值常量
#include <locale.h>    //定义本地化函数
#include <math.h>     //定义数学函数
#include <stdio.h>     //定义输入/输出函数
#include <stdlib.h>    //定义杂项函数及内存分配函数
#include <string.h>    //字符串处理
#include <strstrea.h>   //基于数组的输入/输出
#include <time.h>     //定义关于时间的函数
#include <wchar.h>     //宽字符处理及输入/输出
#include <wctype.h>    //宽字符分类
#include <intrins.h>	//51基本运算(包括_nop_空函数)



[常用定义声明]

sfr  [自定义名] = [SFR地址] ; //按字节定义SFR中的存储器名。例:sfr P1 = 0x90;
sbit  [自定义名] = [系统位名] ; //按位定义SFR中的存储器名。例:sbit Add_Key = P3 ^ 1;
bit [自定义名] ; //定义一个位(位的值只能是0或1)例:bit LED;
#define [代替名]  [原名]  //用代替名代替原名。例:#define LED P1 / #define TA 0x25

unsigned char [自定义名] ; //定义一个0~255的无符号字符型变量。例:unsigned char a;
unsigned int [自定义名] ; //定义一个0~65535的无符号整型变量。例:unsigned int a;



[定义常量和变量的存放位置的关键字]

data	字节寻址片内RAM,片内RAM的128字节(例:data unsigned char a;)
bdata	可位寻址片内RAM,16字节,从0x20到0x2F(例:bdata unsigned char a;)
idata	所有片内RAM,256字节,从0x00到0xFF(例:idata unsigned char a;)
pdata	片外RAM,256字节,从0x00到0xFF(例:pdata unsigned char a;)
xdata	片外RAM,64K字节,从0x00到0xFFFF(例:xdata unsigned char a;)
code	ROM存储器,64K字节,从0x00到0xFFFF(例:code unsigned char a;)




[选择、循环语句]

if(1){

//为真时语句

}else{

//否则时语句

}

--------------------------

while(1){

//为真时内容

}

--------------------------

do{

//先执行内容

}while(1);

--------------------------

switch (a){
	case 0x01:
		//为真时语句
		break;
	case 0x02:
		//为真时语句
		break;
	default:
		//冗余语句
		break;
}

--------------------------

for(;;){

//循环语句

}

--------------------------


[主函数模板]

/*********************************************************************************************
函数名:主函数
调  用:无
参  数:无
返回值:无
结  果:程序开始处,无限循环
备  注:
/**********************************************************************************************/
void main (void){

	//初始程序

	while(1){

		//无限循环程序

	}
}
/**********************************************************************************************/


[中断处理函数模板]
/*********************************************************************************************
函数名:中断处理函数
调  用:无
参  数:无
返回值:无
结  果:
备  注:
/**********************************************************************************************/
void name (void) interrupt 1 using 1{

	//处理内容 
}
/**********************************************************************************************/

[中断入口说明]

interrupt 0 外部中断0(ROM入口地址:0x03)
interrupt 1 定时/计数器中断0(ROM入口地址:0x0B)
interrupt 2 外部中断1(ROM入口地址:0x13)
interrupt 3 定时/计数器中断1(ROM入口地址:0x1B)
interrupt 4 UART串口中断(ROM入口地址:0x23)
(更多的中断依单片机型号而定,ROM中断入口均相差8个字节)

using 0 使用寄存器组0
using 1 使用寄存器组1
using 2 使用寄存器组2
using 3 使用寄存器组3




[普通函数框架]

/*********************************************************************************************
函数名:
调  用:
参  数:无
返回值:无
结  果:
备  注:
/**********************************************************************************************/
void name (void){

//函数内容

}
/**********************************************************************************************/



/*********************************************************************************************
函数名:
调  用:
参  数:0~65535 / 0~255
返回值:0~65535 / 0~255
结  果:
备  注:
/**********************************************************************************************/
unsigned int name (unsigned char a,unsigned int b){

//函数内容

return a; //返回值
}
/**********************************************************************************************/


  1. 占用CPU的延时程序应考虑系统时钟频率,本实验以12.000MHz晶体为例。
  2. 占用CPU的延时程序还需要考虑单片机的机械周期,12T单片机(AT89C51)与1T单片机(STC11F32XE)的延时长度不同。
  3. 请不要使用CPU延时程序作为长时间延时功能使用(如1小时延时)。
  4. 程序中的中断处理将影响延时长度。

可将其模板下载到本地硬盘,在编写新程序的时候复制、粘贴到工程当中,然后根据情况写入具体内容。

  1. 中断处理延时程序应考虑系统时钟频率,本实验以12.000MHz晶体为例。
  2. 中断处理延时程序还需要考虑单片机的机械周期,一般情况下STC的1T单片机与AT89C51的定时器周期兼容。。
  3. 程序中出现其他的中断程序将影响延时准确度。

可将其模板下载到本地硬盘,在编写新程序的时候复制、粘贴到工程当中,然后根据情况写入具体内容。


/*********************************************************************************************
程序名:    占用CPU延时程序应用实例
编写人:    杜洋 
编写时间:  2009年9月23日
硬件支持:  STC12C2052AD 12MHz
接口说明:  P1接口8个LED灯  
修改日志:  
  NO.1-								
/*********************************************************************************************
说明:本程序可使单片机P1.0接口上的LED灯以1秒为周期闪烁。

/*********************************************************************************************/

#include <REG51.h> //通用89C51头文件

sbit LED = P1 ^ 0; //定义闪烁LED

/*********************************************************************************************
函数名:毫秒级CPU延时函数
调  用:DELAY_MS (?);
参  数:1~65535(参数不可为0)
返回值:无
结  果:占用CPU方式延时与参数数值相同的毫秒时间
备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
	unsigned int i;
	while( a-- != 0){
		for(i = 0; i < 600; i++);
	}
}
/*********************************************************************************************/

/*********************************************************************************************/
void main (void){ //主程序 
	while(1){
		LED = ~LED;		//取LED相反状态
		DELAY_MS(1000);	//修改这里的数值看看会有什么变化
	}
}
/*********************************************************************************************/

采用中断延时


data unsigned char cou  = 0;     // 定义软计数器,放在程序最前面的寄存器定义部分 

/**********************************************************************************************/	
void init (void){
    TMOD = 0x11;         // 定时/计数器0,1工作于方式1   
    TH0 = 0x3c;          // 预置产生50ms时基信号   
    TL0 = 0xb0;   
    EA = 1;              // 开总中断   
    ET0 = 1;             // 定时/计数器0允许中断   
    TR0 = 1;             // 开闭定时/计数器0   
}
/**********************************************************************************************/	

/**********************************************************************************************/	
void tiem0(void) interrupt 1{   // T/C0中断服务程序(产生50ms时基信号)   
    if(cou < 1){                 // 计数值到100(1s) (****时间为倒计时****)  
        cou = 20;               // 软计数器清零   
    }   
    cou--;                      // 软计数器加1   
    TH0 = 0x3c;                // 重置定时常数   
    TL0 = 0xb0;   
}
/**********************************************************************************************/



/*********************************************************************************************
函数名:毫秒级CPU延时函数
调  用:DELAY_MS (?);
参  数:1~65535(参数不可为0)
返回值:无
结  果:占用CPU方式延时与参数数值相同的毫秒时间
备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
	unsigned int i;
	while( a-- != 0){
		for(i = 0; i < 600; i++);
	}
}
/*********************************************************************************************/

中断延时程序应用实验


/*********************************************************************************************
程序名:    中断延时程序应用实验
编写人:    杜洋 
编写时间:  2009年9月23日
硬件支持:  STC12C2052AD 12MHz
接口说明:  P1接口8个LED灯  
修改日志:  
  NO.1-								
/*********************************************************************************************
说明:本程序可使单片机P1.0接口上的LED灯以1秒为周期闪烁。

/*********************************************************************************************/

#include <REG51.h> //通用89C51头文件

sbit LED = P1 ^ 0; //定义闪烁LED

data unsigned char cou  = 0;     // 软计数器,对10ms时基信号累加到1s 

/**********************************************************************************************/	
void init (void){
    TMOD = 0x11;         // 定时/计数器0,1工作于方式1   
    TH0 = 0x3c;          // 预置产生50ms时基信号   
    TL0 = 0xb0;   
    EA = 1;              // 开总中断   
    ET0 = 1;             // 定时/计数器0允许中断   
    TR0 = 1;             // 开闭定时/计数器0   
}
/**********************************************************************************************/	

/**********************************************************************************************/	
void tiem0(void) interrupt 1{   // T/C0中断服务程序(产生50ms时基信号)   
    if(cou < 1){                 // 计数值到100(1s) (****时间为倒计时****)  
        cou = 20;               // 软计数器清零  
		LED =~ LED;				//让LED灯闪烁 
    }   
    cou--;                      // 软计数器加1   
    TH0 = 0x3c;                // 重置定时常数   
    TL0 = 0xb0;   
}
/**********************************************************************************************/

/*********************************************************************************************/
void main (void){ //主程序 
	init(); //延时程序(定时器)初始化
	while(1){

		//无限循环程序(可加入其他程序)

	}
}
/*********************************************************************************************/