单片机C语言
1970/01/01 19:05 点击:490 / 回复:0
单片机C语言
一》宏定义:
1、不带参数:
#define 标识符常量表达式
/*#define是宏定义命令,宏名(标识符)好习惯用大写*/
#define NIL 0x80
#define 标识符常量表达式
/*#define是宏定义命令,宏名(标识符)好习惯用大写*/
#define NIL 0x80
2、带参数:/*相当于小函数*/
#define 宏名(参数表) 字符串
/*不仅要时行字任串替换还要进行参数的替换,在宏定义时,宏名与带参数的括弧之间不应该加空格,否则将空格以后的字符串都作为替代字符串的一部分,这可是很容易出错的*/
如:#define SQ(a,b) a*b
使用:x=12;y=10;area=SQ(x,y);/*则area=12*10=120*/
#define 宏名(参数表) 字符串
/*不仅要时行字任串替换还要进行参数的替换,在宏定义时,宏名与带参数的括弧之间不应该加空格,否则将空格以后的字符串都作为替代字符串的一部分,这可是很容易出错的*/
如:#define SQ(a,b) a*b
使用:x=12;y=10;area=SQ(x,y);/*则area=12*10=120*/
二》文件包含:
#include <文件名>或#include "文件名"
/*在C中用双引用形式更保险,在C51中常用物是尖括弧形式*/
/*在C中用双引用形式更保险,在C51中常用物是尖括弧形式*/
三》条件编译:
/*一般源程序中的所有程序行都参加编译,但有时希望对其中一部分内容只在满足一定条件下才进行编译,也就是对一部分内容指定编译的条件。*/
/*一般源程序中的所有程序行都参加编译,但有时希望对其中一部分内容只在满足一定条件下才进行编译,也就是对一部分内容指定编译的条件。*/
#if、#elif、 #else、#endif、#ifdef、#ifndef
/*选择不同的编译范围,产生不同的代码,提供通用性。*/
/*如对8051在6MHZ与12MHZ下有*/
#ifdef cpu==8051
#define FREQ 6 /*程序段*/
#else
#define FREQ 12/*程序段*/
#endif
/*这样下面的原程序不用做任何修改便可以使用于两种时钟频率的单片机系统*/
/*选择不同的编译范围,产生不同的代码,提供通用性。*/
/*如对8051在6MHZ与12MHZ下有*/
#ifdef cpu==8051
#define FREQ 6 /*程序段*/
#else
#define FREQ 12/*程序段*/
#endif
/*这样下面的原程序不用做任何修改便可以使用于两种时钟频率的单片机系统*/
四》其他:
1、#error:捕捉不可预料的编译条件
#if (myv!=0&&myv!=1)/*假定其值必为0或1*/
#error myv must be 1 or 0/*出错时显示*/
#endif
2、#pragma:用于在程序中向编译器传送各种编译控制命令
#pragma 编译命令序列
/*例:想按如下命令编译ex.c c51 ex.c debug cod large可用:*/
#pragma DB CD LA
#pragma disable
/*禁止中断*/
1、#error:捕捉不可预料的编译条件
#if (myv!=0&&myv!=1)/*假定其值必为0或1*/
#error myv must be 1 or 0/*出错时显示*/
#endif
2、#pragma:用于在程序中向编译器传送各种编译控制命令
#pragma 编译命令序列
/*例:想按如下命令编译ex.c c51 ex.c debug cod large可用:*/
#pragma DB CD LA
#pragma disable
/*禁止中断*/
单片机C语言之二
一》数据类型:
char int long
1:unsinged 0~255 0~65535 0~4294967295
2:signed -128~127 -32768~32767 -2147483648~2147483647
char int long
1:unsinged 0~255 0~65535 0~4294967295
2:signed -128~127 -32768~32767 -2147483648~2147483647
指针:* 3字节
位标量: sbit
特殊功能寄存器:sfr
16位特殊功能寄存器:sfr16 占2个内存单元,0~65535
可寻址位:sbit利用他可访问51单片机的内部RAM中的可寻址位或特殊功能寄存器中的可寻址位
sfr P0=0x80;
sbit P0_1=P0︿1;
/*将P0口的口地址定义为80H,将P0.1位定义为P1_1*/
特殊功能寄存器:sfr
16位特殊功能寄存器:sfr16 占2个内存单元,0~65535
可寻址位:sbit利用他可访问51单片机的内部RAM中的可寻址位或特殊功能寄存器中的可寻址位
sfr P0=0x80;
sbit P0_1=P0︿1;
/*将P0口的口地址定义为80H,将P0.1位定义为P1_1*/
二》数据存贮类型
表1. C51数据存贮类型
━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━
数据存贮类型┃ 与存贮空间的对应关系
━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━
data ┃ 直接寻址片内数据存贮区,访速度快
bdata ┃ 可位寻址片内数据存贮区,允许位与字节混合访问
idata ┃ 间接寻址片内数据存贮区,可访问片内全部RAM地址空间
pdata ┃ 分页寻址片外数据存贮区(256字节)由MOVX @R0访问
xdata ┃ 片外数据存贮区(64K),由MOVX @DPTR访问
code ┃ 代码存贮区(64K),由MOVC @DPTR访问
━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━
变量的存贮类型定义:
char data var
/*字符变量var被定义为data存贮类型,C51编译器将把该变量定位在51单片机片内数据区存贮区中*/
bit bdata flag
/*位变量flag被定义为bdata存贮类型,C51编译器将把该变量定位在51单片机片内数据区存贮区(RAM)中的位寻址区:20H--2FH*/
表1. C51数据存贮类型
━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━
数据存贮类型┃ 与存贮空间的对应关系
━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━
data ┃ 直接寻址片内数据存贮区,访速度快
bdata ┃ 可位寻址片内数据存贮区,允许位与字节混合访问
idata ┃ 间接寻址片内数据存贮区,可访问片内全部RAM地址空间
pdata ┃ 分页寻址片外数据存贮区(256字节)由MOVX @R0访问
xdata ┃ 片外数据存贮区(64K),由MOVX @DPTR访问
code ┃ 代码存贮区(64K),由MOVC @DPTR访问
━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━
变量的存贮类型定义:
char data var
/*字符变量var被定义为data存贮类型,C51编译器将把该变量定位在51单片机片内数据区存贮区中*/
bit bdata flag
/*位变量flag被定义为bdata存贮类型,C51编译器将把该变量定位在51单片机片内数据区存贮区(RAM)中的位寻址区:20H--2FH*/
三》typedef:重新定义数据类型
typedef 已有数据类型新的数据类型
typedef int word;
/*将word定义为整型*/
word i,j;
/*将i,j定义为整型*/
typedef int word;
/*将word定义为整型*/
word i,j;
/*将i,j定义为整型*/
四》位运算符:
━━━━┳━━━━━┳━━━━━┳━━━━━━┳━━━━━━┳━━━━━━
~ ┃ & ┃ | ┃ ︿ ┃ << ┃ >>
━━━━╋━━━━━╋━━━━━╋━━━━━━╋━━━━━━╋━━━━━━
按位取反┃ 按位与 ┃ 按位或┃按位异或 ┃ 左移 ┃ 右移
━━━━┻━━━━━┻━━━━━┻━━━━━━┻━━━━━━┻━━━━━━
━━━━┳━━━━━┳━━━━━┳━━━━━━┳━━━━━━┳━━━━━━
~ ┃ & ┃ | ┃ ︿ ┃ << ┃ >>
━━━━╋━━━━━╋━━━━━╋━━━━━━╋━━━━━━╋━━━━━━
按位取反┃ 按位与 ┃ 按位或┃按位异或 ┃ 左移 ┃ 右移
━━━━┻━━━━━┻━━━━━┻━━━━━━┻━━━━━━┻━━━━━━
对移位:如<< ,a<<2,即为将二进制的a左移两位,若a=0x8f,即10001111,a=a<<2,将导致a=0x3c(00111100),右边补零。
五》条件运算符:
逻辑表达式?表达式1:表达式2
逻辑表达式?表达式1:表达式2
六》指针与地址运算符:
*取内容 &取地址
*取内容 &取地址
七》强制类型转换:(类型)=表达式
(char *)0xb000
(char *)0xb000
八》sizeof 取数据类型、变量以及表达式的字节数的运算符;
九》continue:中断语句:结束本次循环。
单片机C语言之三
函数:
一》中断服务函数与寄存器组定义:
一》中断服务函数与寄存器组定义:
函数类型函数名(形式参数表) [interrupt n][using n]
n为中断号,0~31:
━━━━┳━━━━━┳━━━━━
中断编号┃ 中断向量┃入口地址
━━━━╋━━━━━╋━━━━━
0 ┃ 外中断0 ┃ 0003H
━━━━╋━━━━━╋━━━━━
1 ┃ 定时器0 ┃ 000BH
━━━━╋━━━━━╋━━━━━
2 ┃ 外中断1 ┃ 0013H
━━━━╋━━━━━╋━━━━━
3 ┃ 定时器1 ┃ 001BH
━━━━╋━━━━━╋━━━━━
4 ┃ 串行口 ┃ 0023H
━━━━┻━━━━━┻━━━━━
后面的n指的是四个工作寄存器组的一个:0~3
对函数目标代码影响如下:
在函数入口处将当前工作寄存器组保护到堆栈中;指定的工作寄存器内容不会改变,函数返回前将被保护的工作寄存器组从堆栈中恢复!
例(定时1ms):
n为中断号,0~31:
━━━━┳━━━━━┳━━━━━
中断编号┃ 中断向量┃入口地址
━━━━╋━━━━━╋━━━━━
0 ┃ 外中断0 ┃ 0003H
━━━━╋━━━━━╋━━━━━
1 ┃ 定时器0 ┃ 000BH
━━━━╋━━━━━╋━━━━━
2 ┃ 外中断1 ┃ 0013H
━━━━╋━━━━━╋━━━━━
3 ┃ 定时器1 ┃ 001BH
━━━━╋━━━━━╋━━━━━
4 ┃ 串行口 ┃ 0023H
━━━━┻━━━━━┻━━━━━
后面的n指的是四个工作寄存器组的一个:0~3
对函数目标代码影响如下:
在函数入口处将当前工作寄存器组保护到堆栈中;指定的工作寄存器内容不会改变,函数返回前将被保护的工作寄存器组从堆栈中恢复!
例(定时1ms):
#include
sbit P1_0=P1︿0;
sbit P1_0=P1︿0;
void timer0(void) interrupt 1 using 1{
P1_0=!P1_0;
TH0=-(1000/256);
TL0=-(1000%256);
}
main(){
SP=0x60;
P1_0=0;
TMOD=0X01;
TH0=-(1000/256);
TL0=-(1000%256);
EA=1;
ET0=1;
TR0=1;
do{}while(1);
}
P1_0=!P1_0;
TH0=-(1000/256);
TL0=-(1000%256);
}
main(){
SP=0x60;
P1_0=0;
TMOD=0X01;
TH0=-(1000/256);
TL0=-(1000%256);
EA=1;
ET0=1;
TR0=1;
do{}while(1);
}
/* 注意:
1、如果中断函数中用到浮点运算,必须保存浮点寄存器的状态。(在math.h中保存浮点寄存器函数为pfsave, 恢复浮点寄存器的状态函数为fprestore)
2、如果在中断函数中调用了其他函数,则被调函数所使用的工作寄存器组与中断函数的一致!
*/
1、如果中断函数中用到浮点运算,必须保存浮点寄存器的状态。(在math.h中保存浮点寄存器函数为pfsave, 恢复浮点寄存器的状态函数为fprestore)
2、如果在中断函数中调用了其他函数,则被调函数所使用的工作寄存器组与中断函数的一致!
*/
单片机C语言之四
一、局部变量与全局变量(外部变量):
1、全局变量若不在开头定义则加extern
2、全局变量会使代码长,占用内存多
2、全局变量会使代码长,占用内存多
二、存储方式:
自动变量(auto):缺省,函数调用存在,退出消失。
自动变量(auto):缺省,函数调用存在,退出消失。
内部变量静态变量(static):static int a=5;始终存在,退出不消失,但不能访问。
寄存器变量(register):速度最快。通常只给编译器一个建议,由编译器根
据实际情况确定。(见下)
据实际情况确定。(见下)
变量全局变量(global):
外部变量
静态变量(static):
外部变量
静态变量(static):
文章:lizhihong [1970/01/01 19:05]
评论