新概念51单片机C语言教程例题_第1页
新概念51单片机C语言教程例题_第2页
新概念51单片机C语言教程例题_第3页
新概念51单片机C语言教程例题_第4页
新概念51单片机C语言教程例题_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

目录例编写程序,点亮第一个发光二极管(P27) -4-例利用for语句延时特性,编写第一个发光二极管以距离1S亮灭闪动的程序(P42) -5-例编写程序使第一个发光二极管以距离500ms亮灭闪动。(P48) -5-例编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。P49) -6-例利用C51自带库_crol_(),以距离500ms,实现流水灯程序(P53) -6-例编写程序使第一个数码管显示8(P59) -7-例让实验板上6个数码管同时点亮,依次显示0到F,时刻距离为,循环下去。(P61) -8-例第一个数码管显示1,时刻为,然后关闭它,当即让第二个数码管显示2,时刻为,在关闭它……一直到最后一个数码管显示6,时刻一样为,关闭它以后再回来显示第一个数码管,一直循环下去。(P62) -9-例利用按时器0工作方式1,在实验板上实现第一个发光管以1s亮灭闪烁。(P74) -11-例用按时器0的方式1实现个第一发光二极管以200ms距离闪烁,用按时器1的方式1实现数码管前两位59s循环计时。(P75) -12-例用数码管前两位显示一个十进制数,转变范围为00~59,开始时显示00,每按下S2键一次,数值加1;每按下S3键一次,数值减1;每按下S4键一次,数值归零;按下S5键一次,利用按时器功能使数值开始自动每秒加1,再次按下S5键,数值停止加1,维持显示原数。(P82) -14-例实验班上电时,数码管不显示,顺序按下矩阵键盘后,数码管上依次显示0~F,六个数码管同时静态显示即可。(P87) -17-例用单片机操纵ADC0804进行数模转换,当拧动实验板上A/D隔壁的电位时,在数码管的前三位以十进制方式显示出A/D转换后的数字量(8位A/D转换后数值在0~255转变)。(P107) -21-例用单片机操纵DAC0832芯片输出电流,让发光二级管D12由灭均匀变到最亮,再由最亮均匀熄灭。在最亮和最暗时利用蜂鸣器别离警报一声,完成整个周期时刻操纵在5S左右,循环转变。(P121) -23-例在上位机上用串口调试助手发送一个字符X,单片机收到字符后返回给上位机“IgetX”,串口波特率设为9600bps。(P137) -25-例单片机上电后等待从上位机串口发来的命令,同时在数码管的前三位以十进制方式显示A/D搜集的数值,在未收到上位机发送来的启动A/D转换命令之前数码管始终显示000。当收到上位机以十六进制发送来的01后,向上位机发送字符串“Turnonad!”同时刻隔1s读取一次A/D的值,然后把A/D搜集回来的8位二进制转换成十进制表示的实际电压浮点数,而且从串口发送给上位机,形式如“Thevoltageis”,发送周期也是一秒一次,同时在数码管上也要每秒刷新现实的数值。当收到上位机以十六进制发送过来的02后,向上位机发送字符串“Turnoffad!”,然后停止发送电压值,数码管上显示上次终止时维持的值。当收到上位机发来的其他任何数时,向上位机发送字符串“Error!”。 -27-例实现1602液晶的第一行显示“ILOVEMCU!”,在第二行显示。 -31-例实现1602第一行从左侧移入“Helloeveryone!”同时第二行从右边移入“Welcometohere!”,移入速度自定,然后停留在屏幕上。(P154) -33-例实现12232液晶的第一行显示“ILOVEMCU!”,第二行显示“我爱单片机”。(P160) -34-例实现12232液晶第一行从右边移入“Helloeveryone!”,同时第二行从右边移入“欢迎大伙儿来学习!”移入速度自定,最后停留在屏幕上。(P163) -37-例实此刻12864液晶上第一行显示“09”,而且让每一名数字随机转变,第二行显示“,第三行显示“天祥电子”,第四行对应第三行显示出下划线。(P173) -40-知识点:生成随机数(P176) -44-例利用按时器产生一个0~99秒转变的秒表,而且显示在数码管上,每过一秒将那个转变的数写入板上AT24C02内部。当关闭实验板电源,并再次打开实验板电源时,单片机先从AT24C02中将原先写入的数读掏出来,接着此数继续转变并显示在数码管上。(P188) -48-例利用按时器0工作方式0,在实验板上实现第一个发光管以1s亮灭闪烁。(P203) -53-例利用按时器0工作方式2,在实验板上实现第一个发光管以1s亮灭闪烁。(P204) -54-例利用按时器工作方式3,在实验板上实现:用TL0计数器对应的8位按时器实现第一个发光管以1s亮灭闪烁,用TH0计数器对应的8位按时器实现第二个发光管以亮灭闪烁。(P206) -54-例利用计数器0工作方式1,在实验板上实现:用一根导线一端连接GND引脚,另一端去接触T0引脚,每接触一下,计数器计一次数,将所计的数值实时显示在数码管的前两位,计满100时清0,再从头计起。(P214) -55-例设置单片机串行口的工作模式0,距离循环发送十六进制数0xAA,然后用双路示波器观看和口波形。( -58-例用交叉串口线连接两块实验板,或直接用短线交叉线连接连个单片机的和口(共地)。在一块板上编写矩阵键盘扫描程序,当扫描到有键按下时,将键值通过串口发送出去,另一块板上单片机收到串口发送来的键值后,将对应键值以0~F方式显示在数码管上。 -60-例程序分为主机程序和从机程序,约定一次传送的数据为16B,以02H地址的从机为例。(图为多机通信主机程序流程图) -65-图为多机通信从机程序流程图。 -68-从机程序代码:(P234) -68-例指针利用例程:(P264) -71-例编写程序实现:开启两个外部中断,设置低电平触发中断,用按时器计数而且显示在数码管的前两位,当计数到5时,使单片机进入空闲(休眠)模式,同时关闭按时器,当单片机响应外部中断后,从空闲(休眠)模式返回,同时开启按时器。( -72-例实验板上实现如下描述:程序启动后设定看门狗溢出时刻为2s,然后点亮第一个发光二极管,稍延时一会,然后熄灭发光二极管,使程序进入等待死循环状态,而且在死循环中大约每隔1s喂狗一次,看程序运行是不是正常。 -74-例在实验板上实现:操作STC单片机自带的E2PROM,存储一组按秒递增的两位数据,而且将数据实时显示在数码管上,数据每转变一次就往E2PROM中写入一次,当关闭实验板电源并再次开启电源时,从E2PROM中读取先前存储的数据,接着递增显示。 -77-例系列单片机的A/D转换功能。时钟,转换结果以16进制形式输出到串行口,能够用串行口调试程序,观看输出结果(本代码摘自宏晶科技芯片手册,经作者调试可正常运行)。 -80-例给出一个STC12C5412AD应用的参考程序。(P287) -82-程序利用51单片机的按时器设计一个时钟。 -89-程序利用DS12C887时钟芯片设计高精度时钟。 -97-程序利用TX-1C实验板上的DS18B20温度传感器设计温控系统C语言源代码(P349) -108-程序太阳能充/放电操纵器C语言源代码 -114-ISD400x系列语音芯片C语言参考程序: -134-例利用TX-1C实验板上两个独立按键调剂直流电机的转速,同时在实验板的数码管上象征性的显示相应的转速值。通过操纵单片机输出不同占空比的PWM信号来操纵直流电机的转速(感性熟悉)。(P434) -138-例步进电机应用C语言程序设计(P444) -142-例舵机应用C语言程序设计实例:开机时舵机角度自动转为0度,通过实验板上的独立按键调剂舵机的角度转动,而且在实验板数码管上显示相应的角度。本例仅演示5个角度的操纵,若想实现任意角度操纵请大伙儿自行编程实验。程序代码如下:(P453) -145-Allrightsreserved.ModificationaccordingtoDataSheetfromApril1999-SFR'sAUXRandAUXR1addedfor80C51Rx+derivatives*//*BYTERegisters*/sfrP0=0x80;sfrP1=0x90;sfrP2=0xA0;sfrP3=0xB0;sfrPSW=0xD0;sfrACC=0xE0;sfrB=0xF0;sfrSP=0x81;sfrDPL=0x82;sfrDPH=0x83;sfrPCON=0x87;sfrTCON=0x88;sfrTMOD=0x89;sfrTL0=0x8A;sfrTL1=0x8B;sfrTH0=0x8C;sfrTH1=0x8D;sfrIE=0xA8;sfrIP=0xB8;sfrSCON=0x98;sfrSBUF=0x99;/*80C51Fx/RxExtensions*/sfrAUXR=0x8E;/*sfrAUXR1=0xA2;*/sfrSADDR=0xA9;sfrIPH=0xB7;sfrSADEN=0xB9;sfrT2CON=0xC8;sfrT2MOD=0xC9;sfrRCAP2L=0xCA;sfrRCAP2H=0xCB;sfrTL2=0xCC;sfrTH2=0xCD;/*BITRegisters*//*PSW*/sbitCY=PSW^7;sbitAC=PSW^6;sbitF0=PSW^5;sbitRS1=PSW^4;sbitRS0=PSW^3;sbitOV=PSW^2;sbitP=PSW^0;/*TCON*/sbitTF1=TCON^7;sbitTR1=TCON^6;sbitTF0=TCON^5;sbitTR0=TCON^4;sbitIE1=TCON^3;sbitIT1=TCON^2;sbitIE0=TCON^1;sbitIT0=TCON^0;/*P3*/sbitRD=P3^7;sbitWR=P3^6;sbitT1=P3^5;sbitT0=P3^4;sbitINT1=P3^3;sbitINT0=P3^2;sbitTXD=P3^1;sbitRXD=P3^0;/*SCON*/sbitSM0=SCON^7;#include<>Allrightsreserved.ModificationaccordingtoDataSheetfromApril1999-SFR'sAUXRandAUXR1addedfor80C51Rx+derivatives*//*BYTERegisters*/sfrP0=0x80;sfrP1=0x90;sfrP2=0xA0;sfrP3=0xB0;sfrPSW=0xD0;sfrACC=0xE0;sfrB=0xF0;sfrSP=0x81;sfrDPL=0x82;sfrDPH=0x83;sfrPCON=0x87;sfrTCON=0x88;sfrTMOD=0x89;sfrTL0=0x8A;sfrTL1=0x8B;sfrTH0=0x8C;sfrTH1=0x8D;sfrIE=0xA8;sfrIP=0xB8;sfrSCON=0x98;sfrSBUF=0x99;/*80C51Fx/RxExtensions*/sfrAUXR=0x8E;/*sfrAUXR1=0xA2;*/sfrSADDR=0xA9;sfrIPH=0xB7;sfrSADEN=0xB9;sfrT2CON=0xC8;sfrT2MOD=0xC9;sfrRCAP2L=0xCA;sfrRCAP2H=0xCB;sfrTL2=0xCC;sfrTH2=0xCD;/*BITRegisters*//*PSW*/sbitCY=PSW^7;sbitAC=PSW^6;sbitF0=PSW^5;sbitRS1=PSW^4;sbitRS0=PSW^3;sbitOV=PSW^2;sbitP=PSW^0;/*TCON*/sbitTF1=TCON^7;sbitTR1=TCON^6;sbitTF0=TCON^5;sbitTR0=TCON^4;sbitIE1=TCON^3;sbitIT1=TCON^2;sbitIE0=TCON^1;sbitIT0=TCON^0;/*P3*/sbitRD=P3^7;sbitWR=P3^6;sbitT1=P3^5;sbitT0=P3^4;sbitINT1=P3^3;sbitINT0=P3^2;sbitTXD=P3^1;sbitRXD=P3^0;/*SCON*/sbitSM0=SCON^7;//alternatively"FE"sbitFE=SCON^7;sbitSM1=SCON^6;sbitSM2=SCON^5;sbitREN=SCON^4;sbitTB8=SCON^3;sbitRB8=SCON^2;sbitTI=SCON^1;sbitRI=SCON^0;sbitT2EX=P1^1;sbitT2=P1^0;/*T2CON*/sbitTF2=T2CON^7;sbitEXF2=T2CON^6;sbitRCLK=T2CON^5;sbitTCLK=T2CON^4;sbitEXEN2=T2CON^3;sbitTR2=T2CON^2;sbitC_T2=T2CON^1;sbitCP_RL2=T2CON^0;/*PCAPin*/sbitCEX3=P2^4;sbitCEX2=P2^0;sbitCEX1=P3^5;sbitCEX0=P3^7;sbitECI=P3^4;/*IE*/sbitEA=IE^7;sbitEPCA_LVD=IE^6;sbitEADC_SPI=IE^5;sbitES=IE^4;sbitET1=IE^3;sbitEX1=IE^2;sbitET0=IE^1;sbitEX0=IE^0;/*IP*/sbitPPCA_LVD=IP^6;sbitPADC_SPI=IP^5;sbitPS=IP^4;sbitPT1=IP^3;sbitPX1=IP^2;sbitPT0=IP^1;sbitPX0=IP^0;ISD400x系列语音芯片C语言参考程序:(P425)#include<>#include<>sbitcs_4004=P0^0;sbitsclk_4004=P0^3;sbitmosi_4004=P0^1;sbitmiso_4004=P0^2;sbitrac_4004=P0^4;sbitint_4004=P0^5;voiddelay(unsignedinti)//延时程序{ while(i--);}voidstopmode()//停止{ unsignedcharm,i,j; cs_4004=1; sclk_4004=0; cs_4004=0; m=0x30; for(i=0;i<8;i++) { m=_cror_(m,1); j=m<<1; mosi_4004=CY; sclk_4004=0; sclk_4004=1; } cs_4004=1;}voidpowerdown()//下电{ unsignedcharm,i,j; cs_4004=1; sclk_4004=0; cs_4004=0; m=0x10; for(i=0;i<8;i++) { m=_cror_(m,1); j=m<<1; mosi_4004=CY; sclk_4004=0; sclk_4004=1; } cs_4004=1;}voidpowerup()//上电{ unsignedcharm,i,j; cs_4004=1; sclk_4004=0; cs_4004=0; m=0x20; for(i=0;i<8;i) { m=_cror_(m,1); j=m<<1; mosi_4004=CY; sclk_4004=0; sclk_4004=1; } cs_4004=1;}voidrecord4004(unsignedintaddress){//录音address--录音地址02400 unsignedchari,m,j; unsignedintdatasoute=0; powerup(); delay(5118);//上电延时 powerup(); delay(5118);//上电延时 delay(5118);//上电延时 cs_4004=1; sclk_4004=0; m=0xa0; cs_4004=0; for(i=0;i<16;i++) { address=_iror_(address,1); datasoute=address<<1; mosi_4004=CY; sclk_4004=0; sclk_4004=1; } for(i=0;i<8;i++) { m=_cror_(m,1); j=m<<1; mosi_4004=CY; sclk_4004=0; sclk_4004=1; } cs_4004=1; sclk_4004=0; m=0xb0; cs_4004=0; for(i=0;i<8;i++) { m=_cror_(m,1); j=m<<1; mosi_4004=CY; sclk_4004=0; sclk_4004=1; } cs_4004=1; P0=0xff; datasoute=0; while(int_4004==1)//存储地址换行标志 { if(rac_4004)//记录本次录音所占的行数(也确实是本次录音有多大) { delay(20000); datasoute++; }//在那个地址应该加上自己的程序,确实是录音退出程序 }}//whileend;voidaudioout(unsignedintaddress)//放音程序{ unsignedchari,m,j; unsignedintdatasoute; powerup(); cs_4004=1; sclk_4004=0; cs_4004=0; m=0xe0; for(i=0;i<16;i++) { address=_iror_(address,1); datasoute=address<<1; sclk_4004=0; mosi_4004=CY; sclk_4004=1; } for(i=0;i<8;i++) { m=_cror_(m,1); j=m<<1; sclk_4004=0; mosi_4004=CY; sclk_4004=1; } cs_4004=1; sclk_4004=0; m=0xf0; cs_4004=0; for(i=0;i<8;i) { m=_cror_(m,1); j=m<<1; sclk_4004=0; mosi_4004=CY; sclk_4004=1; } cs_4004=1; P0=0xff; while(int_4004==1) { }}voidmain(){ record4004(0); audioout(0); while(1);}例利用TX-1C实验板上两个独立按键调剂直流电机的转速,同时在实验板的数码管上象征性的显示相应的转速值。通过操纵单片机输出不同占空比的PWM信号来操纵直流电机的转速(感性熟悉)。(P434)#include<>#defineucharunsignedcharsbitdula=P2^6;//数码管显示段选I/O口概念sbitwela=P2^7;//数码管显示段选I/O口概念sbitdianji=P1^7;//操纵电机I/O口概念sbitjia_key=P3^6;//加速键sbitjian_key=P3^7;//减速键ucharnum=0,show_num=1,gao_num=1,di_num=3;ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelay(uchari)//延时函数{ucharj,k;for(j=i;j>0;j--)for(k=125;k>0;k--);}voiddisplay()//数码管显示函数{dula=0;P0=table[show_num];dula=1;dula=0;wela=0;P0=0xfe;wela=1;wela=0;delay(5);P0=table[0];dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(5);P0=table[0];dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(5);P0=table[0];dula=1;dula=0;P0=0xf7;wela=1;wela=0;delay(5);}voidkey()//按键检测处置函数{if(jia_key==0){delay(5);//消抖 if(jia_key==0) { num++;//加速键按下,速度标志加1 if(num==4) num=3; //已经达到最大3,则保持 while(jia_key==0);//等待按键松开 }}if(jian_key==0){delay(5); if(jian_key==0) {if(num!=0) //减速键按下,速度标志减1num--; else num=0;//已经达到最小0,则维持 while(jian_key==0); }}}voiddispose()//依照速度标志进行数据处置{switch(num){case0:show_num=1;//数码管第一名显示的数据 gao_num=1;//PWM信号中高电平持续时刻标志为1 di_num=3;//PWM信号中低电平持续时刻标志为3,现在速度最慢 break;case1: show_num=2; gao_num=2; di_num=2; break;case2: show_num=3; gao_num=3; di_num=1; break;case3: show_num=4; gao_num=4; di_num=0;//现在速度最快 break;}}voidqudong()//操纵电机程序{uchari;if(di_num!=0){for(i=0;i<di_num;i++) { dianji=0;//实现PWM信号低电平输出 display();//利用显示函数起延时作用,如此也不阻碍数码管显示,一箭双雕 }}for(i=0;i<gao_num;i++){dianji=1;//实现PWM信号高电平输出 display();}}voidmain(){while(1){dianji=0; key(); dispose(); qudong();}}例步进电机应用C语言程序设计(P444)#include<>#defineucharunsignedcharsbitdula=P2^6;//数码管显示段选I/O口概念sbitwela=P2^7;//数码管显示位选I/O口概念sbitjia_key=P3^6;//电机加速I/O口概念sbitjian_key=P3^7;//电机减速I/O口概念sbitzf_key=P3^5;//电机正反转I/O概念bitflag=0;//电机正反转标志位ucharnum=0,show_num=2,maichong=4,table_begin=0;ucharcodetable1[]={0x01,0x02,0x04,0x08,0x08,0x04,0x02,0x01};//ucharcodetable1[]={0x09,0x03,0x06,0x0c,0x08,0x04,0x02,0x01};//ucharcodetable1[]={0x01,0x04,0x02,0x08,0x08,0x02,0x04,0x01};ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelay(uchari)//延时函数{ucharj,k;for(j=i;j>0;j--)for(k=125;k>0;k--);}voiddisplay()//显示函数{dula=0;P0=table[show_num];dula=1;dula=0;wela=0;P0=0xfe;wela=1;wela=0;delay(5);P0=table[0];dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(5);}voidkey()//按键检测处置函数{if(jia_key==0){delay(5);//加速键按下,消抖 if(jia_key==0) { num++;//速度标示加1 if(num==4) num=3; //达到最大3则保持 while(jia_key==0);//等待松开按键 }}if(jian_key==0){delay(5);//减速键按下 if(jian_key==0) {if(num!=0) num--;//速度标示减1 else num=0;//达到最小0则维持 while(jian_key==0); }}if(zf_key==0){delay(5);//正反转按键按下if(zf_key==0) { flag=~flag;//正反转标识取反 while(zf_key==0); }}}voiddispose()//依照速度标识进行数据处置{switch(num){case0:show_num=2;//数码管第一名显示的数字maichong=5;//利用maichong数据操纵送给电机脉冲的频率,操纵速度 break; case1: show_num=4;maichong=4; break; case2: show_num=6;maichong=3; break; case3: show_num=8;maichong=2; break;}if(flag==0){table_begin=0;//flag为0,正转}elsetable_begin=4;//flag为1,反转}voidqudong()//电机速度,和正反转操纵{uchari,j;for(j=0+table_begin;j<4+table_begin;j++){P1=table1[j];//读取操纵电机转动I/O口表for(i=0;i<maichong;i++) { display();//利用显示函数起延时作用,操纵电机速度 }//如此也不阻碍数码管显示,一箭双雕}}voidmain(){while(1){ key(); dispose(); qudong();}}例舵机应用C语言程序设计实例:开机时舵机角度自动转为0度,通过实验板上的独立按键调剂舵机的角度转动,而且在实验板数码管上显示相应的角度。本例仅演示5个角度的操纵,若想实现任意角度操纵请大伙儿自行编程实验。程序代码如下:(P453)//调剂舵机使之转动5个角度04590135180PWM信号周期为20ms,//操纵

温馨提示

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

评论

0/150

提交评论