- 164.13 KB
- 2022-08-11 发布
- 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
- 网站客服QQ:403074932
第一课时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大于//例如a>b,如果a大于b,则结果为1;否则结果为0>=大于或等于//参考上述<小于//参考上述<=小于或等于//参考上述==等于//参考上述!=不等于//参考上述③逻辑运算符取运算符两边数据的真假值做逻辑运算,运算结果是真(1)或假(0)。&&与运算//0xf0&&0x00=0;0xf0&&0x08=1;||或运算//0xf0||0x00=1;0x00||0x00=0;\n!非运算//!0xf0=0;!0=1;④位逻辑运算符两个数位与位进行操作。&位与//0b11111111&0b10101010=0b10101010;//1&1=1;1&0=0;0&1=0;0&0=0;//两个1为1,其余为0|位或//0b11111111|0b10101010=0b11111111;//1|1=1;1|0=1;0|1=1;0|0=0;//两个0为0,其余为1^位异或//0b11111111^0b10101010=0b01010101;//1^1=0;1^0=1;0^0=0;//相同为0,不同为1~位取反//~1=0;~0=1;>>向右移位//0b10101010>>1=0b01010101;右移1位<<向左移位//0b10101010<<1=0b01010100;左移1位2、程序流程控制(1)if选择结构(2选1选择结构)①if(条件表达式){语句1;}//如果条件表达式为真,执行语句1;else{语句2;}//如果条件表达式为假,执行语句2;——小技巧:如果没有语句2,else可以忽略不写。例如:#include“ht66f40.h”#defineu8unsignedchar//程序中出现u8,实际会用unsignedchar代替#defineu16unsignedint#defineu32unsignedlong#pragmarambank0bitflag;u8count;voidmain(){flag=1;//把1赋值给位变量flagwhile(1){if(flag!=1)//如果位变量flag不等于1{count=2;//执行把2赋值给字节变量count\n}else//如果位变量flag等于1{count=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”#defineu8unsignedchar//程序中出现u8,实际会用unsignedchar代替#defineu16unsignedint#defineu32unsignedlong\n#definetime50#pragmarambank0//把下面定义的变量都存放在RAM的区域0bitflag1;bitflag2;u8count;u8temp1;u16temp2;u32temp3;voidmcu_init();//声明子函数,单片机初始化voidmain(void){mcu_init();//调用子函数,单片机初始化while(1){temp1=2;switch(temp1){case1:count=10;break;//如果temp1==1;执行case2:count=20;break;//如果temp1==2;执行case3:count=30;break;//如果temp1==3;执行default:break;//如果temp1是其他值,执行}}}voidmcu_init(){_acerl=0x00;_cp0c=0x08;_cp1c=0x08;}(2)循环结构①while循环while(表达式){语句;}功能说明:判断表达式是否成立;——成立执行语句;——不成立跳出while循环;例如:while(1){}\n②for循环for(表达式1;表达式2;表达式3;){语句;}功能说明:先执行表达式1;判断表达式2是否成立;——成立执行语句,执行表达式3,跳回判断表达式2是否成立;——不成立跳出for循环;例如:unsignedchari;//声明一个字节变量unsignedchartab[10];//声明一个长度为10的字节变量数组for(i=0;i<10;i++)//for循环结构,请参考下面章节{tab[i]=0;}《第二课时总结》——案例2软件功能:用定时器实现1分钟的计时,用2位数码管显示。