1.对照表:

2.Ox  代表十六进制:

3.增加头文件:

4.延时设置:

打开 STC-ISP下载软件:

A.选择软件延时计数器;

B.选择系统频率;

C.选择定时长度;

D.设置8051指令集所适用的单片机系列:如STC8F/STC8A/STC8G/STC8H

E. 复制代码到编译文件

5.intrins.h函数:

<intrins.h> ——Intrinsic functions for C51
常用函数:
_nop_()              空操作8051 NOP 指令
_crol_()              字符循环左移 
_cror_()             字符循环右移 
_irol_()             整数循环左移 
_iror_()             整数循环右移 
_lrol_()             长整数循环左移 
_lror_()             长整数循环右移

函数原型:
说明:

#ifndef  _A_H             //        “if not define a.h”     如果不存在a.h
#define     _A_H        //        “define a.h”    就引入a.h
#endif                        //        否则不需要引入

此代码为避免头文件重复包含的固定格式

/*--------------------------------------------------------------------------
INTRINS.H

Intrinsic functions for C51.
Copyright (c) 1988-2010 Keil Elektronik GmbH and ARM Germany GmbH
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __INTRINS_H__
#define __INTRINS_H__

#pragma SAVE

#if defined (__CX2__)
#pragma FUNCTIONS(STATIC)
/* intrinsic functions are reentrant, but need static attribute */
#endif

extern void          _nop_     (void);
        /*    空操作指令:延时一个机器周期————直接执行NOP指令;            */
            
extern bit           _testbit_ (bit);
        /*    _testbit_产生一个JBC 指令,该函数测试一个位,当置位时返回1,否则返回0。
            如果该位置为1,则将该位复位为0。8051 的JBC 指令即用作此目的。
            _testbit_只能用于可直接寻址的位;在表达式中使用是不允许的。*/

extern unsigned char _cror_    (unsigned char, unsigned char);
        /*        字符循环右移函数————需要位移的变量———循环右移的位数————
                将char型变量循环右移,移动指定位数后返回;            */
                
extern unsigned int  _iror_    (unsigned int,  unsigned char);
        /*        整数循环右移函数———需要位移的变量——循环右移的位数————
                将int型变量循环右移,移动指定位数后返回;                */
                
extern unsigned long _lror_    (unsigned long, unsigned char);
        /*    长整数循环右移函数———需要位移的变量——循环右移的位数————
            将long型变量循环右移,移动指定位数后返回;                */
extern unsigned char _crol_    (unsigned char, unsigned char);
        /*        字符循环左移函数————需要位移的变量———循环左移的位数————
                将char型变量循环左移,移动指定位数后返回;            */
                
extern unsigned int  _irol_    (unsigned int,  unsigned char);
        /*        整数循环左移函数———需要位移的变量——循环左移的位数————
                将int型变量循环左移,移动指定位数后返回;                */
                
extern unsigned long _lrol_    (unsigned long, unsigned char);
        /*    长整数循环左移函数———需要位移的变量——循环左移的位数————
            将long型变量循环左移,移动指定位数后返回;                */
            
extern unsigned char _chkfloat_(float);
#if defined (__CX2__)
extern int           abs       (int);
extern void          _illop_   (void);
#endif
#if !defined (__CX2__)
extern void          _push_    (unsigned char _sfr);
extern void          _pop_     (unsigned char _sfr);
#endif

#pragma RESTORE

#endif

6.main()函数是如何编译的;
//主函数如下;
void main(void)
{
    while (1)    这是个无条件空循环。    
    {
    }
}
把上面的main()函数编译后的汇编程序和反汇编代码整理后对照如下;

6.Keil C51 main()函数程序的一般结构:

A.

#include  <reg52.h>   //包含特殊功能寄存器库

#include  <stdio.h>   //包含I/O函数库

//..............................................................................

1.预处理命令 //用于包含头文件等

2.全局变量说明; //全局变量可被本程序的所有函数引用

...................................................................................//

B.

//..............................................................................

函数1说明;

... ...

函数n说明;

...................................................................................//

C.

//..............................................................................

void main(void)     //主函数

{

while  (i<=100)     //累加1~100之和在s中

}

/*主函数*/

main(){

局部变量说明; //局部变量只能在所定义的函数内部引用

执行语句;

函数调用(形式参数表);

}

/*其他函数定义*/

函数1(形式参数定义){

局部变量说明; //局部变量只能在所定义的函数内部引用

执行语句;

函数调用(形式参数表);

}

... ...

函数n(形式参数定义){

局部变量说明; //局部变量只能在所定义的函数内部引用

执行语句;

函数调用(形式参数表);

}

..................................................................................//

