- 2022-08-11 发布 |
- 37.5 KB |
- 14页
申明敬告: 本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
文档介绍
Holtek C语言学习教程
第一课时1、Holtek公司编译器HT-IDE3000使用说明(1)双击打开HT-IDE3000,进入编译器的界面,见下图:(2)单击“工程”——>选择“新建”,弹出下图窗口;——ProjectName:新建项目文件的名称,不建议使用中文名称;——ProjectLocation:项目文件存放的位置,勾选“Createdirectoryforproject”后,会自动建立一个文件夹,项目文件都存放在此文件夹内;——ProjectMCU:单片机的型号;——ChooseLanguageTool:选择编程语言,这里选择“V2”版本的C语言。\n(1)点击下一步,选择“.C”;(2)点击下一步,再点击下一步,点击OK,然后弹出“配置选项”,配置选择只要是对单片机一些功能和特性进行设置,例如工作电压,工作频率,看门狗等;(3)配置选项设置完后,点击OK,再点击确定,那么新的工程就建立完毕了。1、C语言程序设计(1)主函数每个程序只有一个主函数,程序是从主函数开始执行。格式:voidmain(){}例子:\n#include"HT66F40.h"voidmain()//程序从这里开始跑{_nop();//语句1_nop();//语句2_nop();//语句3}功能说明:程序执行的顺序,语句1—>语句2—>语句3。(1)子函数一个程序包含各种功能,如果每种功能都做成一个子函数,那么整个程序的架构实现了模块化。例如,LCD的开启,显示及关闭这三个功能可以分别做成三个独立的子函数。使用子函数的步骤:①编写子函数的功能voidTurnOn_LCD()//LCD开启子函数,TurnOn_LCD是函数的名称{_nop();//这里先用空指令代表子函数的功能_nop();//这里先用空指令代表子函数的功能}②声明子函数,告诉单片机有这个子函数存在voidTurnOn_LCD();技巧:直接把步骤①的第一行复制过来,然后在后面加上分号;③调用子函数TurnOn_LCD();例子:#include"HT66F40.h"voidTurnOn_LCD();//声明子函数,告诉单片机有这个子函数存在voidTurnOff_LCD();//声明子函数,告诉单片机有这个子函数存在voiddisplay_LCD();//声明子函数,告诉单片机有这个子函数存在voidmain(){_nop();//空指令_nop();//空指令_nop();//空指令while(1)//while循环结构,当小括号里内容为真,执行{//while大括号里的内容TurnOn_LCD();//调用LCD开启子函数display_LCD();//调用LCD显示子函数TurnOff_LCD();//调用LCD关闭子函数}}voidTurnOn_LCD()//编写子函数的功能,LCD开启子函数,TurnOn_LCD是\n{//函数的名称_nop();//这里先用空指令代表子函数的功能_nop();//这里先用空指令代表子函数的功能}voidTurnOff_LCD()//编写子函数的功能,LCD关闭子函数,TurnOff_LCD是{//函数的名称_nop();//这里先用空指令代表子函数的功能_nop();//这里先用空指令代表子函数的功能}voiddisplay_LCD()//编写子函数的功能,LCD显示子函数,display_LCD是{//函数的名称_nop();//这里先用空指令代表子函数的功能_nop();//这里先用空指令代表子函数的功能}(1)中断子函数使用中断子函数的步骤:①相关寄存器进行初始化(请查阅相关型号IC的PDF)②声明中断子函数地址格式:#pragmavector中断子函数名称@中断入口地址例如:#pragmavectorisr_tm0@0x14③编写中断子函数的功能例如:voidisr_tm0(){}例子:#include"HT66F40.h"#pragmavectorisr_tm0@0x14//声明中断子函数的入口地址voidmcu_init();//声明单片机初始化子函数voidmain(){mcu_init();while(1)//while循环结构,当小括号里内容为真,执行while{//大括号里的内容_nop();_nop();}}\nvoidisr_tm0()//编写中断子函数的功能{_t0af=0;//清除中断标志位_nop();//这里先用空指令代表中断子函数的功能}voidmcu_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-开启}(1)函数的返回值及参数的介绍①无返回值,无参数函数:前面介绍的函数均为无返回值无参数函数。例如:voidmain(){}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。u8max(u8x,u8y)——第一个u8为函数返回值类型,其余为参数的数据类型。\n#include"HT66F40.h"#defineu8unsignedchar//程序中u8与unsignedchar等价u8a,b,c;//声明变量a,b,cu8max(u8x,u8y);//声明函数max,函数功能为比较两个数大小voidmain(){a=3;//3赋值给变量ab=4;//4赋值给变量bwhile(1)//while循环结构,当小括号里内容为真,执行while大括号{//里的内容_nop();//空指令_nop();//空指令c=max(a,b);//max函数调用}}u8max(u8x,u8y)//max函数功能的编写{u8z;//定义变量z,只在max函数里才有效z=x>y?x:y;//如果x大于y,z=x;反之,z=y;return(z);//返回z的值给主函数}①无返回值,有参数函数例如:显示功能函数,#include“ht66f40.h”#defineu8unsignedcharu8display_data;voiddisplay(display_data);voidmain(){while(1){display(0x55);}}voiddisplay(display_data){_nop();//显示的实际功能先用空指令代替_nop();//显示的实际功能先用空指令代替}功能说明;函数调用时,把显示的数据0x55通过参数传递给display_data;\n显示完毕后,并不需要返回一个函数值,因此函数的返回类型为空。1、常量、变量及变量的数据类型介绍(1)常量①以实际的数值出现在程序里面例如:二进制常量0b10101010十进制常量170十六进制常量0xAA②符号常量在程序中,用一个符号来表示一个常量。例如:#definetime50//程序中,用time来表示50这个常量③查表常量constunsignedchartab[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};——数据存放在单片机ROM里面,10代表有10个数;——tab[0]表示第一个数,tab[1]表示第二个数……tab[9]表示第十个数。(2)变量及其数据类型①程序执行过程中,需要暂存一些数据,例如标志位,执行次数,AD采样数据等,因此就需要定义变量来储存这些数据的。由于变量占用ROM空间或RAM空间,因此在使用变量前,需要定义变量的数据类型,以便让编译器配置存放变量的空间。②基本数据类型Type(数据类型)Size(bits)范围大小bit10,1unsignedchar80~255或0~0xFFunsignedint160~65535或0~0xFFFFunsignedlong320~4294967295或0~0xFFFFFFFF例如:bitflag;//声明一个名称为flag的位变量unsignedchartemp1;//声明一个名称为temp1的字节变量unsignedinttemp2;//声明一个名称为temp2的双字节变量unsignedlongtemp3;//声明一个名称为temp3的四字节变量temp1=10;//变量的赋值,temp2=0x09;//变量的赋值,注:变量声明时,如果没有进行初始化,那么变量的值是随机的。③构造数据类型数组是指由同一种基本数据类型的数组成的一组数据。例如:unsignedchartab[10]={};//声明一个名称为tab的数组,它是由10//个字节变量组成的。//这10个变量分别是tab[0]、tab[1]……tab[9]数组在声明时不能进行初始化,需用户在主函数里进行初始化。例如:\nunsignedchari;//声明一个字节变量unsignedchartab[10];//声明一个长度为10的字节变量数组for(i=0;i<10;i++)//for循环结构,请参考下面章节{tab[i]=0;}//上述代码等于tab[0]=0;tab[1]=0;……tab[9]=0①变量命名规则——第一个字符必须是英文字母或底线符号”_”,之后可紧接字母或数字。——变量名不能超过32个字符。——英文字母的大小写是有区别的。例如:count,count2,_count,_count2②变量的有效范围——定义在函数里面,变量有效范围在此函数范围内。——定义在函数外面,变量有效范围是整个程序。《第一课时总结》——案例1#include“ht66f50.h”#defineu8unsignedchar//程序中出现u8,实际会用unsignedchar代替#defineu16unsignedint//程序中出现u16,实际会用unsignedint代替#defineu32unsignedlong//程序中出现u32,实际会用unsignedlong代替#definetime50//程序中出现time,实际会用50代替#pragmarambank0//把下面定义的变量都存放在RAM的区域0bitflag1;//声明位变量flag1bitflag2;//声明位变量flag2u8i;//声明字节变量iu8count;//声明字节变量countu8temp1;//声明字节变量temp1u16temp2;//声明双字节变量temp2u32temp3;//声明四字节变量temp3u8tab[10];//声明长度为10的字节变量数组voidmcu_init();//声明子函数,单片机初始化voidmain(void){mcu_init();//调用子函数,单片机初始化while(1){flag1=0;//把0赋值给flag1flag2=1;//把1赋值给flag2count=time;//把time赋值给count,实际是把50赋值给counttemp1=0xff;//把0xff赋值给temp1temp2=0xffff;//把0xffff赋值给temp2\ntemp3=0xffffffff;//把0xffffffff赋值给temp3}}voidmcu_init()//单片机初始化子函数的编写{_acerl=0x00;//AD通道都作为普通I/O口功能_cp0c=0x08;//关闭比较器0_cp1c=0x08;//关闭比较器1for(i=0;i<10;i++)//数组初始化{tab[i]=0;}}\n第二课时1、C程序架构(1)C语言的程序是由语句所组成,每条语句的最后必须有分号“;”做为结束符。①函数及变量的声明语句;例如:voidmcu_init();//声明子函数语句bitflag1;//声明变量语句②表达式语句,执行数学及逻辑运算;例如:temp1=0xff;//赋值语句Temp1=temp1-100;//减法运算语句temp=a||b;temp={a&&b)>c;表达式和表达式语句的区别:表达式:由运算符和数据构成的式子例如:a查看更多