单片机c语言学习总结

2025-02-09

单片机c语言学习总结(精选11篇)

1.单片机c语言学习总结 篇一

单片机c语言学习心得

(一)相信很多爱好电子的朋友,对单片机这个词应该都不会陌生了吧。不过有些朋友可能只听说他叫单片机,他的全称是什么也许并不太清楚,更不用说他的英文全称和简称了。单片机是一块在集成电路芯片上集成了一台有一定规模的微型计算机。简称为:单片微型计算机或单片机(Single Chip Computer)。单片机的应用到处可见,应用领域广泛,主要应用在智能仪表、实时控制、通信、家电等方面。不过这一切都没什么关系,因为我(当然也包括任何人)都是从不知道转变成知道的,再转变成精通的。现在我只想把我学习单片机的经历,详细地讲叙给大家听听,可能有些大虾会笑话我,想:那么简单的东西还在这里卖弄。但是你错了,我只是把我个人学习的经历讲述一遍而已,仅仅对那些想学习单片机,但又找不到好方法或者途径的朋友,提供一个帮助,使他们在学习过程中,尽量少走些弯路而已!

首先,你必须有学习单片机的热情,不是说今天去图书馆看了一个下午关于单片机的书,而明天玩上半天,后天就不知道那个本书在讲什么东西了。还是先说说我吧,我从大二的第一个学期期末的时候才开始接触单片机,但在这之前,正如上面所说的:我知道有种芯片叫单片机,但是具体长成什么样子,却一点也不知道!看到这里很多朋友一定会忍不住发笑。嘿嘿,你可千万别笑,有些大四毕业的人也同样不知道单片机长成什么样子呢!而我对单片机的痴迷更是常人所不能想象的地步,大二的期末考试,我全放弃了复习,每当室友拿着书在埋头复习的时候,我却捧着自己从图书馆借的单片机书在那看,虽然有很多不懂,但是我还是坚持了下来,当时我就想过,为了单片机值不值得我这样去付出,或许这也是在一些三流学校的好处吧,考试挂科后,明年开学交上几十元一门的补考费,应该大部分都能过了。于是,我横下一条心,坚持看我的单片机书和资料。当你明白了单片机是这么一回事的时候,显而易见的问题出来了:我要选择那种语言为单片机编写程序呢?这个问题,困扰了我好久。具体选择C51还是A51呢?汇编在我们大二之前并没有开过课,虽然看着人家的讲解,很容易明白单片机的每一时刻的具体工作情况,但是一合上书或者资料,自己却什么也不知道了,根本不用说自己写程序了。于是,我最终还是决定学C51,毕竟C51和我们课上讲的C语言,有些类似,编程的思想可以说是相通的。而且C51还有更大的优点就是编写大程序时的优越性更不言而喻,当然在那时,我并没有想的那么深远,C51的特点,还是在后来的实践过程中,渐渐体会到的!朋友如果你选择了C51,那么请继续往下看,如果你选择了A51,那么你可以不要看了!因为下面讲的全是C方面的,完全在浪费你的时间!呵呵 ^_^

第二,既然你想学好单片机,你必须得舍得花钱,如果不买些芯片回来自己动手焊焊拆拆的(但是在后期会介绍给大家一个很好用的硬件仿真软件,并不需要你用实验板和仿真器了,直接在你的PC上完成,但是软件毕竟是软件,从某个特定的意义上来说是并不能代替硬件的),即使你每天捧着本书,把那本书翻烂,也永远学不会单片机的!刚接触单片机的朋友,看了资料,一定会对以下几个词见的比较多,但是具体的概念还是比较模糊,现作如下说明:

(1)编程器编程器是用来烧单片机芯片的,是把HEX或者BIN文件烧到单片机ROM里的。

(2)实验板实验板是专为初学者根据某些要求而特做的板,一般上面就有一个单片机的最小系统,使用者只需写好程序,烧好芯片,放到上面加以验证的这么一个工具。有了实验板,对与初学者来说,省去了焊个最小系统的麻烦。但是对于电子开发人员来说,作用并不是很大

(3)仿真器仿真器是直接把HEX或者BIN文件暂时放在一个芯片里,再通过这个芯片的引脚连接到实验板或者系统上工作。这样以来,可以省去了来回插拔芯片带来的不必要麻烦。

我一开始也不知道上面3个的概念和作用,嘿嘿,原本想买个实验板(不想焊板,因为不可能为了点亮几个流水灯,而去焊个单片机的最小系统)的,可是结果,确和我想的正好相反,人家出售的是编程器。等货物寄到后,才知道自己搞错了!汗。。嘿嘿。现在想想实在是又气又笑。我花了160大样买了个编程器(很不幸的是,这个编程器更本用不了,一烧芯片,芯片就烧坏了)把我给气的,这个编程器,现在还躺在我的抽屉里呢不过,现在想想,唯一让我觉得欣慰的是,那个老板每次能解答我的问题,连那种超级幼稚的问题,他也能不嫌麻烦地尽量帮我解答!这点让我很感动!

第三,想学单片机的必需品--PC。因为写程序,编译或者是仿真都是通过PC完成的。如果没有PC,什么也做不了!!有了PC最好还要可以上网,因为如果你没有可以和你交流单片机的人,遇到自己解决不了的问题,一直都想不通,那么估计你学习单片机的热情就会随着时间的推移而慢慢耗尽。如果你能上网通过论坛或者QQ群,问题就很快得到解决。这样的学习效率一定很高!真正的高手是从论坛中泡出来的!

有了上述3个条件后,你就可以开始学你的单片机了。但是,真的做起来并没有我所说的那么简单。你一定会遇到很多很多的问题。比如为了让单片机实现某个功能,你可能不知道怎么去写某个程序。或是你看懂了资料上某个相似的程序,你自己却写不出来。遇到类似的情况,记住:千万不要急噪,就行!

(二)说了这么多了,相信你也看了很多资料了,手头应该也有必备的工具了吧!(不要忘了上面讲过几个条件的哦)。那个单片机究竟有什么功能和作用呢?先不要着急!接下来让我们点亮一个LED(搞电子的应该知道LED是什么吧^_^)我们在单片机最小系统上接个LED,看我们能否点亮它!对了,上面也有好几次提到过单片机最小系统了,所谓单片机最小系统就是在单片机上接上最少的外围电路元件让单片机工作。一般只须连接晶体、VCC、GND、RST即可,一般情况下,AT89C51的31脚须接高电平。

#include//头文件定义。或用#include其具体的区别在于:后者定义了更多的地址空间。

//在Keil安装文件夹中,找到相应的文件,比较一下便知!sbit P1_0 = P1 ^ 0;

void main(void)