D.

//..............................................................................

if语句

if语句是C51中的一个基本条件选择语句,它通常有三种格式:

(1)if (表达式) {语句;}

(2)if (表达式) {语句1;}  else  {语句2;}

(3)if (表达式1) {语句1;}

else  if (表达式2) (语句2;)

else  if (表达式3) (语句3;)

……

else  if (表达式n-1) (语句n-1;)

else  {语句n}

【例】  if语句的用法。

(1)if  (x!=y)  printf(“x=%d,y=%d\n”,x,y);

执行上面语句时,如果x不等于y,则输出x的值和y的值。

(2)if  (x>y)  max=x;

else  max=y;

执行上面语句时,如x大于y成立,则把x送给最大值变量max,如x大于y不成立,则把y送给最大值变量max。使max变量得到x、y中的大数。

(3)if  (score>=90)  printf(“Your result is an A\n”);

else  if  (score>=80)  printf(“Your result is an B\n”);

else  if  (score>=70)  printf(“Your result is an C\n”);

else  if  (score>=60)  printf(“Your result is an D\n”);

else  printf(“Your result is an E\n”);

执行上面语句后,能够根据分数score分别打出A、B、C、D、E五个等级。
..................................................................................//

E.

//..............................................................................

switch/case语句

if语句通过嵌套可以实现多分支结构,但结构复杂。switch是C51中提供的专门处理多分支结构的多分支选择语句。它的格式如下:

switch (表达式)

{case  常量表达式1:{语句1;}break;

case  常量表达式2:{语句2;}break;

……

case  常量表达式n:{语句n;}break;

default:{语句n+1;}

说明如下:

(1)switch后面括号内的表达式,可以是整型或字符型表达式。

(2)当该表达式的值与某一“case”后面的常量表达式的值相等时,就执行该“case”后面的语句,然后遇到break语句退出switch语句。若表达式的值与所有case后的常量表达式的值都不相同,则执行default后面的语句,然后退出switch结构。

(3)每一个case常量表达式的值必须不同否则会出现自相矛盾的现象。

(4)case语句和default语句的出现次序对执行过程没有影响。

(5)每个case语句后面可以有“break”,也可以没有。有break语句,执行到break则退出switch结构,若没有,则会顺次执行后面的语句,直到遇到break或结束。

(6)每一个case语句后面可以带一个语句,也可以带多个语句,还可以不带。语句可以用花括号括起,也可以不括。

(7)多个case可以共用一组执行语句。

【例】 switch/case语句的用法。

对学生成绩划分为A~D,对应不同的百分制分数,要求根据不同的等级打印出它的对应百分数。可以通过下面的switch/case语句实现。

……

switch(grade)

{
case  ‘A’;printf(”90~100\n”);break;

case  ‘B’;printf(”80~90\n”);break;

case  ‘C’;printf(”70~80\n”);break;

case  ‘D’;printf(”60~70\n”);break;

case  ‘E’;printf(”<60\n”);break;

default;printf(”error”\n)

}

..................................................................................//

F.

//..............................................................................

while语句

while语句在C51中用于实现当型循环结构,它的格式如下:

while(表达式)

{语句;}  /*循环体*/

while语句后面的表达式是能否循环的条件,后面的语句是循环体。当表达式为非0(真)时,就重复执行循环体内的语句;当表达式为0(假),则中止while循环,程序将执行循环结构之外的下一条语句。它的特点是:先判断条件,后执行循环体。在循环体中对条件进行改变,然后再判断条件,如条件成立,则再执行循环体,如条件不成立,则退出循环。如条件第一次就不成立,则循环体一次也不执行。

【例】  下面程序是通过while语句实现计算并输出1~100的累加和。

#include  <reg52.h>   //包含特殊功能寄存器库

#include  <stdio.h>   //包含I/O函数库

void main(void)     //主函数

{
int  i,s=0;       //定义整型变量x和y

i=1;

SCON=0x52;       //串口初始化

TMOD=0x20;

TH1=0XF3;

TR1=1;

while  (i<=100)     //累加1~100之和在s中

{
s=s+i;

i++;

}

printf(“1+2+3……+100=%d\n”,s);

while(1);

}

程序执行的结果:

1+2+3……+100=5050

..................................................................................//

G

//..............................................................................

do  while语句

do  while语句在C51中用于实现直到型循环结构,它的格式如下:

do

{语句;}           /*循环体*/

while(表达式);

它的特点是:先执行循环体中的语句,后判断表达式。如表达式成立(真),则再执行循环体,然后又判断,直到有表达式不成立(假)时,退出循环,执行do  while结构的下一条语句。do  while语句在执行时,循环体内的语句至少会被执行一次。

【例】 通过do  while语句实现计算并输出1~100的累加和。

#include  <reg52.h>  //包含特殊功能寄存器库

#include  <stdio.h>   //包含I/O函数库

void main(void)       //主函数

{
int  i,s=0;           //定义整型变量x和y

i=1;

SCON=0x52;       //串口初始化

TMOD=0x20;

TH1=0XF3;

TR1=1;

do                  //累加1~100之和在s中

{
s=s+i;

i++;

}

while  (i<=100);

printf(“1+2+3……+100=%d\n”,s);

while(1);

}

..................................................................................//

J.

//..................................................................................

for语句

for(表达式1;表达式2;表达式3)

{语句;}  /*循环体*/

for语句后面带三个表达式,它的执行过程如下:

(1)先求解表达式1的值。

(2)求解表达式2的值,如表达式2的值为真,则执行循环休中的语句,然后执行下一步(3)的操作,如表达式2的值为假,则结束for循环,转到最后一步。

(3)若表达式2的值为真,则执行完循环体中的语句后,求解表达式3,然后转到第四步。

(4)转到(2)继续执行。

(5)退出for循环,执行下面的一条语句。

在for循环中,一般表达式1为初值表达式,用于给循环变量赋初值;表达式2为条件表达式,对循环变量进行判断;表达式3为循环变量更新表达式,用于对循环变量的值进行更新,使循环变量能不满足条件而退出循环。

【例】 用for语句实现计算并输出1~100的累加和。

#include  <reg52.h>    //包含特殊功能寄存器库

#include  <stdio.h>     //包含I/O函数库

void main(void)           //主函数

{
int  i,s=0;                      //定义整型变量x和y

SCON=0x52;                //串口初始化

TMOD=0x20;

TH1=0XF3;

TR1=1;

for (i=1;i<=100;i++)  s=s+i;     //累加1~100之和在s中

printf(“1+2+3……+100=%d\n”,s);

while(1);

}

..................................................................................//

K.

//..................................................................................

循环的嵌套

在一个循环的循环体中允许又包含一个完整的循环结构,这种结构称为循环的嵌套。外面的循环称为外循环,里面的循环称为内循环,如果在内循环的循环体内又包含循环结构,就构成了多重循环。在C51中,允许三种循环结构相互嵌套。

【例】用嵌套结构构造一个延时程序。

void  delay(unsigned  int  x)

{
unsigned  char j;

while(x--)

{for (j=0;j<125;j++);}

}

..................................................................................//

L.

//..................................................................................

break和continue语句

break和continue语句通常用于循环结构中,用来跳出循环结构。但是二者又有所不同,下面分别介绍。

1).break语句

