8051入门未例,代码模板
30 Sep 2022MCS-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; //返回值
}
/**********************************************************************************************/
- 占用CPU的延时程序应考虑系统时钟频率,本实验以12.000MHz晶体为例。
- 占用CPU的延时程序还需要考虑单片机的机械周期,12T单片机(AT89C51)与1T单片机(STC11F32XE)的延时长度不同。
- 请不要使用CPU延时程序作为长时间延时功能使用(如1小时延时)。
- 程序中的中断处理将影响延时长度。
可将其模板下载到本地硬盘,在编写新程序的时候复制、粘贴到工程当中,然后根据情况写入具体内容。
- 中断处理延时程序应考虑系统时钟频率,本实验以12.000MHz晶体为例。
- 中断处理延时程序还需要考虑单片机的机械周期,一般情况下STC的1T单片机与AT89C51的定时器周期兼容。。
- 程序中出现其他的中断程序将影响延时准确度。
可将其模板下载到本地硬盘,在编写新程序的时候复制、粘贴到工程当中,然后根据情况写入具体内容。
/*********************************************************************************************
程序名: 占用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){
//无限循环程序(可加入其他程序)
}
}
/*********************************************************************************************/