{

while(1)

{

P1_0 = 0;//低电平有效,如果把LED反过来接那么就是高电平有效}

}

就那么简单,我们就把接在单片机P1_0上的LED点亮了,当然LED是低电平,才能点亮。因为我们把LED的正通过电阻接至VCC。

P1_0 = 0;类似与C语言中的赋值语句,即把 0 赋给单片机的P1_0引脚,让它输出相应的电平。那么这样就能达到了我们预先的要求了。while(1)语句只是让单片机工作在死循环状态,即一直输出低电平。如果我们要试着点亮其他的LED,也类似上述语句。这里就不再讲了。

点亮了几个LED后,是不是让我们联想到了繁华的街区上流动的彩灯。我们是不是也可以让几个LED依次按顺序亮呢?答案是肯定的!其实显示的原理很简单,就是让一个LED灭后,另一个立即亮,依次轮流下去。假设我们有8个LED分别接在P1口的8个引脚上。硬件连接,在P1_1--P1_7上再接7个LED即可。例程如下:

#include

sbit P1_0 = P1 ^ 0;

sbit P1_1 = P1 ^ 1;

sbit P1_2 = P1 ^ 2;

sbit P1_3 = P1 ^ 3;

sbit P1_4 = P1 ^ 4;

sbit P1_5 = P1 ^ 5;

sbit P1_6 = P1 ^ 6;

sbit P1_7 = P1 ^ 7;

void Delay(unsigned char a)

{

unsigned char i;

while(--a!= 0)

{

for(i = 0;i < 125;i++);//一个;表示空语句,CPU空转。

}//i 从0加到125,CPU大概就耗时1毫秒}

void main(void)

{

while(1)

{

P1_0 = 0;

Delay(250);

P1_0 = 1;

P1_1 = 0;

Delay(250);

P1_1 = 1;

P1_2 = 0;

Delay(250);

P1_2 = 1;

P1_3 = 0;

Delay(250);

P1_3 = 1;

P1_4 = 0;

Delay(250);

P1_4 = 1;

P1_5 = 0;

Delay(250);

P1_5 = 1;

P1_6 = 0;

Delay(250);

P1_6 = 1;

P1_7 = 0;

Delay(250);

P1_7 = 1;

}

}

sbit 定义位变量,unsigned char a 定义无符字符型变量a,以节省单片机内部资源,其有效值为0~255。main函数调用Delay()函数。Delay函数使单片机空转,LED持续点亮后,再灭,下一个LED亮。while(1)产生循环。

2.单片机c语言学习总结 篇二

由于我校将最后一年改成了综合实训,要求学生必须在两年内学完所有理论课,所以专业课必须早些开。有些学校将《单片机C语言》开在了大一第一学期,笔者认为不妥。因为《单片机C语言》 是一门专业课,它综合了多种知识,所以要想学好这门课,必须具备一些相关的基础知识。首先需要掌握计算机的基础硬件知识。比如其内部的主要部、器件,例如CPU、存储器、输入 输出设备; 比如一些基础概念:位,字节,字,各进制之间的转换,ASC Ⅱ码, 补码等等;其次还要掌握基本的数字电路和模拟电路的知识。因为在单片机控制系统中,会有复位电路、时钟电路等各种电路。虽然是比较简单的电路,但没有最基本的电路概念,学习起来会比较吃力;最后还需要具备计算机的操作能力。这门课需要学生具备编程能力,上机编程调试是常态,如果学生连最基本的键盘操作,输入法的切换,WORD软件的使用都不会,如何做到熟练使用编程软件, 如何能有效的进行编程和调试。综上所述,开这门课之前,最好让学生学过《计算机基础》、《模拟电路》、《数字电路》这些基础知识,等学生有了这些理论基础以及一定的上机体验之后,再学习这门课程就会事半功倍,更有效率。因此,这门课开在大一的第二学期或者大二的第一学期最为合适。

2教学内容

现在关于单片机C语言方面的教材也比较多,大致可以分为3类。一类侧重于理论介绍,按照传统的方式,先介绍单片机的各个硬件,然后是扩展,最后才介绍一两个应用系统。这类教材虽然内容详细,全面,但是没有单片机控制系统的整体概念,各个章节显得独立,知识零散。对于大专生而言,此类书中的理论知识显得偏多,偏难,很难让学生在短短的一学期内有效掌握。一类侧重于编程语言介绍。更多的介绍用语言编程的技巧,详细的介绍相关的函数,关键字等的使用,而忽视了单片机这个应用平台。最后一类则是能较好的结合单片机和C51语言,并以典型的单片机应用系统为例进行介绍,让学生一开始就形成整体的系统概念,而不是一个个割裂的知识点。笔者认为最后一类是比较适合大专学生的。

因为是大一的学生,教学的内容不能太多,太难,而应该选取有代表性的一些应用系统来讲解。笔者认为以下三部分是必讲的: 首先是单片机的硬件基础,包括单片机内部主要部件,外部引脚, 存储器的空间分配,单片机最小系统。其次是c51语言的基础, 包括数据类型(整型、字符型、浮点型、位型、sfr型、数组、指针),运算符,流程控制,函数。最后是典型系统介绍,既包括整体的硬件电路介绍,也包括对应的程序介绍。比如流水灯,中断, 万年历,数码管显示器,LED点阵显示屏,键盘接口设计等。当然, 前两部分可以融合到最后的具体控制系统中介绍。总之,教学内容应该是难度适中,且侧重于实用。

3教学方法

从上面的教学内容可见,因为是一个个的系统介绍,所以采用项目法教学较好。首先介绍一个项目的相关理论知识,然后再在实验室做实验加以巩固。理论知识方面,也本着实用原则,尽量结合实际,做到详细透彻。比如讲到单片机的外部引脚时,可以拿实物来介绍一下单片机芯片上的缺口以及标记,说明引脚排列的顺序, 以便学生能在实物上迅速找到各个引脚。再比如讲流水灯时,电路中限流电阻的作用,阻值的大小如何计算,单片机的控制端应该接LED灯的阴极,还是阳极,相关程序中的P1为何是大写,而不能是小写,诸如此类的问题,虽然简单,但很实用,能很好的帮助学生做出实际的产品。

实验方面,传统实验箱的缺点日益突出,成本高,硬件不能随意改动,且容易出现故障。最糟的是看不到具体的电路连线图, 对于学生掌握相关的硬件电路毫无用处。所以采用仿真软件来做实验越来越受到青睐。主要是采用keil和proteus这两款软件。keil软件主要是对相关程序进行编译调试,介绍这个软件时,应充分介绍运行后的各个状态,如PSW,运行时间,SP等等,同时也要充分掌握存储器窗口(memory window),变量观察窗口,外围器件等的含义及使用方法,因为这些窗口能很好的帮助学生实时了解单片机内部的运行状况,加深学生对单片机知识的理解。proteus软件实现了从原理图设计、代码调试到单片机与外围电路的协同仿真,一键切换到PCB设计,实现了从概念到产品的完整设计。其处理器模型支持8051,PIC,AVR,ARM,MSP430等多种型号。 其元器件资源丰富,且在不断的开发出新的元器件。所以使用该软件辅助教学可以极大地提高学生的学习兴趣和创新能力。

4教学效果

3.单片机c语言学习总结 篇三

单片机原理及其应用是我国高职院校电子类及相关专业的必修课程。随着国家电子信息产业的发展,单片机在电子技术中的应用越来越广泛,电子电路设计基本上都是以单片机为核心的综合性的应用。因此,提高单片机的教学效果,对提升学生的实践创新和解决问题能力的培养有着重要的现实意义。

一、单片机技术的特点

单片机课程是一门集合计算机技术、电子技术、自动化控制技术等在内的综合性、实践性很强的课程,其特点如下:单片机的概念繁多、专有名词多、内容比较抽象,学生普遍认为入门很难;单片机汇编语言编程指令多达111条,且要掌握每条指令的功能、操作数源和书写规范的语法;单片机开发的系统性、逻辑性、完整性很强,软硬件知识衔接紧密。

基于单片机的这些特点,笔者在教学中,对教学内容、教学方法和培养学生创新能力方面进行了改革与探索,对提高整体教学水平和教学质量起到了良好的推动作用。

二、教学内容的改革

根据该课程的特点,笔者在教学过程中注重对教学内容的优化组合,揭示出单片机的神奇所在。通过一个简单有趣的实验,激发学生的学习兴趣,使之在单片机学习上找到自信。

传统单片机学的都是汇编语言。为了使学生更好地入门并增强程序的可读性,我们采用单片机C语言编程的教学模式。C语言与汇编语言相比有良好的可读性,灵活性也更强,而且不需要记忆那么多指令的使用规则,主要掌握C语言中的for、while、if 、switch-case等语句,另外再了解C语言中数组的概念即可。

单片机系统是一个软硬件结合的综合系统,单一进行程序的仿真不足以让学生全面了解单片机应用的系统性、逻辑性和完整性。因此我们在教学过程中,注重利用proteus软件让学生进行系统的软硬件设计,进行仿真练习,使学生产生对单片机学习的兴趣,同时降低学习的难度提高学习效率,加快由知识到能力的转化。

三、教学方法的改革

以往的实验实践教学,都是让学生按照实验设备提供商的实验指导书或者是教材内提供的实验进行连线和下载程序,这样不利于提高学生的动手能力和创新能力,而且禁锢了学生的创造力。为了取得更好的教学效果,我们结合日常生活中一些单片机使用实例,采用任务驱动的教、学、做一体化教学模式。例如讲到定时器/计时器的使用时,首先给学生详细讲解单片机定时器/计时器设置方法,然后给学生演示如何利用定时器/计时器设计一个秒表的软硬件电路,再给学生布置一个利用定时器/计时器设计一个数字钟的单片机系统的课堂作业。学生可以分成三人一个团队,共同讨论设计方案,然后三人分别负责程序软件设计、电路硬件设计和实验报告撰写,最后共同进行电路制作调试。在设计过程中,教师主要解决学生遇到的不同问题,完成一个系统设计后,再带着学生一起对教学内容进行总结反思,达到举一反三、触类旁通的教学效果,同时也能使学生完全参与到课堂中,在交流中激发创造性。这一教学过程主要践行教、学、做一体化的教学模式,使学生能够在做中学、学中做,激发学习兴趣,增强自信心和成就感,培养团队协作意识,为以后参加工作打下一个良好的基础。最后,教师根据每位学生在团队中的表现和做出的电路的效果进行综合打分并计入平时成绩。

四、教学评价模式的改革

我们改变了以往试卷式的期末考核方式,采用项目负责制进行考核。在期末考试前一个星期内,任课教师给每个学生团队布置一个综合性的任务课题,要求学生按照课题要求进行软硬件电路的设计、组装、调试、成型。教师最终根据电路功能效果和学生在此过程中的参与度及电路成本、设计制作周期等综合因素进行打分作为期末考试成绩。这种期末考核方法主要考查学生对电路设计制作以及电子电路基础知识的综合应用,避免了学生只会动笔而不会动手的现象,培养了学生独立思考、分析、解决实际问题的能力和创新意识。对电路成本和设计周期的考核,主要为了使学校培养与企业用工有机结合,使学生能够更好、更快地融入到工作岗位,为以后从事单片机研发工作打下一个基础。

4.单片机c语言学习总结 篇四

这是一部学单片机革命性的视频教程,教程全部十二讲,每讲3小时左右,讲座从最基本的预备知识开始讲起,非常详细的讲解KEIL编译器的使用,包括软件仿真,测定时间,单步运行,全速运行,设置断点,调试,硬件仿真调试,变量观察等,整个过程全部用单片机的C语言讲解,从C语言的第一个主函数MAIN讲起,一步步一条条讲解每一个语法,每条指令的意思,即使对单片机一巧不能,对C语言一无所知,通过本课程十节课的内容也可以让你轻松掌握51单片机的C语言编程设计,全新的讲课风格跳过复杂的单片机内部结构知识,首先从单片机的应用讲起一步步深入到内部结构,让学生彻底掌握其实际应用方法,把51单片机的所有应用每个部分都讲解的非常仔细,在讲解单片机应用的同时将单片机的常用外围电路设计及电阻,电容选值等都讲的清清楚楚,教师在教室前面用电脑一条一条写程序,旁边用TX-1C单片机实验板一个实验一个的演示,给学员解释每条指令的意思及原理,通过十天的时间让学生完全掌握单片机的C语言编程及单片机外围电路设计的思想。全程的屏幕,声音,用屏幕录像,实验板现象用摄像头拍摄,这部教程算是国内首个如此创新的以教师亲自实践为主,学员现场写程序,直接下载到实验板看现象,讲单片机的视频教程,只要你认真看,认真听,保证十天让你学会单片机应用和C语言编程。

教师推荐书籍如下:

1.如果要学C语言基本知识请看 谭浩强写的《C程序设计》 教师推荐的单片机书籍为以下两本: 2.新编MCS-51单片机应用设计 哈尔滨工业大学出版社

张毅刚

上书主要以汇编语言为主,对单片机内部结构介绍较详细,初学者可选择本书,在听讲本课程的同时,不但学会了C语言,而且通过查看本书还可了解汇编语言。3.8051系列单片机C程序设计完全手册 人民邮电出版社

5.c语言学习总结 篇五

c语言学习总结篇一:

怎么才能学好c语言呢?

1,要学习c语言的基本语言及程序结构,这时谭浩强的那本书就比较经典了。c语言学习心得。当然你不能只看书,要动手动写代码,去上机测试。因为很多时候写程序就是一个测试,你就是再牛的程序员也不能可写出没有bug的程序,所以学会找出程序中的错误很重要。这也是你以后分析他人的程序的先决条件,不可偷懒只看书,这样你是不可能学好一门计算机语言的。

2,分析他人写的程序,网上有很多实例代码,下载下来自己先看一下他们的实例是解决什么问题的,有时候很多经典的模块可以为已所用的。不过,网上下的代码中会存在很多问题,环境问题啊,编程习惯问题了,不过也好,在解决问题的过程中你会学到很多东西的,像我在分析网上下的代码时就遇到了我平时没有遇到的dos函数,masm与c语言的接合等方面的问题,学到了不少东西呢。

3,要是你再想学的深一点儿,那还得学习,及,再深就要去分析linux内核或是驱动程序了,这因人而异。但不管怎么学,一定要有个方向,有计划,这样才会事半功倍。c语言学习心得。如果你能找到你想学习方面的高手指导,或是几个人一起学的话那就更好了。

4,分析c语言函数的实现方法。这对你很好地使用函数会很有帮助的,再者很多大公司的笔试题就是让你实现c语言的数,比如:中兴的strcpy,阿里巴巴的strcmp,上海贝尔公司宣讲会上一个技术总监说,要是谁能说出printf的实现方法及返回值,当场录用。再者,c语言经过这么多年的考验,仍然很热门,可见其开发是多么经典啊,学习一下c函数实现,比学习任何书都要好。要是再有兴趣的话就分析一下c的头文件,这也是个不错的学习方面。c语言学习总结篇二:

学习c程序设计语言除了课堂讲授以外,必须保证有不少于课堂讲授学时的上机时间。因为学时所限,课程不能安排过多的统一上机实验,所以希望学生有效地利用课程上机实验的机会,尽快掌握用c语言开发程序的能力,为今后的继续学习打下一个良好的基础。为此,我们结合课堂讲授的内容和进度,安排了12次上机实验。课程上机实验的目的,不仅仅是验证教材和讲课的内容、检查自己所编的程序是否正确,课程安排的上机实验的目的可以概括为如下几个方面:

1。加深对课堂讲授内容的理解

课堂上要讲授许多关于c语言的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的。然而要使用c语言这个工具解决实际问题,又必须掌握它。通过多次上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的基础上就会自然而然地掌握c语言的语法规定。对于一些内容自己认为在课堂上听懂了,但上机实践中会发现

原来理解的偏差,这是由于大部分学生是初次接触程序设计,缺乏程序设计的实践所致。

学习c语言不能停留在学习它的语法规则,而是利用学到的知识编写c语言程序,解决实际问题。即把c语言作为工具,描述解决实际问题的步骤,由计算机帮助我们解题。只有通过上机才能检验自己是否掌握c语言、自己编写的程序是否能够正确地解题。

通过上机实验来验证自己编制的程序是否正确,恐怕是大多数同学在完成老师作业时的心态。但是在程序设计领域里这是一定要克服的传统的、错误的想法。因为在这种思想支配下,可能你会想办法去“掩盖”程序中的错误,而不是尽可能多地发现程序中存在的问题。自己编好程序上机调试运行时,可能有很多你想不到的情况发生,通过解决这些问题,可以逐步提高自己对c语言的理解和程序开发能力。

2。熟悉程序开发环境、学习计算机系统的操作方法

一个c语言程序从编辑、编译、连接到运行,都要在一定的外部操作环境下才能进行。所谓“环境”就是所用的计算机系统硬件、软件条件,只有学会使用这些环境,才能进行程序开发工作。通过上机实验,熟练地掌握c语言开发环境,为以后真正编写计算机程序解决实际问题打下基础。同时,在今后遇到其它开发环境时就会触类旁通,很快掌握新系统的使用。

3。学习上机调试程序

完成程序的编写,决不意味着万事大吉。你认为万无一失的程序,实际上机运行时可能不断出现麻烦。如编译程序检测出一大堆错误。有时程序本身不存在语法错误,也能够顺利运行,但是运行结果显然是错误的。开发环境所提供的编译系统无法发现这种程序逻辑错误,只能靠自己的上机经验分析判断错误所在。程序的调试是一个技巧性很强的工作,对于初学者来说,尽快掌握程序调试方法是非常重要的。有时候一个消耗你几个小时时间的小小错误,调试高手一眼就看出错误所在。

6.C语言总结 篇六

#include

/*预处理*/ #include Void sort(char *names[],int n);

/*函数声明*/ Void prt(char *names[],int n);Void main(void){ Char *names[]={“CHINA”,”AMERICA”,”AUSTRALIA”,”FRANCE”,”GERMAN”};

Int n=5;

/*申请变量,变量类型,运算*/ Printf(“原顺序国家名:n”);Prt(names,n);

/*函数的引用*/ Sort(names,n);Printf(“排序后的国家名:n”);Prt(names,n);} Void sort(char *names[],int n)

/*函数体*/ { Char *t;

/*指针*/ Inti,j,k;For(i=0;i

/*for循环结构*/ { K=I;For(j=i+1;j0)k=j;If(k!=i){ t=names[i];names[i]=names[k];names[k]=t;} } } Void prt(char*names[],int n){

Inti;For(i=0;i

Print(“%sn”,names[i]);} C程综述:程序均有程序主体,编译预处理,注释三部分。后两者,为模块工具与可选择添加的辅助注解,程序主体为核心,主要为函数来体现功能。函数,变量,通过三种运算三种结构根据算法形成功能模块,实现预期。基础篇

标识符:C程中有一系列表示类型名称函数名称等程序内部特定名称的字母组合,称之为关键字,这些不可更改不可移作他用。用户规定的一切变量或函数名等,不得与之冲突。(C 程识别大小写)标识符规则:

第一个字符必为字母或下划线,内部无特殊字符(除字母数字下划线); 不与关键字冲突; C程区分大小写。

数据类型:基本类型:整型int,字符型 char,实型double/float,空类型 void;

构造类型:数组[],结构体struct,共用体union,枚举型enum;

指针类型:* ; 基本类型: int(4):常量:八进制以0开头(均小于8),十六进制以0X,0x开头(0~9,a~f)

允许后缀字母,L:长整型;U:无符号整型.变量:short int(2)短整型,long int(2)长整型,unsigned/signed无/有符号整型前缀;整型变量以补码(数据绝对值二进制原码取反加一)形式存在于内存,有界,有溢出,溢出时从最小起循环。

Float:常量:浮点数,指数形式:E: 123e2=123x10^2.可后缀f:单精度,L:长双精度 E前必有数字,E后必为整数

变量:float(4):单精度,double(8):双精度,long double(10)长双精度 Char:常量:单引号,char(1)以ASCII码存储,与整型通用。变量同。字符串:引号,末尾结束,结束字符算在存储空间内。(’a’ 1字节,”a”2字节)符号常量:#define定义,运算符与表达式:

算术运算:+、-、*、/、%

/左右有任一实型,结果为实型;%结果符号以左数为主。

++、-a[i][1]=*(a[i]+1)=*(*(a+i)+1)

a[i][j] =*(*(a+i)+j)=*(a[i]+j)=(*(a+i))[j]

a[i][j]=*(a[0]+n*i+j)=*(*a+n*i+j)对于一个四列数组:a为100,a+1为116,*a+1为104 p[i][j] =*(*(p+i)+j)=*(p[i]+j)=(*(p+i))[j]

指针数组:int(*p)[10] a+i---> *(a+i)

----> &a[i]----> a[i]

---->

a[i][0] &a[i][0]----> 指针与字符串:char *s=”hello world ”“”内为地址,只在初始化成立。结构体:

定义:成员项-->域域后有。

struct+(类型名)变量名定义类型,不分配存储单元(内部总和),定义变量才申请。初始化一一对应,引用赋值输入输出均逐一进行,egstudent.score[j] 结构体数组student[i].score[j]

空白符用getchar()处理。

结构体指针p->num /(*p).num指向成员类型-->基类型、指向指针变量-->结构体

共用体:

union+类型名+{ }+变量名存储单元由最大的变量定。

引用:x.ax.bx.c一次赋值,则只有最后值为已存值,其余均为此值。

枚举类型:

枚举赋值:所赋值不越界,不胡乱添加对象。

用户定义类型:

7.单片机c语言学习总结 篇七

3.pic07.C源程序的编译

在《PIC单片机C语言程序 (8) 》一文中, 我们已在MPLAB IDE7.40集成开发环境中编辑了pic07.C源程序 (0~99秒脉冲发生器) 。对于PIC单片机来说, 所有的C语言源程序, 都要在进行编译并生成目标码.hex文件后, 方能烧写到PIC单片机中运行, 即每编辑一个C程序都要进行一次编译, 所以对C程序 (pic0.7c) 的编译操作是十分重要的。下面详细介绍用PICC编译器对pic07.C源程序进行编译并生成目标码.hex文件的全过程。

(1) 编辑源程序

根据《PIC单片机C语言程序 (8) 》一文介绍的方法, 在MPLAB IDE7.40运行界面中编辑源程序pic07.C, 并存盘, 如图29所示。

(2) 建立项目project

点击图29中菜单栏的项目project, 在其下拉菜单中点击“project wizard” (项目向导) 命令, 即可生成图30所示的Welcome! (欢迎) 界面。该界面的项目向导可帮助你配置一个新项目。

(3) 选择器件

点击图30中的“下一步”, 弹出“Step One:Select a device” (第一步:选择器件) 对话框, 如图31 (a) 所示。如果对话框中的器件 (Device) 不是PIC16F84A, 可点击该对话框中的三角形下拉按钮, 并在下拉菜单中选择器件 (这里是PIC16F84A) , 完成器件选择, 如图31 (b) 所示。

(4) 选择需要的语言工具

点击图31 (a) 中的“下一步”, 弹出“StepTwo:Select a language toolsuite” (第二步:选择语言工具) 对话框, 如图32所示。对于C语言程序的编译工具, 只需满足“Active Toolsuite:Hl-TECH PICCToolsuite” (PICC工具) 的标识字母要求, 如图32所示。如果不符合, 则点击该标识字母右边的三角形按钮, 并在弹出的下拉菜单中选择“HI-TECHPICC Toolsuite”即可。

(5) 命名项目名

点击图32中的“下一步”, 弹出“step T h r e e:N a m e y o u r project” (第三步:添加项目名) 对话框。分别在该对话框的“Project Name” (项目名) 栏输入“pic07”, 在“ProjectDirectory” (项目路径) 栏输入“e:pic07”, 如图33所示。

(6) 增加节点 (Add)

点击图33中的“下一步”, 然后在生成的如图34所示的界面中点击“确定”, 得到类似图35的对话框 (这里未列出) 。用鼠标拉动其左边滑块, 找到pic07.C文件名并点击之, 再点击命令Add (增加节点) , 就完成了第四步step Four添加C程序。

(pic07.C) 节点到项目的操作, 如图35所示。

(7) 完成建立项目

点击图35中的“下一步”, 弹出建立项目已经完成界面, 如图36所示。点击图36中的“完成”, 即可生成如图37所示的“项目树”窗口。

(8) 完成C程序的编译以生成目标码.hex

点击图29工具栏中左数第6个图标 (Build all) 命令, 或点击菜单栏中的“Project”并在其下拉菜单中点击“Build all”命令, 即可生成“output” (输出) 信息提示窗口, 如图38所示。其最下面一行“BUILD SUCCEEDED……”为编译成功提示。

到此, 对pic07.C源程序的编译全部完成, 并生成了目标码.hex。这时, 就可用PIC单片机的任何一种编程器调用.hex文件, 对单片机进行烧写了。

(9) 错误提示及修改

如果我们在MPLAB中编辑的源程序pic07.c有错误, 例如把pic07.c延时函数中的unsigned (关键字——无符号) 写成了umsigned, 如图39所示, 则经过上述编译操作后, 会得到一个编译程序失败提示文件 (BUILD FAILED) , 如图40所示。在该文件中会指出源程序pic07.c中的所有错误行及错误类型 (原因) , 即源文件中的行“Error”指示。我们只要点击该文件中的“Error”, 即可生成如图41所示的pic07.c源程序文件。在其左侧有一箭头指向pic07.c的对应错误行, 即“umsigned”。这时, 只需将umsigned改写成unsigned, 然后在MPLAB中存盘, 再如前述, 一步一步地编译, 即可完成程序编译, 生成.hex文件。

说明:本文给出的图形界面与实际界面相比, 仅是略去了其空白区域或取其主要部分 (版面受限) , 不会影响读者的学习操作过程。另外, 虽然不同版本的MPLAB IDE对C程序的编译过程稍有差别, 但只要熟练掌握了一种较高版本MPLAB IDE的操作方法, 其他版本MPLAB的使用便不成问题。

8.C语言精华总结 篇八

它的本质是地址的类型。在许多语言中根本就没有这个概念。但是它却正是C灵活,高效,在面向过程的时代所向披靡的原因所在。因为C的内存模型基本上对应了现在von Neumann(冯·诺伊曼)计算机的机器模型,很好的达到了对机器的映射。不过有些人似乎永远也不能理解指针【注1】。

注1:Joel Spolsky就是这样认为的,他认为对指针的理解是一种aptitude,不是通过训练就可以达到的

http:///wiki/APL_programming_language

下面有一段是这样的: APL is renowned for using a set of non-ASCII symbols that are an extension of traditional arithmetic and algebraic notation.These cryptic symbols, some have joked, make it possible to construct an entire air traffic control system in two lines of code.Because of its condensed nature and non-standard characters, APL has sometimes been termed a “write-only language”, and reading an APL program can feel like decoding an alien tongue.Because of the unusual character-set, many programmers used special APL keyboards in the production of APL code.Nowadays there are various ways to write APL code using only ASCII characters.在C++中有函数重载(overload)可以用来区别不同函数参数的调用,但它还是不能表示任意数量的函数参数。

在标准C语言中定义了一个头文件专门用来对付可变参数列表,它包含了一组宏,和一个va_list的typedef声明。一个典型实现如下【注14】: typedef char* va_list;#define va_start(list)list =(char*)&va_alist #define va_end(list)#define va_arg(list, mode)((mode*)(list += sizeof(mode)))[-1] 注14:你可以查看C99标准7.15节获得详细而权威的说明。也可以参考Andrew Konig的《C陷阱与缺陷》的附录A。ANSI C还提供了vprintf函数,它和对应的printf函数行为方式上完全相同,只不过用va_list替换了格式字符串后的参数序列。至于它是如何实现的,你在认真读完《The C Programming Language》后,我相信你一定可以do it yourself!使用这些工具,我们就可以实现自己的可变参数函数,比如实现一个系统化的错误处理函数error。它和printf函数的使用差不多。只不过将stream重新定向到stderr。在这里我借鉴了《C陷阱与缺陷》的附录A的例子。实现如下: #include #include

void error(char* format, …){ va_list ap;va_start(ap, format);

fprintf(stderr, “error: “);vfprintf(stderr, format, ap);va_end(ap);fprintf(stderr, “n”);exit(1);} 你还可以自己实现printf: #include

int printf(char* format, …){ va_list ap;va_start(ap, format);int n = vprintf(format, ap);va_end(ap);return n;} 我还专门找到了VC7.1的头文件看了一下,发现各个宏的具体实现还是有区别的,跟很多预处理(preprocessor)相关。其中va_list就不一定是char*的别名。typedef struct { char *a0;/* pointer to first homed integer argument */ int offset;/* byte offset of next parameter */ } va_list;其它的定义类似。

经常在Windows进行系统编程的人一定知道函数调用有好几种不同的形式,比如__stdcall,__pascal,__cdecl。在Windows下_stdcall,__pascal是一样的,所以我只说一下__stdcall和__cdecl的区别。

(1)__stdcall表示被调用端自身负责函数引数的压栈和出栈。函数参数个数一定的函数都是这种调用形式。

例如:int fun(char c, double d),我们在main函数中使用它,这个函数就只管本身函数体的运行,参数怎么来的,怎么去的,它一概不管。自然有main负责。不过,不同的编译器的实现可能将参数从右向左压栈,也可能从左向右压栈,这个顺序我们是不能加于利用的【注15】。注15:你可以在Herb Sutter的《More Exceptional C++》中的条款20:An Unmanaged Pointer Problem, Part 1:Parameter Evaluation找到相关的细节论述。

(2)__cdecl表示调用端负责被调用端引数的压栈和出栈。参数可变的函数采用的是这种调用形式。

为什么这种函数要采用不同于前面的调用形式呢?那是因为__stdcall调用形式对它没有作用,被调用端根本就无法知道调用端的引数个数,它怎么可能正确工作?所以这种调用方式是必须的,不过由于参数参数可变的函数本身不多,所以用的地方比较少。

对于这两种方式,你可以编制一些简单的程序,然后反汇编,在汇编代码下面你就可以看到实际的区别,很好理解的!重载函数有很多匹配(match)规则调用。参数为“„”的函数是匹配最低的,这一点在Andrei Alexandrescu的惊才绝艳之作《Modern C++ Design》中就有用到,参看Page34-35,2.7“编译期间侦测可转换性和继承性”。

后记:

9.c语言基础总结 篇九

1.使用未初始化和未赋值的变量

描述:非全局变量和静态变量在定义时不自动进行初始化,初值为一个与该程序运行环境有关的随机数。不赋值或没有显示初值就直接使用这样的变量是错误的。

解决:所有变量都显示地进行初始化,建议数值变量初始化为0,指针变量初始化为NULL

2.不考虑数值溢出的可能

描述:当赋值超过此范围数值,就会产生数值溢出,得到不正确的值。

解决:预先估算运行结果的可能范围,采用可能范围更大的,不处理负数,就用无符号类型。运算还没开始前,判断运算数是否在合理取值的范围内,超出则停止运算。采用第三方无取值范围的运算库。

3.不用sizeof()获得类型或变量的字长

描述:相同类型在不同平台上占得字节数不同。Int在16位,32位,64位系统分别占2,4,8个字节。结构体所占字节也不是所有成员字长的简单相加,而是和平台与编译器,编译项都有关系。

解决:用且只用sizeof获得字长

Intwriteint(intfh ,inti)

{

Returnwrite(fh ,&i,sizeof(i));

}

4.假定类型的取值范围

描述:类型的取值范围与程序编译息息相关。

解决:使用limits.h和float.h定义的宏(INT--MAX,INT----MINULONG--MAXFLT---MAX

5.期望两个整数的运算自动获得浮点数的结果

描述:两个数运算的结果还是整数,不是浮点数

方案:强制转换为浮点数,再运算

例:voidfunc(void)voidfunc(void)

{{

Floatf=0.0;floatf=0.0;

Inta =3,b=2;int a=3,b=2;

f=a/b;f=a/(float)b;

printf(“%f,f);printf

}

6.不预先判除除数是否为0

编译器反应:直接写入inti=100/0,编译器会报错,编译器对此问题沉默

解决方案:先判断除数是否为0,若是0则不运算。

7.混淆“&,|”与“&&,||”

说明:他们是两种不同的运算符,有人总是弄错

8使用依赖编译器求值顺序的语句

描述:printf(“%d,%d,%d,i++,i++,i++);i=0可能输出 0.1.20.0.0.2.1.0方案:按期望的顺序分别求职,再综合运算

Voidfunc(void)

{

Int a,b,c ,i=0;

a=i++;

b=i++

C=i++

Printf(“%d,%d,%d”,a,b,c)

9.使用依靠算符优先级的表达式

描述;没有记住优先级,容易出错。

解决:用括号明确优先计算的部分

10.表达式过于复杂

描述:(a>b||b>c)&&(o>P||q>p)?(a-b)*c+(o-p)*q:(a*b*c)-(o*p*q)

11.用“==”时误用“=”

12.用“==”比较两个浮点数

描述;两个数值表面相等或者非常接近的浮点时用“==”比较,结果可能不同

解决;不用float用double在精度运算中两个浮点数的差的绝对值只要小于一个

精度范围,就可以相等

13.使用幻数

描述:直接使用的常数

解决;把幻数定义为宏或枚举,建议使用枚举。编译提示会更清晰,准确

#definearray-srze10

Enum(array-size=10)printf()和scanf()中格式控制字符串与参数类型不匹配

15.循环或判断语句以“;”结尾

描述:分别表示循环和判断语句的终结,后面的代码不算循环体或分支,而是循环和判断

平行的代码

解决:禁止在循环判断语句末尾出现分号,循环体为空的情况下,While(.........)

{

}

16.在循环体内改变循环结束条件

例如:voidfunc(void)

{

Int a,end:

-------

While(a

{

在这里修改end的值

}

}

17.case分支不用break结束

规定每个case分支必须用break结束,两个分支用同样的代码,就把代码定义为函数

基本概念

函数是c的基本单位,必须有且仅有一个main函数。一个c可以包含一个到多个函数,在函数中可以调用系统提供的库函数

函数首部:函数返回值类型,函数名,形参类型,形参名的说明

函数

函数体:大括号中的内容,包括变量声明(对象)语句和执行(动作)语句c程序书写规则;以分号结束,并且书写注释;“/**/,注释之间不能留有空格常见关键字:asmautobreakcasecdeclchar

Constcontinuedefaultdodoubleelse

Enumexternfarfloatforgoto

Hugeifinterruptintlongnear

Pascalregisterreturnshortsigned

Sizeofstaticstructswitchtypedef

Unionunsignedvoidvolatilewhile

标识符:系统自定义标识符,用户自定义标识符

运算符:算数运算符:+—*/%关系运算符: >>==<<=!=

逻辑运算符:!&&||

赋值运算符:=

复合的赋值运算符:+=-=*=/=%=&=!=^=<=>=

增一减一的运算符:++--

条件运算符:?:

强制类型转换运算符:

指针和地址运算符:*&

计算字节数运算符:sizeof

下标运算符:[]

结构体成员运算符:->

位运算符:<<>>|^&~

逗号运算符:,分隔符:相邻保留字,标识符之间由空格或回车换行做分隔符:相邻同类项之间用逗号分隔

声明相同类型的变量之间可用逗号分离,向屏幕输出的变量中各变量表达式之间用

逗号分离。

常见的转义字符:n 换行r回车(不换行) 字符串结束t 水平制表

v 垂直制表b退格f走纸换页a响铃报警

” 双引号’单引号 一个反斜线?问号

常见错误

数组;数组的下标都是从0开始的,访问时发生下标多1或者少1都会越界访问内存错误

用变量来定义数组长度会导致语法错误,应该用整型常量或整型常量表达式定义

用a[x,y]而不是a[x][y]的形式来访问二维数组中的元素,将导致语法错误

(数组的第1个元素的下标是0,数组元素1是指数组元素的下标为1,是数组的第二个元素)

忘记对需要进行初始化的元素初始化,导致运行结果错误

对数组初始化的过程中,提供的初值个数多于数组所能容纳的元素个数定义字符数组长度时,必须要多留一个字节的存储单元,存放结束标志打印一个不包括字符串结束标志的,导致运行结果错误

直接使用赋值运算符对字符串赋值是错误的,必须用strcpy()赋值

直接使用关系运算符比较字符串大小是错误的,必须使用strcpy()比较

字符串必须使用双引号括起来,单引号括起来是错误的。

一对双引号将一个字符常量括起来,产生一个指向包含两个字符的字符串指针(把字符当做实参去调用形参是字符串的函数;把字符串当做实参去调用形参是字符的函数,都会导致语法的错误!)

误以为在函数中定义的静态局部数组元素中的元素,在每次函数调用时都初始化0(函数原型,函数定义的头部和函数调用语句三者,在形参和实参的数量,类型和顺序,以及返回值的类型上没有严格保持一致,将导致语法错误。)

指针:误以为用来声明指针变量的星号(*)会对同一个声明语句中的所有指针变量都起作用,而省略了其他指针变量名前的星号。实质是每一个每一个变量名前的星号都不能省略。

没有对指针变量进行初始化,或没有将指针变量指向内存中某一个确定存储单元的情况下,就利用这个指针变量去访问它所指向的存储单元,将导致严重的运行错误。没有意识到某些函数形参是属于“传地址掉调用”而数值不是指针当做实参赋值给这形参。

对没有指向数组中的某个元素的指针变量进行算数运算,是无意义的。

对并非指向同一数组中元素的两个指针进行相减或比较运算。是无意义的。每个数组都有上,下边界,指针超出了边界就会造成越界访问内存错误。

除非两个指针类型都是void,否则将一种类型的指针赋值给其他类型的指针,造成语法错误。

试图用一个void的指针变量去访问内存,是一个语法错误。

试图以指针运算的方式来改写一个数组名所代表的地址,是一个语法错误

内存分配不成功的话会导致非法内存访问错误,只要运行前检查指针是否为空指针,可以避免错误发生。

如果内存分配成功,但是没有初始化,将会导致非法内存访问错误。

向系统申请了一块内存,结束后忘了释放内存,造成内存泄露。

释放了内存,但却仍然使用,会产生“野指针”

结构体,共用体:定义一个结构体时,忘记最后加上一个分号,导致语法错误

将一种类型的结构体赋值给另一种类型的结构体,导致语法错误

对两个结构体或者共用体进行比较,导致语法错误

在结构体指向运算符的两个组成符号“-” 和“>”之间插了空格,或者写成“→”导致语法错误

只使用成员变量名访问结构体的一个成员,导致语法错误

直接使用结构体的每个成员类型所占内存字节数的“和”作为一个结构体实际所占的字节数。是错误的。

没有标明结构体数组下标 就访问其中一个结构体数组元素,导致语法错误。

函数

递归函数是需要返回值的,在递归函数中忘记返回数值,是错误的忘记了编写递归终止条件的分支语句,写错了递归步骤,都会导致递归函数不能收敛到递归的终止条件,引起无穷递归

定义函数指针时,忘记将函数指针变量名及前面的星号用圆括号括起来,使得本应声明函数指针变量的变量声明变成了一个函数声明语句。

将函数指针作为函数参数时,不在函数指针变量名后的一对圆括号中列出各函数参数的类型,导致编译错误。

实施细则

1.函数

1.函数指针:通式:数据类型(*指针名)()int(*p)()

错误:忘记前一个()意义是声明一个函数,函数名为P,返回值是一个指向整型变量的指针

忘记了后一个(),意义是定义了一个指向整型变量指针。使用:1.定义过程 2.函数指针赋值过程3.调用过程

2.递归:一个对象部分地由它和自己组成或它自己定义,称它是递归的。

3.返回指针值的函数:通式:数据类型*函数名(参数名){}

区别;不带*的函数值,函数值只能是一个数据,不能是一组带*的函数值,不仅是一个数据,还能是一组数据。

2.结构体,共用体

位段:指定了存储位数的结构体或共用体的成员叫位段

优点:用最少的位数存储数据注意:必须声明为int或unsigned型使用:用struct作为关键字,定义了unsigned 的三个位段

“:”代表位段宽度的整数常量,访问位段成员的方法与访问结构体成员的方法基本一致,用“圆点运算符”或“箭头运算符”

共用体:将不同的数据类型组合在一起,共占有同一段内存的用户自定义数据类型注意:必须有足够大的内存空间将占据最大内存空间的成员存储在内,内存空间的大小由占据内存空间成员所占的空间数决定。

动态数据结构:在结构体类型中,如果包含了本结构体类型的成员,由于本结构所占的内存字节数无法确定,系统无法正常分配内存。

声明结构体类型是不能包含自我,但可以包含指向本结构体类型的指针域。操作:

Structtemp

{

Intdata;

Structtemp*temp;

};

利用函数malloc()申请一个结构体的内存

Structtemp

{

Intdata;

Charname[10];

};

Structtemp *p;

P=(struct temp*)malloc(10*sizeof(structtemp));利用函数calloc()申请一个结构体内存

Structtemp *p

P=(struttemp*)calloc(10*sizeof(struct 利用函数free()释放申请的内存空间,链表的定义

10.单片机c语言学习总结 篇十

随着微电子技术的不断发展和广泛应用, 计算机编程语言也越来越丰富, 因而学生也被要求具有应对各种语言的学习应用能力, 在掌握好C语言后, 对于其它语言的学习则游刃有余。基于单片机进行应用系统开发, C语言作为一种高级的编程语言, 无论是现在进行嵌入式系统开发的相关企业, 还是当前的全国电子设计大赛等学生竞赛中, 都越来越受到大家的关注, 并将其作为一个主要语言开发工具。故本文提出的基于单片机的C语言教学方法, 对结合单片机进行符合实际工程需求的硬件和软件开发的爱好者或学习者有很重要的意义。

二、教学对象

本学期本人所教授的主要课程之一是《C语言程序设计》, 所面向的教学对象是大一新生, 大多数同学由于在高中阶段很少接触电脑, 对于语言的学习更是陌生, 而且数学功底比较薄弱, 同时, 加上学习过程中大多数学生往往缺乏积极性和主动性, 遇到困难不能刻苦钻研, 往往选择放弃。因此, 针对学生的基础情况, 教学讲授的进度不能太快, 教学的内容不能讲的太过深奥, 而且教学方法要灵活多变, 结合实际事物进行简单比喻来讲解, 只有这样才能较为形象地教好C语言这门课。

三、C语言的应用地位

C语言是一门使用最广泛的程序开发工具编程语言, 是极具发展前景的计算机高级语言。其作为一种结构化的程序设计语言, 具有相当强的结构性、可移植性和功能性。通过采用C语言进行编程开发可以使众多开发者专心研究所设计程序要实现的功能及相关实现算法, 从而有效减少开发和软件调试的时间。C程序设计具有良好的程序结构, 对于模块化的程序设计非常适合, 故通常会采用从上至下, 追求逐步求精的结构化程序设计方法, 来将所要实现的功能模块化, 不同的功能通过不同的模块去完成。这样易于进行调试工作和方便快捷地管理好大型项目, 从而最大限度地减少重复劳动。

四、单片机的应用教学现状

单片机的学习是我院电子类专业需要掌握的一门实践性非常强的专业课程, 我院学生通过对其的实践性学习后, 能够独立参加全国电子设计大赛, 并能较好地完成比赛项目。为使我院的单片机教学效果更好, 学生对该门课程掌握的更加牢靠, 故需要对单片机的教学进行大胆改革, 通过在C语言的课程教学上, 结合单片机以及相关的硬件设计知识进行讲解。从我院电子专业开设C程序设计课程以来, 通过学生所反映的情况是该门课程比较难学习, 而且不知道他们在学完C语言后到底有什么用, 能够应用到哪些地方, 更不知道将自己的所学应用于单片机的开发中能不能实现目标。故根据以往教师的教学经验, 并结合学生反映的情况考虑, 本人觉得有必要作出这样的改进, 在C语言的课程上, 通过结合单片机及相关硬件设计知识来讲解C语言, 并从以下几方面引起重视。

五、《C语言程序设计》的课堂教学

1. 教学设计前的思考。

《C语言程序设计》不仅是电子类专业理工科学生的一门计算机公共必修课程, 而且C语言也是作为计算机等级考试 (二级) 的考试内容之一。C语言对于大部分刚进入大学的学生来说, 也是一门比较难的计算机语言课程。要做好这门课程的教学设计, 首先要对学生的具体情况有一定程度的了解。该课程通常的教学法是语法格式的讲解、语法要点的逐步讲解和通过例题对语法的应用讲解。这种机械的教学灌输思想枯燥无味, 会使学生失去对该门课程的学习兴趣, 所以, 本人认为应该先要求学生课前对本堂课所要讲解的知识进行预习, 并能识记有关知识点, 将不理解之处画上记号, 待课堂老师讲解时再认真听并理解所教授内容, 这样通过教师为主导、学生为主体的方式学习, 教师通过精讲相关的硬件设计实例, 通过硬件设计所要实现的功能引出相关软件设计, 进而将软件设计时所涉及到的相关C知识进行讲解, 然后通过另一简单例子让学生自己去通过分析来巩固知识点。

2. 结合多媒体的讲解, 强化实验及实践能力。

因为教师授课的主要对象是大学一年级新生, 所以需要教师采用通俗易懂, 并结合简单例子进行相关讲解, 这样能够使学生容易理解和消化。教学过程中, 采用多媒体, 通过编程演示加深学生对运用的语法理解和深刻记忆。并把理论知识和硬软件的设计内容进行整合讲解, 让每个学生独立完成实际应用实验题。

3. 减少和消除学生对程序设计语言的排斥和畏惧感。

本人在教学中会引导学生多读程序, 在读的过程中领悟和提高。对于软件生存周期的设计、编码、调试、运行这几个阶段, 本人可以通过C语言设计实例来体现, 以培养学生编程中的工程思想。讲授课程时以提出问题、解决问题、深入拓展问题、再解决问题, 对问题进行评价和优化设计的螺旋式滚动教学的方法, 收到了不错的教学效果。

教学过程中, 对于数组、指针等重要的知识点, 则需要制作更生动的课件, 提高学生的学习兴趣和主动性。例如, 在讲解数组的冒泡法排序时, 本人让7位同学分别拿着一个数据牌站到讲台, 进行现场模拟气泡排序过程, 通过第一次排序找到了该组中的最大值, 经过第二次排序找到了次大值, 通过现场的模拟以及班上同学的参与, 使课堂更加丰富有趣, 并且所有同学都能掌握气泡排序的过程。由于在教学中引入的现场模拟, 使同学们更容易理解这些抽象的内容, 更重要的是碰到类似的问题他们会触类旁通, 从而慢慢培养出编程的兴趣。

六、实践培训操作

上机实验是学习程序设计语言的重要环节, 自己编写的程序上机调试运行中, 可能有很多想不到的错误, 通过改正这些错误, 可逐步提高自己对C语言语法的理解力。在课程的教学中, 会进行阶段性的实训项目, 将每一阶段的学习进行小结性的贯穿和提高。将相关的知识点融入到程序的编写中, 从而巩固知识点并将琐碎的知识点做一个整合。暑假期间, 对于电子爱好的学生进行集中培训, 然后按照全国电子设计大赛的要求给大家几个题目做, 这几个题目涵盖非常广的知识点, 大家如果想编出程序就必须要找到课本的相应知识点进行复习, 从而编出程序, 学生普遍反映通过集中培训课的锻炼, 他们的编程能力有了很大的提高, 很多以前不懂的内容通过自己钻研也懂了, 通过自己的努力以后也体会到了编出程序的喜悦感, 可以说收到不错的成效。

七、结束语

C语言的教学重点是培养学生分析与解决问题的能力, 这种能力的培养与学生的刻苦学习分不开, 因此, 在本人的课堂中会一再强调C语言不是看会的, 也不是听会的, 而是亲自动手实践练会的。基于单片机的C语言开发和设计, 极大地促进了单片机在生产、生活各个领域的应用, 提高了程序开发效率。因而, C语言学习效果的好坏, 对今后单片机课程的学习具有深远的影响。

摘要:《C语言程序设计》课程是电子类专业的一门基础必修课, 也是电子和电气类学生应该学习的第一门计算机语言。该课程的学习主要是为结合单片机的应用开发服务的。如何让一名《C语言程序设计》的初学者能够较好地理解并掌握设计中的基本思想和精髓, 并且在掌握程序设计方法的同时结合单片机进行硬件和软件设计的应用开发是讲授这门课的重点所在, 故本文结合单片机, 以单片机系统为开发平台, 探讨了《C语言程序设计》的教学方法, 为学生以后能基于单片机进行硬件和软件的学习开发打下坚实的基础。

关键词:C语言程序设计,教学方法,单片机

参考文献

[1]向艳.C程序设计课程教学体系和模式探讨[J].计算机教育, 2010, (3) :112-114.

[2]谭浩强.C语言程序设计教程 (第三版) [M].北京:清华大学出版社, 2013.

[3]冯运仿.《C语言程序设计》课程教学模式的研究与实践.福建电脑, 2012, (1) .

[4]董蕴宝, 潘旭军.浅谈C语言在单片机中的程序设计[10].科技信息, 2009, (13) :59-67.

11.单片机c语言学习总结 篇十一

1)字符串操作

strcpy(p, p1)复制字符串

strncpy(p, p1, n)复制指定长度字符串 strcat(p, p1)附加字符串

strncat(p, p1, n)附加指定长度字符串 strlen(p)取字符串长度 strcmp(p, p1)比较字符串 strcasecmp忽略大小写比较字符串 strncmp(p, p1, n)比较指定长度字符串 strchr(p, c)在字符串中查找指定字符 strrchr(p, c)在字符串中反向查找 strstr(p, p1)查找字符串

strpbrk(p, p1)以目标字符串的所有字符作为集合,在当前字符串查找该集合的任一元素 strspn(p, p1)以目标字符串的所有字符作为集合,在当前字符串查找不属于该集合的任一元素的偏移

strcspn(p, p1)以目标字符串的所有字符作为集合,在当前字符串查找属于该集合的任一元素的偏移

* 具有指定长度的字符串处理函数在已处理的字符串之后填补零结尾符

2)字符串到数值类型的转换

strtod(p, ppend)从字符串 p 中转换 double 类型数值,并将后续的字符串指针存储到 ppend 指向的 char* 类型存储。

strtol(p, ppend, base)从字符串 p 中转换 long 类型整型数值,base 显式设置转换的整

型进制,设置为 0 以根据特定格式判断所用进制,0x, 0X 前缀以解释为十六进制格式整型,0 前缀以解释为八进制格式整型 atoi(p)字符串转换到 int 整型 atof(p)字符串转换到 double 符点数 atol(p)字符串转换到 long 整型

3)字符检查

isalpha()检查是否为字母字符 isupper()检查是否为大写字母字符 islower()检查是否为小写字母字符 isdigit()检查是否为数字

isxdigit()检查是否为十六进制数字表示的有效字符 isspace()检查是否为空格类型字符 iscntrl()检查是否为控制字符 ispunct()检查是否为标点符号 isalnum()检查是否为字母和数字 isprint()检查是否是可打印字符

isgraph()检查是否是图形字符,等效于 isalnum()| ispunct()

4)函数原型

原型:strcpy(char destination[], const char source[]);功能:将字符串source拷贝到字符串destination中 例程:

#include #include

void main(void){

char str1[10] = { “TsinghuaOK”};

char str2[10] = { “Computer”};

cout <

注意:在定义数组时,字符数组1的字符串长度必须大于或等于字符串2的字符串长度。不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。所有字符串处理函数都包含在头文件string.h中。

strncpy(char destination[], const char source[], int numchars);strncpy:将字符串source中前numchars个字符拷贝到字符串destination中。strncpy函数应用举例

原型:strncpy(char destination[], const char source[], int numchars);功能:将字符串source中前numchars个字符拷贝到字符串destination中 例程:

#include #include void main(void){

char str1[10] = { “Tsinghua ”};

char str2[10] = { “Computer”};

cout <

原型:strcat(char target[], const char source[]);功能:将字符串source接到字符串target的后面

例程:

#include #include void main(void){

char str1[] = { “Tsinghua ”};

char str2[] = { “Computer”};

cout <

原型:strncat(char target[], const char source[], int numchars);功能:将字符串source的前numchars个字符接到字符串target的后面 例程:

#include #include void main(void){

char str1[] = { “Tsinghua ”};

char str2[] = { “Computer”};

cout <

原型:int strcmp(const char firststring[], const char secondstring);功能:比较两个字符串firststring和secondstring 例程:

#include #include

void main(void){

char buf1[] = “aaa”;

char buf2[] = “bbb”;

char buf3[] = “ccc”;

int ptr;

ptr = strcmp(buf2,buf1);

if(ptr > 0)

cout <<“Buffer 2 is greater than buffer 1”<

else

cout <<“Buffer 2 is less than buffer 1”<

ptr = strcmp(buf2,buf3);

if(ptr > 0)

cout <<“Buffer 2 is greater than buffer 3”<

else

cout <<“Buffer 2 is less than buffer 3”<

原型:strlen(const char string[]);功能:统计字符串string中字符的个数 例程:

#include #include void main(void){ char str[100];cout <<“请输入一个字符串:”;cin >>str;

cout <<“The length of the string is :”<

void *memset(void *dest, int c, size_t count);将dest前面count个字符置为字符c.返回dest的值.void *memmove(void *dest, const void *src, size_t count);从src复制count字节的字符到dest.如果src和dest出现重叠, 函数会自动处理.返回dest的值.void *memcpy(void *dest, const void *src, size_t count);从src复制count字节的字符到dest.与memmove功能一样, 只是不能处理src和dest出现重叠.返回dest的值.void *memchr(const void *buf, int c, size_t count);在buf前面count字节中查找首次出现字符c的位置.找到了字符c或者已经搜寻了count个字节, 查找即停止.操作成功则返回buf中首次出现c的位置指针, 否则返回NULL.void *_memccpy(void *dest, const void *src, int c, size_t count);从src复制0个或多个字节的字符到dest.当字符c被复制或者count个字符被复制时, 复制停止.如果字符c被复制, 函数返回这个字符后面紧挨一个字符位置的指针.否则返回NULL.int memcmp(const void *buf1, const void *buf2, size_t count);比较buf1和buf2前面count个字节大小.返回值< 0, 表示buf1小于buf2;返回值为0, 表示buf1等于buf2;返回值> 0, 表示buf1大于buf2.int memicmp(const void *buf1, const void *buf2, size_t count);比较buf1和buf2前面count个字节.与memcmp不同的是, 它不区分大小写.返回值同上.char *strrev(char *string);将字符串string中的字符顺序颠倒过来.NULL结束符位置不变.返回调整后的字符串的指针.char *_strupr(char *string);将string中所有小写字母替换成相应的大写字母, 其它字符保持不变.返回调整后的字符串的指针.char *_strlwr(char *string);将string中所有大写字母替换成相应的小写字母, 其它字符保持不变.返回调整后的字符串的指针.char *strchr(const char *string, int c);查找字 串string中首次出现的位置, NULL结束符也包含在查找中.返回一个指针, 指向字符c在字符串string中首次出现的位置, 如果没有找到, 则返回NULL.char *strrchr(const char *string, int c);查找字符c在字符串string中最后一次出现的位置, 也就是对string进行反序搜索, 包含NULL结束符.返回一个指针, 指向字符c在字符串string中最后一次出现的位置, 如果没有找到, 则返回NULL.char *strstr(const char *string, const char *strSearch);在字符串string中查找strSearch子串.返回子串strSearch在string中首次出现位置的指针.如果没有找到子串strSearch, 则返回NULL.如果子串strSearch为空串, 函数返回string值.char *strdup(const char *strSource);函数运行中会自己调用malloc函数为复制strSource字符串分配存储空间, 然后再将strSource复制到分配到的空间中.注意要及时释放这个分配的空间.返回一个指针, 指向为复制字符串分配的空间;如果分配空间失败, 则返回NULL值.char *strcat(char *strDestination, const char *strSource);将源串strSource添加到目标串strDestination后面, 并在得到的新串后面加上NULL结束符.源串strSource的字符会覆盖目标串strDestination后面的结束符NULL.在字符串的复制或添加过程中没有溢出检查, 所以要保证目标串空间足够大.不能处理源串与目标串重叠的情况.函数返回strDestination值.char *strncat(char *strDestination, const char *strSource, size_t count);将源串strSource开始的count个字符添加到目标串strDest后.源串strSource的字符会覆盖目标串strDestination后面的结束符NULL.如果count大于源串长度, 则会用源串的长度值替换count值.得到的新串后面会自动加上NULL结束符.与strcat函数一样, 本函数不能处理源串与目标串重叠的情况.函数返回strDestination值.char *strcpy(char *strDestination, const char *strSource);复制源串strSource到目标串strDestination所指定的位置, 包含NULL结束符.不能处理源串与目标串重叠的情况.函数返回strDestination值.char *strncpy(char *strDestination, const char *strSource, size_t count);将源串strSource开始的count个字符复制到目标串strDestination所指定的位置.如果count值小于或等于strSource串的长度, 不会自动添加NULL结束符目标串中, 而count大于strSource串的长度时, 则将strSource用NULL结束符填充补齐count个字符, 复制到目标串中.不能处理源串与目标串重叠的情况.函数返回strDestination值.char *strset(char *string, int c);将string串的所有字符设置为字符c, 遇到NULL结束符停止.函数返回内容调整后的string指针.char *strnset(char *string, int c, size_t count);将string串开始count个字符设置为字符c, 如果count值大于string串的长度, 将用string的长度替换count值.函数返回内容调整后的string指针.size_t strspn(const char *string, const char *strCharSet);查找任何一个不包含在strCharSet串中的字符(字符串结束符NULL除外)在string串中首次出现的位置序号.返回一个整数值, 指定在string中全部由characters中的字符组成的子串的长度.如果string以一个不包含在strCharSet中的字符开头, 函数将返回0值.size_t strcspn(const char *string, const char *strCharSet);查找strCharSet串中任何一个字符在string串中首次出现的位置序号, 包含字符串结束符NULL.返回一个整数值, 指定在string中全部由非characters中的字符组成的子串的长度.如果string以一个包含在strCharSet中的字符开头, 函数将返回0值.char *strspnp(const char *string, const char *strCharSet);查找任何一个不包含在strCharSet串中的字符(字符串结束符NULL除外)在string串中首

次出现的位置指针.返回一个指针, 指向非strCharSet中的字符在string中首次出现的位置.char *strpbrk(const char *string, const char *strCharSet);

上一篇:管理会计平时作业二下一篇:我国自有品牌发展现状