前面已介绍过用break语句可以跳出switch结构,使程序继续执行switch结构后面的一个语句。使用break语句还可以从循环体中跳出循环,提前结束循环而接着执行循环结构下面的语句。它不能用在除了循环语句和switch语句之外的任何其它语句中。

【例19】下面一段程序用于计算圆的面积,当计算到面积大于100时,由break语句跳出循环。

for (r=1;r<=10;r++)

{
area=pi*r*r;

if (area>100) break;

printf(“%f\n”,area);

}

2).continue语句

continue语句用在循环结构中,用于结束本次循环,跳过循环体中continue下面尚未执行的语句,直接进行下一次是否执行循环的判定。

continue语句和break语句的区别在于:continue语句只是结束本次循环而不是终止整个循环;break语句则是结束循环,不再进行条件判断。

【例20】  输出100~200间不能被3整除的数。

for (i=100;i<=200;i++)

{
if  (i%3= =0)  continue;

printf(“%d  ”;i);

}

在程序中,当i能被3整除时,执行continue语句,结束本次循环,跳过printf()函数,只有能被3整除时才执行printf()函数。

8.  return语句

return语句一般放在函数的最后位置,用于终止函数的执行,并控制程序返回调用该函数时所处的位置。返回时还可以通过return语句带回返回值。return语句格式有两种:

(1)return;

(2)return (表达式);

如果return语句后面带有表达式,则要计算表达式的值,并将表达式的值作为函数的返回值。若不带表达式,则函数返回时将返回一个不确定的值。通常我们用return语句把调用函数取得的值返回给主调用函数。

载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wangjiaweiwei/article/details/105311367

..................................................................................//

H.

//..................................................................................

..................................................................................//

