4. 单片机的C51编程技巧
4.1 C51与C 语言 1、Main() {
//通信初始化
SCON=0x40; // 串行口工作方式1 ,TI=0 ,RI=0
TMOD=0x20; //定时器1工作方式2,8位自动重装式,晶振频率 11.0592MHz PCON=0;
TH1=0xFD; //9600bps TL1=0xFD; TR1=1; TI=1;
printf(\通信 }
2、C51的数据类型
bit 0 1
char 8 -128~127 unsigned char 8 0~256
int 16 -32768~32767 unsigned 16 0~65535
long int 32 -231 ~(231-1) unsigned 32 0~(232 -1)
float 32 //在汇编中有24位 例:int a=721 BCD
int a=0721 8 int a=0xFF Hex
3、C51的函数
int j 全局变量 void fun( ) {
int i; }
4.2 C语言中常用的语句(也适合于C51)
①if (条件) { }
② if( )
else if( ) else
③switch(条件式)
{ case: 值1
break;
case: 值2 break; ??.. }
④while(条件)
{ 动作 先条件 后内容 } ⑤ do
{先内容 后条件
}while(条件)
⑥for(算式1;算式2;算式3) // (赋植;条件;增量)
{
}
例1: for(i=0;i<10;i++)
{
动作 }
例2:for( ; ; );//C语言认为合法
例3:i=0;
for(;i<10;i++)
{ }
4.3 指针与数组
char *a; char ab; a=&ab;
char 名[ ][ ][ ](三维)
void dalay(unsigned int count ) {
unsigned int I;
for(i=0;i } } main( ) { dalay(100); } 4.4 语言中按地址传递 void demo(char buf[10]) { char i; for(1=0;i<10;i++) { buf[i]=0; } } main( ) { char dat[10]; demo(dat); } 4.5 前置处理器 #define 宏定义 C语言优先处理 #define 宏包含 # 条件编辑 #define 宏名 字符串 例:#define PI 3.1415926 #define CS P1.0 #HIBYTE(a) ((unsigned char ((a))>>8)) unsigned char b; 例:b=HIBYTE(0xFF18) 结果:b=0xFF18 宏定义可以定义函数 #define F(x) (x)*(x)+2x*(x)+1 4.6 C51的存储器类型 1、复习 FFFFHFFFFH外部FFH1000H0FFFH内部(EA=1)0000H 80H70H0FFFH外部(EA=0)0000H00H SFR特殊功能 寄存器外部RAM(I/O)64KB内部RAM0000H外部数据存储器内部数据存储器程序存储器(a) 51系列存储器配置 FFFFHFFFFH外部FFH2000H1FFFH内部(EA=1)0000H 外部RAM(I/O)64KB 内部RAM SFR特殊功能 寄存器80H70H1FFFH外部(EA=0)0000H00H0000H外部数据存储器 程序存储器(b)52系列存储器配置 FFHFFHF0HE0HD0HC8HB8H特殊功能寄存B0HA8H器 SFRA0H98H90H88H80H80H仅8032/8052有 SFR中可寻址位数据缓冲区30H2FH 位寻址区~四个工作寄存器20H1FHR73区(8字节)18HR017HR72区(8字节)10HR0R70FH1区(8字节)08HR007HR70区(8字节)R000H~~~每个区8个工作寄存器R0~R7内部数据存储器图4.1 存储体结构 2、code 说的变量在程序空间 data 内 0~7F idata 内 @R0 ~R 0~FF 256 bdata 可位寻址 16bit 80H pdata R0 R1间接寻址0~0xFF xdata 外64K全部空间 0~0xFFFF 例1:unsigned char code lable[ ]={1,2,3,?.,100}; unsigned char data i; unsigned char bdata status; sbit st_7 =status^7; sbit st_6=status^6; sbit st_0=status^0; status=0; st_7=1; status=0x80; 3、sfr psw=0xDO; sfr P0=0x80; sbit P0_1=P0^1; unsigned char address _at_0x20; int i; 4、C51中指令的控制存储模式选择 small 0x00~0x7FH compact int pdata i; large int cdata 4.7 中断函数在C51中实现 INT0 0 0x0003 Time/Counter0 1 0x000B INT1 2 0x0013 Time/Counter1 3 0x001B Serial port 4 0x0023 Void 函数名(void)interrupt 中断号 缓存器库 例:void TIMER0(void) interrupt 1 using 2 { } main( ) { ETO=1; EA=1; } 4.8 几个编程实例 例1:串行接口发送程序 #include “AT89x51.h” main() { int i; SCON=0x52; // 串行口工作方式1 ,TI=1 ,RI=0