新概念51单片机C语言教程例题.docx
《新概念51单片机C语言教程例题.docx》由会员分享,可在线阅读,更多相关《新概念51单片机C语言教程例题.docx(28页珍藏版)》请在冰豆网上搜索。
![新概念51单片机C语言教程例题.docx](https://file1.bdocx.com/fileroot1/2023-3/29/e6a65d28-9e68-4dda-828d-cf4b34b052ed/e6a65d28-9e68-4dda-828d-cf4b34b052ed1.gif)
新概念51单片机C语言教程例题
例利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序
P42)
错误!
未定义书签。
例编写程序使第一个发光二极管以间隔500ms亮灭闪动。
(P48)错误!
未定义书签。
例编写程序使第一个二极管以亮200ms灭800ms的方式闪动。
P49)错误味定义书签。
例利用C51自带库_crol_(),以间隔500ms实现流水灯程序(P53)错误!
未
定义书签。
例利用定时器0工作方式1,在实验板上实现第一个发光管以1s亮灭闪烁。
例用定时器0的方式1实现个第一发光二极管以200ms间隔闪烁,用定时器1
按下S2键一次,数值加1;每按下S3键一次,数值减1;每按下S4键一次,数
值归零;按下S5键一次,利用定时器功能使数值开始自动每秒加1,再次按下
错误!
未定义书签。
S5键,数值停止加1,保持显示原数。
(P82)
例实验班上电时,数码管不显示,顺序按下矩阵键盘后,数码管上依次显示
例用单片机控制ADC08044行数模转换,当拧动实验板上A/D旁边的电位时,
错误!
未定义书签。
在数码管的前三位以十进制方式显示出A/D转换后的数字量(8位A/D转换后数
值在0~255变化)。
(P107)
例用单片机控制DAC0832芯片输出电流,让发光二级管D12由灭均匀变到最亮,
再由最亮均匀熄灭。
在最亮和最暗时使用蜂鸣器分别警报一声,完成整个周期时
例在上位机上用串口调试助手发送一个字符X,单片机收到字符后返回给上位
机“IgetX”,串口波特率设为9600bps。
(P137)....错误味定义书签。
例单片机上电后等待从上位机串口发来的命令,同时在数码管的前三位以十进
制方式显示A/D采集的数值,在未收到上位机发送来的启动A/D转换命令之前数码管始终显示000。
当收到上位机以十六进制发送来的01后,向上位机发送字符串“Turnonad!
”同时间隔1s读取一次A/D的值,然后把A/D采集回来的8位二进制转换成十进制表示的实际电压浮点数,并且从串口发送给上位机,形式如“Thevoltageis”,发送周期也是一秒一次,同时在数码管上也要每秒刷新现实的数值。
当收到上位机以十六进制发送过来的02后,向上位机发送字符
串“Turnoffad!
”,然后停止发送电压值,数码管上显示上次结束时保持的值。
当收到上位机发来的其他任何数时,
向上位机发送字符串“Error!
”。
错误!
未
定义书签。
义书签。
Welcometohere!
”,移入速度自定,然后停留在屏幕上。
(P154)错误!
未定义书签。
例实现12232液晶的第一行显示“ILOVEMCU”!
,第二行显示“我爱单片机”。
P160)
错误!
未定义书签。
例实现12232液晶第一行从右侧移入“Helloeveryone!
”,同时第二行从右侧
移入“欢迎大家来学习!
”移入速度自定,最后停留在屏幕上。
(P163)错误!
未定义书签。
例实现在12864液晶上第一行显示“09”,并且让每一位数字随机变化,第二行
显示“,第三行显示“天祥电子”,第四行对应第三行显示出下划线。
(P173)
错误!
未定义书签。
将这个变化的数写入板上AT24C02内部。
当关闭实验板电源,并再次打开实验板
电源时,单片机先从AT24C02中将原来写入的数读取出来,接着此数继续变化并
例利用定时器0工作方式0,在实验板上实现第一个发光管以1s亮灭闪烁。
例利用定时器0工作方式2,在实验板上实现第一个发光管以1s亮灭闪烁。
实现第一个发光管以1s亮灭闪烁,用TH0计数器对应的8位定时器实现第二个
例利用计数器0工作方式1,在实验板上实现:
用一根导线一端连接GND引脚,
另一端去接触T0引脚,每接触一下,计数器计一次数,将所计的数值实时显示在数码管的前两位,计满100时清0,再从头计起。
(P214)错误!
未定义书签。
例设置单片机串行口的工作模式0,间隔循环发送十六进制数0xAA,然后用双
例用交叉串口线连接两块实验板,或直接用短线交叉线连接连个单片机的和口
共地)。
在一块板上编写矩阵键盘扫描程序,当扫描到有键按下时,将键值通
过串口发送出去,另一块板上单片机收到串口发送来的键值后,将对应键值以
例编写程序实现:
开启两个外部中断,设置低电平触发中断,用定时器计数并
且显示在数码管的前两位,当计数到5时,使单片机进入空闲(休眠)模式,同
时关闭定时器,当单片机响应外部中断后,从空闲(休眠)模式返回,同时开启
定时器。
(
错误!
未定义书签。
例实验板上实现如下描述:
程序启动后设定看门狗溢出时间为2s,然后点亮第
一个发光二极管,稍延时一会,然后熄灭发光二极管,使程序进入等待死循环状态,并且在死循环中大约每隔1s喂狗一次,看程序运行是否正常。
错误!
未定义书签。
例在实验板上实现:
操作STC单片机自带的E2PROMf储一组按秒递增的两位
数据,并且将数据实时显示在数码管上,数据每变化一次就往E2PRO中写入一
次,当关闭实验板电源并再次开启电源时,从E2PRO中读取先前存储的数据,
接着递增显示。
错误!
未定义书签。
例系列单片机的A/D转换功能。
时钟,转换结果以16进制形式输出到串行口,
可以用串行口调试程序,观察输出结果(本代码摘自宏晶科技芯片手册,经作者
错误!
未定义书签。
调试可正常运行)。
例给出一个STC12C5412A应用的参考程序。
(P287)..错误味定义书签。
程序使用TX-1C实验板上的DS18B20温度传感器设计温控系统C语言源代码
P349)
错误!
未定义书签。
例使用TX-1C实验板上两个独立按键调节直流电机的转速,同时在实验板的数
错误!
未定义书签。
码管上象征性的显示相应的转速值。
通过控制单片机输出不同占空比的PWMl!
号
来控制直流电机的转速(感性认识)。
(P434)
例舵机应用C语言程序设计实例:
开机时舵机角度自动转为0度,通过实验板
上的独立按键调节舵机的角度转动,并且在实验板数码管上显示相应的角度。
本
错误!
未定义书签。
例仅演示5个角度的控制,若想实现任意角度控制请大家自行编程实验。
程序代码如下:
(P453)
错误!
未指定书签。
错误!
未指定书签。
错误!
未指定书签。
Allrightsreserved.
ModificationaccordingtoDataSheetfromApril1999-SFR'sAUXRandAUXR1addedfor80C51RX+derivatives
*//*BYTERegisters*/
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;
sfrSADEN=0xB9;
sfrT2MOD=0xC9;
sfrRCAP2L=0xCA;
sfrRCAP2H=0xCB;
sfrTL2=0xCC;
sfrTH2=0xCD;
/*BITRegisters*//*PSW*/sbitCY=PSWT;sbitAC=PSWysbitF0=PSWysbitRS1=PSWM;
sbitRS0=PSW^3;
sbitOV=PSW^2;
sbitP=PSWS;
/*TCON*/
sbitTF1
=TCONA7;
sbitTR1
=TCONW;
sbitTF0
=TCONp
sbitTR0
=TCONM;
sbitIE1
=TCONA3;
sbitIT1
=TCON^2;
sbitIE0
=TCONM;
sbitIT0
=TCONP;
sbitWR=P3八6;
sbitT1=P3八5;
sbitTO=P3八4;
sbitINT1=P3八3;
sbitINTO=P3八2;
sbitSMO
=SCONA7;#includeoAIIrightsreserved.
ModificationaccordingtoDataSheetfromApril1999-SFR'sAUXRandAUXR1addedfor8OC51Rx+derivatives
*/
/*BYTERegisters*/
sfrPSW=OxDO;
sfrACC=OxEO;
sfrB=OxFO;
sfrSP=Ox81;
sfrPCON=Ox87;
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*/
sbitAC=PSWysbitF0=PSWysbitRS1=PSWM;
sbitRS0=PSW^3;
sbitOV=PSW^2;
sbitP=PSWS;
/*TCON*/
sbitTF1
=TCONA7;
sbitTR1
=TCONW;
sbitTF0
=TCONp
sbitTR0
=TCONM;
sbitIE1
=TCONA3;
sbitIT1
=TCON^2;
sbitIE0
=TCONM;
sbitIT0
=TCONP;
/*P3*/
sbitRD
=P3八7;
sbitWR
=P3八6;
sbitT1
=P3八5;
sbitT0
=P3八4;
sbitINT1=P3八3;
sbitINTO=P3八2;
sbitTXD=P3";
sbitRXD=P39
sbitSMO=SCONA7;//alternatively"FE"
sbitFE=SCONA7;
sbitTI=SCON";
sbitRI=SCONS;
sbitT2EX=PMl;
sbitT2=P19
/*T2CON*/sbitTF2=T2CONA7;
sbitEXF2=T2CONA6;
sbitRCLK=T2CONA5;
sbitTCLK=T2CONA4;
sbitEXEN2=T2CON^3;
sbitTR2=T2CONA2;
sbitC_T2=T2CONA1;
sbitCP_RL2=T2CONAO;
/*PCAPin*/sbitCEX3=P2八4;
sbitCEX1=P3八5;
sbitCEXO=P3八7;
sbitECI=P3八4;
/*IE*/sbitEA=IE^7;
sbitEPCA_LVD=06;
sbitEADC_SPI=05;
sbitES=04;
sbitET1
=03;
sbitEX1
=02;
sbitETO
=IE";
sbitEXO
=00;
/*IP*/sbitPPCA_LVD=IP八6;
sbitPADC_SPI=IPp
sbitPS=IP%;
sbitPT0
#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);
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--录音地址0---2400
unsignedchari,m,j;
unsignedintdatasoute=0;
powerup();
powerup();
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<>
#defineucharunsignedchar
sbitdula=P2八6;//
数码管显示段选I/O口定义
sbitwela=P2八7;//
数码管显示段选I/O口定义
sbitdianji=P1八7;//
控制电机I/O口定义
sbitjia_key=卩3八6;//
加速键
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};
ucharj,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
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);
if(jia_key==0)
if(jia_key==0)
if(num==4)
while(jia_key==0);//等待按键松开
if(jian_key==0)
delay(5);
if(jian_key==0)
num--;
else
num=0;//已经达到最小0,则保持
while(jian_key==0);
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;
uchari;
if(di_num!
=0)
for(i=0;i
dianji=0;//
实现PW信号低电平输出
display();//
利用显示函数起延时作用,这样也不影响数码管显示,
一举两得
for(i=0;i
dianji=1;//
实现PWM&号高电平输出
display();
voidmain()
while
(1)
dianji=0;
key();
dispose();
qudong();
例步进电机应用
C语言程序设计(P444)
#include<>
#defineucharunsignedchar
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};
ucharj,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
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;