Holtek C语言学习教程.docx_第1页
Holtek C语言学习教程.docx_第2页
Holtek C语言学习教程.docx_第3页
Holtek C语言学习教程.docx_第4页
Holtek C语言学习教程.docx_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一课时1、 Holtek公司编译器HT-IDE3000使用说明(1) 双击打开HT-IDE3000,进入编译器的界面,见下图:(2) 单击“工程”选择“新建”,弹出下图窗口;Project Name:新建项目文件的名称,不建议使用中文名称;Project Location:项目文件存放的位置,勾选“Create directory for project”后,会自动建立一个文件夹,项目文件都存放在此文件夹内;Project MCU:单片机的型号;Choose Language Tool:选择编程语言,这里选择“V2”版本的C语言。(3) 点击下一步,选择“.C”;(4) 点击下一步,再点击下一步,点击OK,然后弹出“配置选项”,配置选择只要是对单片机一些功能和特性进行设置,例如工作电压,工作频率,看门狗等;(5) 配置选项设置完后,点击OK,再点击确定,那么新的工程就建立完毕了。2、 C语言程序设计(1) 主函数每个程序只有一个主函数,程序是从主函数开始执行。格式:void main()例子:#include HT66F40.hvoid main()/程序从这里开始跑_nop();/语句1_nop();/语句2_nop();/语句3功能说明:程序执行的顺序,语句1语句2语句3。(2) 子函数一个程序包含各种功能,如果每种功能都做成一个子函数,那么整个程序的架构实现了模块化。例如,LCD的开启,显示及关闭这三个功能可以分别做成三个独立的子函数。使用子函数的步骤: 编写子函数的功能void TurnOn_LCD()/LCD开启子函数,TurnOn_LCD是函数的名称_nop();/这里先用空指令代表子函数的功能_nop();/这里先用空指令代表子函数的功能 声明子函数,告诉单片机有这个子函数存在void TurnOn_LCD();技巧:直接把步骤 的第一行复制过来,然后在后面加上分号; 调用子函数TurnOn_LCD(); 例子:#include HT66F40.hvoid TurnOn_LCD();/声明子函数,告诉单片机有这个子函数存在void TurnOff_LCD();/声明子函数,告诉单片机有这个子函数存在void display_LCD();/声明子函数,告诉单片机有这个子函数存在void main()_nop();/空指令_nop();/空指令_nop();/空指令while(1) /while循环结构,当小括号里内容为真,执行/while大括号里的内容TurnOn_LCD(); /调用LCD开启子函数display_LCD(); /调用LCD显示子函数TurnOff_LCD();/调用LCD关闭子函数void TurnOn_LCD()/编写子函数的功能,LCD开启子函数,TurnOn_LCD是 /函数的名称_nop(); /这里先用空指令代表子函数的功能_nop();/这里先用空指令代表子函数的功能void TurnOff_LCD()/编写子函数的功能,LCD关闭子函数,TurnOff_LCD是/函数的名称_nop();/这里先用空指令代表子函数的功能_nop();/这里先用空指令代表子函数的功能void display_LCD()/编写子函数的功能,LCD显示子函数,display_LCD是/函数的名称_nop();/这里先用空指令代表子函数的功能_nop();/这里先用空指令代表子函数的功能(3) 中断子函数使用中断子函数的步骤: 相关寄存器进行初始化(请查阅相关型号IC的PDF) 声明中断子函数地址格式:#pragma vector 中断子函数名称 中断入口地址例如: #pragma vector isr_tm00x14 编写中断子函数的功能例如:void isr_tm0() 例子:#include HT66F40.h#pragma vector isr_tm0 0x14/声明中断子函数的入口地址void mcu_init();/声明单片机初始化子函数void main()mcu_init();while(1)/while循环结构,当小括号里内容为真,执行while /大括号里的内容_nop();_nop();void isr_tm0()/编写中断子函数的功能_t0af=0;/清除中断标志位_nop();/这里先用空指令代表中断子函数的功能void mcu_init()/编写单片机初始化子函数/定时器相关寄存器初始化_tm0c0=0b00000000;/定时器计数时钟fsys/4=1Mhz,fsys=4Mhz为系统/频率_tm0c1=0b11000001;/选择定时计数工作模式,/清0计数器的条件:与比较器A匹配,即/计数值与tm0al,tm0ah的值相等时,计数器清0)_tm0al=0xe8;/0x03e8=1000_tm0ah=0x03;_t0on=1;/启动定时器/定时器中断相关寄存器初始化_emi=1;/总中断控制位,0-关闭 1-开启_mf0e=1;/多功能中断0控制位,0-关闭 1-开启_t0ae=1;/TM0比较器A匹配中断控制位,0-关闭 1-开启(4) 函数的返回值及参数的介绍 无返回值,无参数函数:前面介绍的函数均为无返回值无参数函数。例如:void main()void表示此函数是“空类型”(无返回值),void是“空”的意思,即执行此函数后不产生一个函数值。 有返回值,有参数函数例如:程序功能说明:参数的传递:调用函数时,程序把a赋值给x,b赋值给y;因为a和b的数据类型是u8,所以参数x和y的数据类型也是u8。返回值 :子函数max调用完之后,通过return(z);语句把函数值z返回给主函数,即c=max(a,b);等价于c=z; ;因为c的数据类型为u8,所以函数返回值的类型也是u8。u8 max(u8 x,u8 y)第一个u8为函数返回值类型,其余为参数的数据类型。#include HT66F40.h#define u8 unsigned char/程序中u8与unsigned char 等价u8 a,b,c;/声明变量a,b,cu8 max(u8 x,u8 y);/声明函数max,函数功能为比较两个数大小void main()a=3;/3赋值给变量ab=4;/4赋值给变量bwhile(1)/while循环结构,当小括号里内容为真,执行while大括号/里的内容_nop();/空指令_nop();/空指令c=max(a,b);/max函数调用u8 max(u8 x,u8 y)/max函数功能的编写u8 z;/定义变量z,只在max函数里才有效z=xy?x:y;/如果x大于y,z=x;反之,z=y;return(z);/返回z的值给主函数 无返回值,有参数函数例如:显示功能函数,#include “ht66f40.h”#define u8 unsigned charu8 display_data;void display(display_data);void main()while(1)display(0x55);void display(display_data)_nop();/显示的实际功能先用空指令代替_nop();/显示的实际功能先用空指令代替功能说明;函数调用时,把显示的数据0x55通过参数传递给display_data;显示完毕后,并不需要返回一个函数值,因此函数的返回类型为空。3、 常量、变量及变量的数据类型介绍(1) 常量 以实际的数值出现在程序里面例如:二进制常量 0b10101010十进制常量 170十六进制常量 0xAA 符号常量在程序中,用一个符号来表示一个常量。例如:#define time50/程序中,用time来表示50这个常量 查表常量const unsigned char tab10= 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09; 数据存放在单片机ROM里面,10代表有10个数; tab0表示第一个数,tab1表示第二个数tab9表示第十个数。(2) 变量及其数据类型 程序执行过程中,需要暂存一些数据,例如标志位,执行次数,AD采样数据等,因此就需要定义变量来储存这些数据的。 由于变量占用ROM空间或RAM空间,因此在使用变量前,需要定义变量的数据类型,以便让编译器配置存放变量的空间。 基本数据类型Type(数据类型)Size(bits)范围大小bit10,1unsigned char80255或00xFFunsigned int16065535或00xFFFFunsigned long3204294967295或00xFFFFFFFF例如:bit flag;/声明一个名称为flag的位变量 unsigned char temp1; /声明一个名称为temp1的字节变量 unsigned int temp2; /声明一个名称为temp2的双字节变量 unsigned long temp3; /声明一个名称为temp3的四字节变量 temp1=10;/变量的赋值, temp2=0x09;/变量的赋值,注:变量声明时,如果没有进行初始化,那么变量的值是随机的。 构造数据类型 数组是指由同一种基本数据类型的数组成的一组数据。 例如:unsigned char tab10=;/声明一个名称为tab的数组,它是由10/个字节变量组成的。 /这10个变量分别是tab0、tab1tab9 数组在声明时不能进行初始化,需用户在主函数里进行初始化。 例如:unsigned char i;/声明一个字节变量unsigned char tab10;/声明一个长度为10的字节变量数组for(i=0;i10;i+)/for循环结构,请参考下面章节tabi=0; /上述代码等于tab0=0;tab1=0;tab9=0 变量命名规则第一个字符必须是英文字母或底线符号”_”,之后可紧接字母或数字。 变量名不能超过32个字符。 英文字母的大小写是有区别的。 例如:count,count2,_count,_count2 变量的有效范围 定义在函数里面,变量有效范围在此函数范围内。 定义在函数外面,变量有效范围是整个程序。第一课时总结案例1#include “ht66f50.h”#define u8 unsigned char/程序中出现u8,实际会用unsigned char代替#define u16unsigned int/程序中出现u16,实际会用unsigned int代替#define u32unsigned long /程序中出现u32,实际会用unsigned long代替#define time 50/程序中出现time,实际会用50代替#pragma rambank0/把下面定义的变量都存放在RAM的区域0bitflag1;/声明位变量flag1bit flag2;/声明位变量flag2u8i;/声明字节变量iu8count;/声明字节变量countu8 temp1;/声明字节变量temp1u16 temp2;/声明双字节变量temp2u32 temp3;/声明四字节变量temp3u8 tab10;/声明长度为10的字节变量数组void mcu_init();/声明子函数,单片机初始化void main(void)mcu_init();/调用子函数,单片机初始化while(1)flag1=0;/把0赋值给flag1flag2=1;/把1赋值给flag2count=time;/把time赋值给count,实际是把50赋值给counttemp1=0xff;/把0xff赋值给temp1temp2=0xffff;/把0xffff赋值给temp2temp3=0xffffffff;/把0xffffffff赋值给temp3void mcu_init()/单片机初始化子函数的编写_acerl=0x00;/AD通道都作为普通I/O口功能_cp0c=0x08;/关闭比较器0_cp1c=0x08;/关闭比较器1for(i=0;ic;表达式和表达式语句的区别:表达式:由运算符和数据构成的式子例如:a 大于/例如ab,如果a大于b,则结果为1;否则结果为0=大于或等于/参考上述小于/参考上述向右移位/0b101010101=0b01010101;右移1位向左移位/0b101010101=0b01010100;左移1位2、程序流程控制(1)if选择结构(2选1选择结构) if(条件表达式)语句1;/如果条件表达式为真,执行语句1;else语句2;/如果条件表达式为假,执行语句2;小技巧:如果没有语句2,else可以忽略不写。例如:#include “ht66f40.h”#define u8 unsigned char/程序中出现u8,实际会用unsigned char代替#define u16unsigned int#define u32unsigned long#pragma rambank0bit flag;u8 count;void main()flag=1;/把1赋值给位变量flagwhile(1)if(flag!=1)/如果位变量flag不等于1count=2;/执行把2赋值给字节变量countelse/如果位变量flag等于1count=3;/执行把3赋值给字节变量count if语句嵌套:要注意哪个括号是属于哪个if或else的格式: if(表达式1)/如果表达式1为真,执行if大括号里的内容/即执行语句1和第二个if语句语句1;if(表达式2)/如果表达式2为真,执行if大括号里的内容/即执行语句2语句2; else/如果表达式2为假,,执行else大括号里的内容/即执行语句3语句3; else/如果表达式1为假,执行else大括号里的内容/即执行语句4语句4;(2)switch(表达式)/多选1选择结构case 常量表达式1:语句1;break;case 常量表达式2:语句2;break;case 常量表达式3:语句3;break;default:break;/其他功能说明:根据switch后面括号表达式的值来选择执行哪一个case后面的语句,执行到break;程序会跳出switch结构。例如:#include “ht66f50.h”#define u8 unsigned char/程序中出现u8,实际会用unsigned char代替#define u16unsigned int#define u32unsigned long #define time 50#pr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论