51单片机c语言总结doc.docx
《51单片机c语言总结doc.docx》由会员分享,可在线阅读,更多相关《51单片机c语言总结doc.docx(7页珍藏版)》请在冰豆网上搜索。
![51单片机c语言总结doc.docx](https://file1.bdocx.com/fileroot1/2023-2/23/658255bc-e535-4b2d-ae3c-b0e9f7c4c056/658255bc-e535-4b2d-ae3c-b0e9f7c4c0561.gif)
51单片机c语言总结doc
51单片机c语言总结
【】?
?
字符型数组中的个字符数据在单片机中是以字符的ASCII存放的,正确的使用指针,可以有效地表示复杂的数据类型,动态分配内存,方便的使用字符串,有效地使用数组。
指针本身就具有地址还存在一个地址,Unsignedchar*p;Unsignedchara;P=Unsignedchar*a[]={数组的指针Unsignedchara[]={0,1,2,3};Unsignde*p;P=P[i]+j为P[i][j]实例26未细看返回值是通过return语句获得的。
如果函数无返回值,需要用void来声明。
数组作为函数参数一个数组的名字表示该数组的首地址,所以用数组名作为函数的参数时。
被传递的数组的首地址,被调用函数的参数的形式须是定义为指针型变量。
用数组名作为函数的参数时,应该在主调函数和被调函数中都进行数组定义。
定义的数组类型必须一致。
编译器不检查形参数组的长度p109函数?
?
函数型指针一个函数在编译时,就分配了一个入口地址,这个入口地址就是函数的指针,类型说明符(*指针变量名)(形参列表)Int(*p)(inta,intb)(*p)(a,b)这些需要思考p110页。
P1=z/256;取得z的高八位P2=z/256;取得z的低八位?
?
?
?
While
(1);无限循环防止程序跑飞。
实例30用有参函数控制p0口8位流水灯的流水速度P113实例31不实用?
?
、实例32实例33是不错的c语言程序函数调用。
练习c语言p115p116实例34不错c语言程序p118指针数组适合用来指向若干个字符串,尤其是各列字符串长度不一致的情形,这对于字符的液晶显示等很有意义。
实际运用液晶等显示器显示字符时,如果液晶的接口通过P0口和单片机连接,将各字符串送入p0口,实际上就是送入液晶显示器。
实例35#includeP0=isalpha(’_’)?
0xf0:
0x0f;内部函数文件instrins.h中有_crol_()函数实例36;应用内部函数文件instrins.h中有_crol_()函数来点亮P3口8位流水灯_crol_(15,2)的返回值为00111100B=0x3c思考他的应用实例37实例38感觉像是介绍函数以后?
?
?
?
c语言应用程序卡那可可能看看C语言编译预处理宏定义c语言允许一个标示符来表示一个字符串,称为宏。
P125宏定义不是c语句,所以不需加分号。
可以用#undef命令来终止宏定义的作用域。
即对#undef后面的无用。
为防止歧义应加括号及时带参数的函数宏和函数不同,函数是先求出实参表达式的值,然后代入形参,而带参数的宏只是进行简单的字符替换。
实例40文件包含应用举例使用头文件为#include中有关特殊功能寄存器的定义已将P3_0定义为P3.0引脚,直接应用P3_0就可以对P3口进行操作了。
实例41条件编译应用举例常用的条件编译是根据某常量表达式的值的是否为真来控制编译即#if常量表达式程序段1#else程序段2#endif?
?
思考好的应用第五章单片机的定时器计数器当加在定时器计数器T0或T1用作计数器时,对外接晶振产生的振荡信号经12分频后,提供给计数器,作为计数器的脉冲输入,计数器以12分频后的脉冲周期为基本计数单位,对输入的脉冲进行计数,直至产生溢出。
?
?
?
P136页到p140页有点不懂。
工作方式图p135T0或T1引脚上的外部脉冲信号出现一个由1到0的负跳变时,计数器加1,直至计数器溢出。
CPU是按顺序进行工作的。
实例42用计时器T0查询方式控制P2口的8位LED闪烁T0工作于方式1,LED灯的闪烁周期为100ms,即亮50ms,熄灭50ms;12分频即频率被12等分,周期即12除频率定时器的初值设定需要进行计算,总而言之,就是定时器必须达到顶值即65536.初值需要T0的高八位寄存器TH0和低八位寄存器TL0分别存储存储方法及TH0=/256;TL0=%256;溢出标志位是否为1若为1表示时间已到,否则,等待。
//实例42:
用定时器T0查询方式P2口8位控制LED闪烁#include//包含51单片机寄存器定义的头文件/**************************************************************函数功能:
主函数**************************************************************/voidmain(void){//EA=1;//开总中断//ET0=1;//定时器T0中断允许TMOD=0x01;//使用定时器T0的模式1TH0=(65536-46083)/256;//定时器T0的高8位赋初值TL0=(65536-46083)%256;//定时器T0的高8位赋初值TR0=1;//启动定时器T0TF0=0;P2=0xff;while
(1)//无限循环等待查询{while(TF0==0)//查询标志位是否溢出;TF0=0;P2=~P2;按位取反,实现led灯的闪烁TH0=(65536-46083)/256;//定时器T0的高8位赋初值TL0=(65536-46083)%256;//定时器T0的高8位赋初值}}TFO记忆flow溢出TRO记忆trigger引起启动THO记忆high高八位TMOD记忆mode方式实例43,用定时器t1查询方式控制单片机发出1kHz音频//实例43:
用定时器T1查询方式控制单片机发出1KHz音频#include//包含51单片机寄存器定义的头文件sbitsound=P3_;//将sound位定义为P3.7引脚/**************************************************************函数功能:
主函数**************************************************************/voidmain(void){//EA=1;//开总中断//ET0=1;//定时器T0中断允许TMOD=0x10;//使用定时器T1的模式1TH1=(65536-921)/256;//定时器T1的高8位赋初值TL1=(65536-921)%256;//定时器T1的高8位赋初值TR1=1;//启动定时器T1TF1=0;while
(1)//无限循环等待查询{while(TF1==0);TF1=0;sound=~sound;//将P3.7引脚输出电平取反TH1=(65536-921)/256;//定时器T0的高8位赋初值TL1=(65536-921)%256;//定时器T0的高8位赋初值}}//实例44:
将计数器T0计数的结果送P1口8位LED显示#include//包含51单片机寄存器定义的头文件sbitS=P3_;//将S位定义为P3.4引脚/**************************************************************函数功能:
主函数**************************************************************/voidmain(void){//EA=1;//开总中断//ET0=1;//定时器T0中断允许TMOD=0x02;//使用定时器T0的模式2TH0=256-156;//定时器T0的高8位赋初值TL0=256-156;//定时器T0的高8位赋初值TR0=1;//启动定时器T0while
(1)//无限循环等待查询{while(TF0==0)//如果未计满就等待{if(S==0)//按键S按下接地,电平为0P1=TL0;//计数器TL0加1后送P1口显示}TF0=0;//计数器溢出后,将TF0清0}}第六章单片机的中断系统中断系统类似写作业定时器计时器实际上就是中断源。
MCS51单片机提供5个中断源。
外部中断INT0一横编号0由P3.2引脚输入定时器T0编号1外部中断INT1一横编号2由P3.3引脚输入定时器T1编号3串行口通信中断RI或TI编号4自然优先级从上到下逐级递减。
P150p151页未看voidTime(void)interrupt1using0{}//实例46:
用定时器T0的中断实现长时间定时#include//包含51单片机寄存器定义的头文件sbitD1=P2_;//将D1位定义为P2.0引脚unsignedcharCountor;//设置全局变量,储存定时器T0中断次数/**************************************************************函数功能:
主函数**************************************************************/voidmain(void){EA=1;//开总中断ET0=1;//定时器T0中断允许TMOD=0x01;//使用定时器T0的模式2TH0=(65536-46083)/256;//定时器T0的高8位赋初值TL0=(65536-46083)%256;//定时器T0的高8位赋初值TR0=1;//启动定时器T0Countor=0;//从0开始累计中断次数while
(1)//无限循环等待中断;}/**************************************************************函数功能:
定时器T0的中断服务程序**************************************************************/voidTime0(void)interrupt1using0//“interrupt”声明函数为中断服务函数//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{Countor++;//中断次数自加1if(Countor==20)//若累计满20次,即计时满1s{D1=~D1;//按位取反操作,将P2.0引脚输出电平取反Countor=0;//将Countor清0,重新从0开始计数}TH0=(65536-46083)/256;//定时器T0的高8位重新赋初值TL0=(65536-46083)%256;//定时器T0的高8位重新赋初值}定时器T0工作于方式1时,最大可计脉冲数次数为65536,对于11。
0592MHz的时钟频率。
一个脉冲的宽度为1.085μs,则最大计时长度只有1.085×65536=71107μs即大约71ms,要想计时更长时间,采用软件计时的方法设置一个变量counter来存储定时器T0的中断次数,即每产生一次中断,使变量counter自加1,如果T0每50ms中断一次,那当counter自加20次时,所及时间为1s。
中断一次就要重新赋值一次控制两个LED灯以不同的周期闪烁,第一个LED亮灭时间为100ms,第二个LED亮灭时间为400ms,所以需要设置两个变量counter1和counter2来分别统计中断次数,且都为最小的整数倍。
//实例47:
用定时器T1中断控制两个LED以不同周期闪烁#include//包含51单片机寄存器定义的头文件sbitD1=P2_;//将D1位定义为P2.0引脚sbitD2=P2_;//将D2位定义为P2.1引脚unsignedcharCountor1;//设置全局变量,储存定时器T1中断次数unsignedcharCountor2;//设置全局变量,储存定时器T1中断次数/**************************************************************函数功能:
主函数**************************************************************/voidmain(void){EA=1;//开总中断ET1=1;//定时器T1中断允许TMOD=0x10;//使用定时器T1的模式1TH1=(65536-46083)/256;//定时器T1的高8位赋初值TL1=(65536-46083)%256;//定时器T1的高8位赋初值TR1=1;//启动定时器T1Countor1=0;//从0开始累计中断次数Countor2=0;//从0开始累计中断次数while
(1)//无限循环等待中断;}/**************************************************************函数功能:
定时器T1的中断服务程序**************************************************************/voidTime1(void)interrupt3using0//“interrupt”声明函数为中断服务函数//其后的3为定时器T1的中断编号;0表示使用第0组工作寄存器7Countor1++;//Countor1自加1Countor2++;//Countor2自加1if(Countor1==2)//若累计满2次,即计时满100ms{D1=~D1;//按位取反操作,将P2.0引脚输出电平取反Countor1=0;//将Countor1清0,重新从0开始计数}if(Countor2==8)//若累计满8次,即计时满400ms{D2=~D2;//按位取反操作,将P2.1引脚输出电平取反Countor2=0;//将Countor1清0,重新从0开始计数}TH1=(65536-46083)/256;//定时器T1的高8位重新赋初值TL1=(65536-46083)%256;//定时器T1的高8位重新赋初值}实现方法先开总中断EA分支中断ET?
选择方式,赋初值,启动定时器T?
,声明音调与频率的关系音调低1低2低3低4低5低6低7频率262294330349392440494音调中1中2中3中4中5中6中7频率523587659698784880988音调高1高2高3高4高5高6高7频率1046117513181397156817601967由于单片机的输入输出口只有高电平1和低电平0,因此向蜂鸣器输送的电平信号实际是就是该音频的方波。
例如中音频率523Hz,他的周期为1÷523秒,即1。
93ms只要向蜂鸣器输送周期为1.91ms的脉冲方波电平信号就能发出523Hz的音调,该方波的半周期为1.91÷2=0.995ms。
为此,需要利用定时器的中断,让输送给蜂鸣器的电平信号每0。
955ms取反一次即可,由于本书使用的单片机晶振为11.0952mhz,他的机器周期为12×(1÷11。
0592)=1.085μs。
因此需要的机器周期总数为995μs÷1.085μs=880定时器的定时常数为880C=10_μs除2f÷1.085μs=460830÷频率THO=(8192-C)÷32?
?
?
每分钟为72节拍,每节拍1000×60ms÷72=833ms//实例49:
用定时器T0的中断实现“渴望“主题曲的播放#include//包含51单片机寄存器定义的头文件sbitsound=P3_;//将sound位定义为P3.7unsignedintC;//储存定时器的定时常数//以下是C调低音的音频宏定义#definel_dao262//将“l_dao”宏定义为低音“1”的频率262Hz#definel_re286//将“l_re”宏定义为低音“2”的频率286Hz#definel_mi311//将“l_mi”宏定义为低音“3”的频率311Hz#definel_fa349//将“l_fa”宏定义为低音“4”的频率349Hz#definel_sao392//将“l_sao”宏定义为低音“5”的频率392Hz#definel_la440//将“l_a”宏定义为低音“6”的频率440Hz#definel_xi494//将“l_xi”宏定义为低音“7”的频率494Hz//以下是C调中音的音频宏定义#definedao523//将“dao”宏定义为中音“1”的频率523Hz#definere587//将“re”宏定义为中音“2”的频率587Hz#definemi659//将“mi”宏定义为中音“3”的频率659Hz#definefa698//将“fa”宏定义为中音“4”的频率698Hz#definesao784//将“sao”宏定义为中音“5”的频率784Hz#definela880//将“la”宏定义为中音“6”的频率880Hz#definexi987//将“xi”宏定义为中音“7”的频率523H//以下是C调高音的音频宏定义#defineh_dao1046//将“h_dao”宏定义为高音“1”的频率1046Hz#defineh_re1174//将“h_re”宏定义为高音“2”的频率1174Hz#defineh_mi1318//将“h_mi”宏定义为高音“3”的频率1318Hz#defineh_fa1396//将“h_fa”宏定义为高音“4”的频率1396Hz#defineh_sao1567//将“h_sao”宏定义为高音“5”的频率1567Hz#defineh_la1760//将“h_la”宏定义为高音“6”的频率1