1、单片机高级语言C51程序设计1单片机高级语言C51程序设计2一.C51语言的特点及其程序结构 1.C51特点 2.C51程序结构二.C51语言的标识符和关键字 1.C51扩展的标识符 2.C51扩展的关键字三.C51的数据类型及运算符 1.基本数据类型的长度 2.C51语言的扩展 3.特殊功能寄存器的数据类型 4.DATA存储类型 5.BDATA存储类型 6.IDATA 存储类型 7.PDATA和XDATA 存储类型 8.PDATA和XDATA 比较单片机高级语言C51程序设计3 9.CODE存储类型 10.存储模式 11.指针 11.1.通用指针 11.2.存储器指针 11.3.存储器指针和
2、通用指针的比较四.编译预处理命令 1.C51的STDIO.H 2.C51的REG51.H(1)五.C51语言的程序流程控制 1.IF语句 2.SWITCH CASE语句 3.While和 do while 循环语句 4.For 循环语句单片机高级语言C51程序设计4六.函数 1.函数格式 2.重入函数 3.中断服务函数七.C51程序设计举例 1.例1-求数学式 2.例2-简单控制 3.例3-延时 4.例4-使用定时器0定时-查询方式 5.例5-使用定时器0定时-中断方式 6.例6-利用定时器1计数 7.C51开发环境 7.1.伟福模拟软件 7.2.uVision3集成开发环境 7.3.C51编
3、译练习程序TEXT.C单片机高级语言C51程序设计5八.C51的应用 1.8051串行口扩展LED显示器接口与应用 2.DAC转换的接口与应用 3.ADC0809应用举例九.课本例题简介 1.例8-2 2.例8-5 3.例8-7 4.例8-8十.加一减一综合实践C51程序设计单片机高级语言C51程序设计6单片机高级语言C51程序设计7单片机高级语言C51程序设计8单片机高级语言C51程序设计9char data a,b,c,d;main()a=2;b=a;等效b=(a)c=a+b;等效c=(a+b)C51程序经WAVE6000编译后,点窗口-CPU窗口产生的界面:a/08Hb/09Hc/0AH
4、变量a,b,c分别对应于内部数据存储器地址08H,09H,0AH.单片机高级语言C51程序设计10单片机高级语言C51程序设计11单片机高级语言C51程序设计12单片机高级语言C51程序设计13单片机高级语言C51程序设计14单片机高级语言C51程序设计15单片机高级语言C51程序设计16单片机高级语言C51程序设计17单片机高级语言C51程序设计18单片机高级语言C51程序设计19单片机高级语言C51程序设计20单片机高级语言C51程序设计21单片机高级语言C51程序设计22单片机高级语言C51程序设计23单片机高级语言C51程序设计24单片机高级语言C51程序设计25单片机高级语言C51程
5、序设计26单片机高级语言C51程序设计271.绝对宏#include /加进包含文件#define ADC0809 XBYTE0X7FF8 /定义一个绝对地址rval=CBYTE0X006;/对一个绝对地址(字节)进行读rval=XWORD0X002;/对一个绝对地址(字)进行读DBYTE0X0002=5;/对一个绝对地址(字节)进行写PWORD0X002=57;/对一个绝对地址(字)进行写单片机高级语言C51程序设计282._at_关键字char xdata ADC0809;/定义一个变量ADC0809_at_0 xFFF8;/将某变量固定在某地址上单片机高级语言C51程序设计29单片机高级
6、语言C51程序设计30单片机高级语言C51程序设计31单片机高级语言C51程序设计32单片机高级语言C51程序设计33单片机高级语言C51程序设计34单片机高级语言C51程序设计35单片机高级语言C51程序设计36单片机高级语言C51程序设计37单片机高级语言C51程序设计38单片机高级语言C51程序设计39单片机高级语言C51程序设计40单片机高级语言C51程序设计41单片机高级语言C51程序设计42单片机高级语言C51程序设计43单片机高级语言C51程序设计44单片机高级语言C51程序设计45格式:Alien 返回类型 函数名(参数表)编译属性重入属性中断属性寄存器组属性 Alien-用A
7、lien,指示该函数按PL/M51函数的方式进行参数传递;缺省按C51方式进行。返回类型-增加了bit型,缺省,函数返回int(不是void)。函数名-大小写敏感,最多256字符。一般使用字母、数字、下划线,但数字不能打头。参数表-最多32个参数。编译属性-small、compact、large三种。重入属性-用reertrant说明该函数按可重入函数进行处理,缺省则说明该函数为不可重入函数。中断属性-用“interrupt 中断编号”说明该函数是中断函数,缺省则说明该函数为非中断函数。寄存器组属性-用“using 工作寄存器组编号“说明所用的寄存器组号,缺省则说明使用寄存器组0。单片机高级语
8、言C51程序设计46单片机高级语言C51程序设计47单片机高级语言C51程序设计481.例1-求数学式单片机高级语言C51程序设计49 void main()delay(10);单片机高级语言C51程序设计50单片机高级语言C51程序设计51单片机高级语言C51程序设计52单片机高级语言C51程序设计53单片机高级语言C51程序设计54单片机高级语言C51程序设计55单片机高级语言C51程序设计56 运行WAVE6000软件(要先装KEIL编译器);新建一.C源程序并保存;新建一项目(文件-新建项目),然后自动分三步进行:A)、加入模块文件。选择.C文件再打开。B)、加入包含文件。如果没有包含
9、文件(源程序#INCLUDE所包含的所有文件)。C)、保存项目。在打开的窗口中输入项目名称(名称可自定,扩展名.PRJ可不加,软件会自动添加)。编译调试。(其它的设置同汇编程序)单片机高级语言C51程序设计577.2.uVision3集成开发环境集成开发环境单片机高级语言C51程序设计58uVision3集成开发环境操作步骤集成开发环境操作步骤 运行KEIL 51软件;新建一.C的源程序并保存;新建一项目(文件-新建-新建过程),接着选择所要的单片机(如AT89C51);然后加入一.C的源程序(如右图);单片机高级语言C51程序设计59 做必要的设置,编译后生成.HEX文件(如右图,下方图中应
10、选中产生.HEX文件);编译调试。单片机高级语言C51程序设计60单片机高级语言C51程序设计61单片机高级语言C51程序设计62单片机高级语言C51程序设计63org 0000hstart:mov p1,#00hmov p0,#0ffhstl:jb p0.0,$jnb p0.0,$cpl p1.0 sjmp stl end单片机高级语言C51程序设计64#include sbit P00=P00;sbit P10=P10;void delay(unsigned char n)unsigned char i,j;for(i=0;in;i+)for(j=0;j125;j+);void main(
11、)P1=0X00;while(1)if(P00=0)delay(10);if(P00=0)while(!P00);P10=!P10;单片机高级语言C51程序设计65单片机高级语言C51程序设计66单片机高级语言C51程序设计67单片机高级语言C51程序设计68单片机高级语言C51程序设计69单片机高级语言C51程序设计70单片机高级语言C51程序设计71单片机高级语言C51程序设计72单片机高级语言C51程序设计73单片机高级语言C51程序设计74#include#include#define ADC0809 XBYTE0X7FF8/char xdata ADC0809;ADC0809_at_
12、0 xFFF8;/要分两句写unsigned char code buf16=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90,0 x88,0 x83,0 xC6,0 xA1,0 x86,0 x8E;unsigned char data temp,wei1,wei2;sbit P34=P34;sbit P35=P35;sbit P25=P25;sbit P26=P26;单片机高级语言C51程序设计75void delay(unsigned char n)unsigned char i,j;for(i=0;in;i+)for(
13、j=0;j4;P1=bufwei1;P35=1;delay(2);P35=0;P1=bufwei2;P34=1;delay(2);P34=0;单片机高级语言C51程序设计76void main()TH1=255;TL1=31;TMOD=0X00;ET1=1;EA=1;TR1=1;while(1)ADC0809=0;/XBYTE0X7FF8=0;/可用 while(P25=0);while(P25=1);temp=ADC0809;/temp=XBYTE0X7FF8;/可用 display();单片机高级语言C51程序设计77void t11()interrupt 3TH1=255;TL1=31;
14、P26=!P26;单片机高级语言C51程序设计78地址有锁存单片机高级语言C51程序设计79单片机高级语言C51程序设计80单片机高级语言C51程序设计81单片机高级语言C51程序设计82单片机高级语言C51程序设计83单片机高级语言C51程序设计84单片机高级语言C51程序设计85单片机高级语言C51程序设计86按课本图7-14输出正弦波单片机高级语言C51程序设计87单片机高级语言C51程序设计88单片机高级语言C51程序设计89单片机高级语言C51程序设计90单片机高级语言C51程序设计91单片机高级语言C51程序设计92 用如下的电路图,实现:按“加一”按钮显示加“1”,按“加二”按钮
15、显示加“2”,按“减一”按钮显示减“1”,按“减二”按钮显示减“2”;计数的最大值为19,最小值为0;按“清0”按钮显示“0”(清0)。单片机高级语言C51程序设计93单片机高级语言C51程序设计94#includereg51.h/头文件#includemath.h/头文件unsigned char code disp_code10=0 x3F,/0 0 x06,/1 0 x5B,/2 0 x4F,/3 0 x66,/4 0 x6D,/5 0 x7D,/6 0 x07,/7 0 x7F,/8 0 x6F,/9;单片机高级语言C51程序设计95/定义sbitP20=P20;sbitP21=P21
16、;sbitP22=P22;sbitP23=P23;sbitP36=P36;unsigned int count;/定义计数变量void delay(unsigned char n)/延时子程序unsigned char i,j;for(i=0;in;i+)for(j=0;i125;i+);单片机高级语言C51程序设计96void initial()/初始化程序EA=1;EX0=1;EX1=1;IT1=1;/选择INT1为脉冲触发方式 IT0=1;TMOD=0 x66;/T1模式2,自动重装TH1=TL1=TH0=TL0=0 xff;/计数一次中断ET1=ET0=1;TR1=TR0=1;单片机高
17、级语言C51程序设计97display()/显示子程序 unsigned int temp;unsigned char disp_c4,i;temp=count;for(i=0;i=19)count=0;else count+;void count_interrupt1()interrupt 1 /T0中断子程序if(count=19)count=0;else count=count+2;单片机高级语言C51程序设计100void count_interrupt2()interrupt 2 /外部中断1子程序if(count=1)count=0;else count-;void count_interrupt3()interrupt 3 /T1中断子程序if(count=1)count=0;else count=count-2;单片机高级语言C51程序设计101main()/主程序initial();while(1)q0();/调用清0子程序display();/循环显示