51 单片机 程序编写相关推荐

  1. 编写51单片机程序,输出方波,at89s52的单片机

    编写51单片机程序,输出方波. 要求:晶振为12MHz,用T0做定时器,在P1的低四位输出四种频率的方波: P1.3 = 1.25kHz.P1.2 = 2.5kHz.P1.1 = 5kHz.P1.0 ...

  2. c语言T1中断程序编写步骤,用51单片机中断编写的4x4键盘程序

    当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章 用51单片机中断编写的4x4键盘程序 作者:未知   来源:山涧一溪流   点击数:-  更新时间:2014年06 ...

  3. 51单片机程序下载、ISP及串口基础知识

    本文详细介绍了串口.51单片机的ISP下载等基础知识,已经学过单片机的也可以看看,加强一下对这方面的了解. 串口 串行接口简称串口,也称串行通信接口,是采用串行通信方式的扩展接口. 我们比较熟悉的US ...

  4. 用计算机控制单片机的程序编写,单片机程序编写步骤

    单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上.相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备.概括的讲:一块芯片就成了一台计算机.它的体 ...

  5. 51单片机程序开发入门知识

    51单片机在我的理解上来说,就是遵循51指令集工作的芯片.他就像一台超微型的电脑,里面有内存.硬盘.CPU等基本配备. 而他所谓的CPU使用的就是51指令集,他的硬盘就是内置的Flash,他的内存也是 ...

  6. Windows 7 64位用STC ISP下载51单片机程序的方法

    Windows 7 64位用STC ISP下载51单片机程序的方法2011-09-08 14:17 1  首先在宏晶的主页 http://www.stcmcu.com/ 下载最新的 STC-ISP.E ...

  7. c语言键盘中断扫描码,用51单片机中断编写的4x4键盘程序

    应用查询扫描编写键盘程序,由于要给按键去抖动,程序变得比较复杂和冗长(详见2013年9月29日博文<MSP430和AT89C51单片机4x4键盘C程序>),如果用中断编写,设置中断响应在下 ...

  8. 【ChatGPT】使用ChatGPT进行51单片机程序编程体验

    背景 最近ChatGPT大火,笔者尝试使用它进行了51单片机编程尝试.ChatGPT是一种由OpenAI训练的大型语言模型,具有强大的自然语言处理能力和生成代码的能力. 使用ChatGPT进行51单片 ...

  9. 51单片机程序及调试步骤实战经验

    我刚参加工作的时候,用的是stc 51单片机的,51单片机不像stm32那样可以通过st-link在keil上面在线仿真. 有时候出现bug的时候,非常难找问题,要一段一段屏蔽然后测试. 在刚开始接触 ...

  10. 51单片机c语言程序执行顺序,51单片机程序执行流程详细分析

    这里是一个循环,根据DJNZ指令的功能:每执行一次DJNZ RO, IDATALOOP就将R0的值减1,若R0的值不为0则就跳到IDATALOOP地址去.很显然这是一个循环,那么RO的值是多少呢,在以 ...

最新文章

  1. DHCP配置与DHCP中继代理2
  2. JS实现网易云轮播效果图
  3. 在PHP当中制作隔行换色的效果以及制作上下翻页的效果!
  4. python(十七)
  5. golang channel错误 send to non-chan type int/string
  6. 自学python推荐书籍2019-入门必看 | 大佬们推荐的Python书单汇总
  7. Python学习笔记:匿名函数
  8. 如何做好性能压测(一)丨压测环境设计和搭建
  9. OV7725学习之SCCB协议(一)
  10. 计算机网络学习笔记-1.2.2OSI参考模型(1)
  11. 输光200亿,利润暴跌77%!史上最“作死”老字号,还想靠天价翻身?
  12. shell习题第8题:监控nginx的502状态
  13. Linux运维常用命令及知识
  14. Python 寻找完美数
  15. 今天是第几天python_“昔我往矣,杨柳依依。今我来思,雨雪霏霏”全诗赏析
  16. 等到花儿也谢了的await
  17. 计算机前置usb无法使用,电脑前置usb3.0接口没反应怎么办
  18. JavaScript实现网页关灯效果
  19. Functionlan通过星际文件系统免费使用云应用程序
  20. TCP/IP详解之环回接口(loopback interface)

热门文章

  1. matlab 8点fft蝶形图,FFT快速傅里叶变换(蝶形算法)详解精要.ppt
  2. FPGA数字信号处理(27)卷积编码器与Viterbi译码器设计
  3. 清理系统垃圾 bat
  4. 三种坐标系经纬度转化小工具
  5. Latex:IEEE Trans期刊Latex模板下载
  6. 弹性均质圆环法计算过程_盾构隧道衬砌结构内力计算方法的对比浅析
  7. Flash cs3教程-传统数字动画
  8. beetle-j2ee-application-framework框架介绍.md
  9. Themida和Winlicense加壳软件脱壳教程
  10. Handler源码阅读