新概念51单片机C语言教程实例代码.docx

上传人:夺命阿水 文档编号:475342 上传时间:2025-07-29 格式:DOCX 页数:124 大小:306.63KB
下载 相关 举报
新概念51单片机C语言教程实例代码.docx_第1页
第1页 / 共124页
新概念51单片机C语言教程实例代码.docx_第2页
第2页 / 共124页
新概念51单片机C语言教程实例代码.docx_第3页
第3页 / 共124页
新概念51单片机C语言教程实例代码.docx_第4页
第4页 / 共124页
新概念51单片机C语言教程实例代码.docx_第5页
第5页 / 共124页
点击查看更多>>
资源描述

1、新概念51单片机C语言教程-一入门、提高、开发、拓展全攻略编写程序,点亮第一个发光二极管#include/52系列单片机头文件sbitIedl=Pl0;声明单片机Pl口的第一位voidmain()主函数Iedl=O;/*点亮第一个发光二极管*/编写程序,点亮Pl口的假设干二极管#include/52系列单片机头文件voidmain()主函数Pl=Oxaa;/ZwhiIe(I);利用for语句延时特性,编写第个发光二极管以间隔IS亮灭闪动的程序#include/52系列单片机头文件#defineuintunsignedint宏定义sbitIedl=Pl0;声明单片机Pl口的第一位uinti,j;

2、voidmain()主函数(while(l)/大循环(Iedl=O;/*点亮第一个发光二极管*/for(i=1;i0;i)延时for(j=110;j0;j-);Iedl=I;/*关闭第一个发光二极管*/for(i=1000;i0;i-)延时for(j=110y0-);编写程序使第一个发光二极管以间隔50OmS亮灭闪动。#include#defineuintunsignedintsbitIedl=Pl0;voiddelayls();voidmain()while(l)(Iedl=O;delayls();ledl=l;delayls();voiddelayls()(uinti,j;for(i=50

3、0;i0;i)for(j=110J0-);/52系列单片机头文件宏定义声明单片机PI 口的第一位声明子函数主函数大循环/*点亮第一个发光二极管*/ 调用延时子函数/*关闭第一个发光二极管*/ 调用延时子函数子函数体编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。#include/52#defineuintunsignedintsbitIedl=Pl0;voiddelayms(uint);voidmain()(while(l)(Iedl=O;delayms(200);ledl=l;delayms(800);)voiddelayms(uintxms)uinti,j;for(i=xms

4、i0;i)for(j=1100-);系列单片机头文件宏定义声明单片机Pl口的第一位声明子函数主函数大循环/*点亮第一个发光二极管*/延时200毫秒/*关闭第一个发光二极管*/延时800毫秒/i=xms即延时约XmS亳秒利用C51自带库_crol_(),以间隔500ms,实现流水灯程序#include/52系列单片机头文件#include宏定义#defineuintunsignedint#define uchar unsigned char void delayms(uint);uchar aa;void main()aa=0xfe;while(l)(Pl=aa;delayms(500);aa

5、crol_(aa, 1);1)void delayms(uint xms)uint i,j;for(i=xms;i0;i)for(j=110;j0;j-);声明子函数主函数赋初值IullIlO大循环延时500毫秒将aa循环左移1位后再赋给aa/i=xms即延时约XmS亳秒编写程序使第个数码管显示8#include sbit du!a=P26;sbit wela=P27;void main()/52系列单片机头文件申明Ul锁存器的锁存端申明U2锁存器的锁存端wela=1;PO=OxFE;wela=0;翻开U2锁存器送入位选信号关闭U2锁存器dula=l;P0=0x7F;/翻开Ul锁存器送入段

6、选信号dula=O;while(l);关闭U2锁存器程序停止到这里让实验板上6个数码管同时点亮,依次显示。到F,时间间隔为0.5ms,循环下去。(part2.1_2.cP61)#include/52系列单片机头文件#defineucharunsignedchar#defineuintunsignedintsbitdu!a=P26;申明Ul锁存器的锁存端sbitwela=P27;申明U2锁存器的锁存端ucharnum;uncharcodetable=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79

7、0x71;voiddelayms(uint);voidmain()(wela=l;翻开U2锁存端PO=Oxco;送入位选信号wela=0;关闭U2锁存端while(l)(for(num=0;num0;i)/i=xms即延时约xms亳秒for(j=110;j0;j-);第一个数码管显示1,时间为0.5s,然后关闭它,立即让第二个数码管显示2,时间为05s,在关闭它一直到最后一个数码管显示6,时间同样为0.5s,关闭它之后再回来显示第一个数码管,一直循环下去。用定时器0的方式1实现第一个发光二极管以200ms间隔闪烁,用定时器1的方式1实现数码管前两位59s循环计时。用数码管前两位显示一个十进制

8、数,变化范围为0059,开始时显示00,每按下S2键-次,数值加1;每按下S3键-次,数值减1;每按下S4键次,数值归零;按下S5键一次,利用定时器功能使数值开始自动每秒加1,再次按下S5键,数值停止加1,保持显示原数。#include/52系列单片机头文件#defineucharunsignedchar#defineuintunsignedintsbitkeyl=P34;sbitkey2=P35;sbitkey3=P36;sbitkey4=P37;sbitdula=P26;申明Ul锁存器的锁存端sbitweIa=P27;申明U2锁存器的锁存端ucharcodetable=0x3f,0x06,

9、0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71);voiddelayms(uint);ucharnumt,num;voiddisplay(ucharnumdis)显示子函数ucharshi,ge;别离两个分别要显示的数shi=numdis10;ge=numdis%10;dula=l;PO=tableshi;送十位段选数据dula=O;PO=Oxff;送位选数据前关闭所有显示,防止翻开位选锁存时wela=1;原来段选数据通过位选锁存器造成混乱PO=Oxfe;送位选数据wela=0;delayms(5);延

10、时dula=l;PO=tablege;送个位段选数据dula=O;PO=Oxff;wela=1;PO=Oxfd;wela=0;delayms(5);)voiddelayms(uintxms)uinti,j;for(i=xms;i0;i)/i=xms即延时约xms亳秒for(j=110j0-);)voidinit()/初始化函数TMOD=OXo1;/设置定时器0为工作方式1(00000001)THo=(6553645872)/256;装初值50ms一次中断TL0=(65536-45872)%256;EA=I;开总中断ETO=1;开定时器。中断if(keyl=O)(delayms(10);if(k

11、eyl=O)(num+;if(num=60)当到60时重新归Onum=0;While(!keyl);等待按键释放)1if(key2=0)(delayms(10);if(key2=0)(if(num=0)当到O时重新归60num=60;num;while(!key2);I)if(key3=0)(delayms(10);if(key3=0)(num=0;清Owhile(!key3);)1if(key4=0)(delayms(10);if(key4=0)(whilc(!key4);TRO=TR0;启动或停止定时器Ovoidmain()init(/初始化函数while(l)keyscan();disp

12、lay(num);1)voidT0_time()interrupt1THO=(6553645872)/256;重装初值TL0=(65536-45872)%256;numt+;if(numt0=20)如果到了20次,说明1秒时间到(numtO=O;然后把num清0重新再计20次num+;if(num=60)num=0;实验板上电时,数码管不显示,顺序按下矩阵键盘后,数码管上依次显示0F,六个数码管同时静态显示即可。#include/52系列单片机头文件#defineucharunsignedchar#defineuintunsignedintsbitdula=P26;申明Ul锁存器的锁存端sbi

13、tweIa=P27;申明U2锁存器的锁存端ucharcodetable=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71);voiddelayms(uintxms)(uinti,j;for(i=xms;i0;i)/i=xms即延时约xms亳秒for(j=110;j0;j-);1voiddisplay(ucharnum)PO=tablenum;显示函数只送段选数据dula=l;dula=O;)voidmatrixkeyscan()uchartemp,key;P3=0xfe;temp=P3

14、temp=tempfexf;if(temp!=Oxft)delayms(10);temp=P3;temp=temp&OxfD;if(temp!=OxfD)(temp=P3;switch(temp)(caseOxee:key=O;break;caseOxde:key=1;break;caseOxbc:key=2;break;case0x7e:key=3;break;)while(temp!=OxfD)(temp=P3;temp=temp&OxfO;)display(key);1P3=0xfd;temp=P3;temp=temp&OxfO;if(temp!=OxK)delayms(10);tem

15、p=P3;temp=temp&OxfD;if(temp!=OxfD)(temp=P3;switch(temp)caseOxed:key=4;break;caseOxdd:key=5;break;caseOxbd:key=6;break;case0x7d:key=7;break;)while(temp!=OxfD)(temp=P3;temp=temp&OxfO;)display(key);1P3=0xfb;temp=P3;temp=temp&OxfO;if(temp!=0xK)delayms(10);temp=P3;temp=temp&OxfD;if(temp!=OxfD)(temp=P3;sw

16、itch(temp)(caseOxeb:key=8;break;caseOxdb:key=9;break;caseOxbb:key=10;break;case0x7b:key=11;break;while(temp!=OxfD)(temp=P3;temp=temp&0xf0;)display(key);1P3=0xf7;temp=P3;temp=temp&OxfO;if(temp!=OxK)delayms(10);temp=P3;temp=temp&OxfD;if(temp!=OxfD)(temp=P3;switch(temp)(case0xe7:key=12;break;case0xd7:k

17、ey=13;break;case0xb7:key=14;break;case0x77:key=15;break;while(temp!=OxfD)(temp=P3;temp=temp&OxfO;display(key);PO=0;关闭所有数码管段选dula=l;dula=O;PO=OXC0;位选中所有数码管wela=1;wela=0;while(l)(matrixkeyscan();/不停调用键盘扫描程序1用单片机控制ADCo804进行数模转换,当拧动实验板上A/D旁边的电位时,在数码管的前三位以十进制方式显示出A/D转换后的数字量(8位A/D转换后数值在0255变化)。#include #i

18、nclude #define uchar unsigned char/52系列单片机头文件申明Ul锁存器的锁存端 申明U2锁存器的锁存端 定义AD的WR端口 定义AD的RD端口#defineuintunsignedintsbitdu!a=P26;-sbitwela=P27;Jsbitadwr=P36;/sbitadrd=P37;Jucharcodetable=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;voiddelayms(uintxms)uinti,j;/i=xms即延时约x

19、ms亳秒for(i=xms;i0;i-)for(j=110J0y-);voiddisplay(ucharbai,ucharshi,ucharge)显示子函数dula=l;PO=tablebai;送段选数据dula=0;PO=Oxff;送位选数据前关闭所有显示,防止翻开位选锁存时wela=1;原来段选数据通过位选锁存器造成混乱P0=0x7e;送位选数据wela=0;delayms;延时dula=l;PO=tableshi;dula=O;PO=Oxff;wela=1;P0=0x7d;wela=0;delayms(5);dula=l;PO=tablege;dula=O;PO=Oxff;wela=1;

20、P0=0x7b;wela=0;delayms(5);voidmain()/主程序uchara,Al,A2,A3,adval;wela=1;P0=0x7f;置CSAD为0,选通ADCS以后不必再管ADCSwela=0;while(l)adwr=l;-11op-0;adwr=0;启动AD转换_nop_();adwr=l;for(a=10;a0;a-)/TX-IC实验板AD工作频率较低,所以启动转换后要多留点时间用来转换/这里把显示局部放这里的原因也是为了延长转换时间disp!ay(A1,A2,A3);Pl=Oxff;读取Pl之前先给其写全1adrd=1;-11P-();adrd=0;_nop_()

21、advaI=Pl;adrd=1;Al=adval100;A2=adval%10010;A3=adval%10;/选通ADCSAD读使能/AD数据读取赋给Pl口分出百,十,和个位用单片机控制DACO832芯片输出电流,让发光二级管D12由灭均匀变到最亮,再由最亮均匀熄灭。在最亮和最暗时使用蜂鸣器分别警报一声,完成整个周期时间控制在5S左右,循环变化。#include#defineucharunsignedchar#defineuintunsignedintsbitdu!a=P26;sbitwela=P27;,sbitdawr=P36;.sbitdacs=P32;1sbitbeep=P23;,v

22、oiddelayms(uintxms)申明Ul锁存器的锁存端申明U2锁存器的锁存端定义DA的WR端口定义DA的CS端口定义蜂鸣器端口uinti,j;for(i=xms;i0;i)for(j=110j0-);/i=xms即延时约xms亳秒voidmain()(ucharval,flag;dula=0;wela=0;dacs=0;dawr=0;PO=0;while(l)(if(flag=O)val+=5;P0=val;通过PO口给DA数据l赋值if(val=255)flag=l;beep=O;delayms(100);beep=1;1delayms(5O);1else(val-=5;PO=val;

23、通过POn给DA数据口赋值if(val=O)flag=O;beep=O;delayms(100);beep=1;delayms(50);在上位机上用串口调试助手发送一个字符X,单片机收到字符后返回给上位机IgetX”,串口波特率设为9600bpso#include#defineucharunsignedchar#defineuintunsignedintunsignedcharflag,a,i;ucharcodetable=Iget;/ucharcodetable=T,g,e,t,;voidinit()TMOD=0x20;THl=Oxfd;TLl=Oxfd;TR1=1;REN=1;SM0=0;

24、SM1=1;EA=I;ES=I;voidmain()init();while(l)(if(flag=l)(ES=O;for(i=0;i6;i+)SBUF=tablei;while(!TI);TI=0;SBUF=a;whiIe(!TI);TI=0;ES=I;flag=O;voidser()interrupt4RI=O;a=SBUF;flag=l;单片机上电后等待从上位机串口发来的命令,同时在数码管的前三位以十进制方式显示A/D采集的数值,在未收到上位机发送来的启动A/D转换命令之前数码管始终显示OO0。当收到上位机以十六进制发送来的01后,向上位机发送字符串“Turnonad!”同时间隔IS读取

25、一次A/D的值,然后把A/D采集回来的8位二进制转换成十进制表示的实际电压浮点数,并且从串口发送给上位机,形式如“Thevoltageis3.398438V“,发送周期也是一秒一次,同时在数码管上也要每秒刷新现实的数值。当收到上位机以十六进制发送过来的02后,向上位机发送字符串“Turnoffad!”,然后停止发送电压值,数码管上显示上次结束时保持的值。当收到上位机发来的其他任何数时,向上位机发送字符串“Error!”。#include#include#include#defineucharunsignedchar申明Ul锁存器的锁存端 申明U2锁存器的锁存端 定义AD的WR端口 定义AD的R

26、D端口#defineuintunsignedintsbitdula=P26;sbitweIa=P27;,sbitadwr=P36;sbitadrd=P37;,ucharflag,a;unsignedcharflag_uart,flag_time,flag_on,a,i,tO_num,ad_val;floatad_vo;ucharcodetable=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;voiddelayms(uintxms)/i=xms即延时约xms亳秒uinti,j;fo

27、r(i=xms;i0;i)for(j=1100-);voidinit()TMOD=Ox21;/SCON=0x50;TH0=(65536-50000)256;TL0=(65536-50000)%256;THl=Oxfd;TLl=Oxfd;TR1=1;ETO=1;SMO=O;SM1=1;REN=1;EA=I;ES=I;voiddisplay(ucharvalue)显示子函数ucharbai,shi,ge;bai=value/100;分出百,十,和个位shi=value%100/10;ge=value%10;dula=l;PO=tablebai;送段选数据dula=O;PO=Oxff;送位选数据前关

28、闭所有显示,防止翻开位选锁存时wela=1;原来段选数据通过位选锁存器造成混乱P0=0x7e;送位选数据wela=0;delayms;延时dula=l;PO=tableshi;dula=O;PO=Oxff;wela=1;P0=0x7d;wela=0;delayms(5);dula=l;PO=tablege;dula=O;PO=Oxff;wela=1;P0=0x7b;wela=0;delayms(5);ucharget_ad()ucharadval;adwr=l;-ioP-();adwr=0;启动AD转换_nop_();adwr=l;Pl=Oxff;读取Pl口之前先给其写全1adrd=1;_no

29、p_();adrd=0;/AD读使能-ioP-();advaI=Pl;/AD数据读取adrd=l;returnadval;)voidmain()(init();wela=l;P0=0x7f;置CSAD为0,选通ADCS以后不必再管ADCSwela=0;while(l)if(flag_uart=l)(flag_uart=O;ES=O;TI=I;switch(flag_on)case0:puts(Tumonad!n1);TRO=1;break;case 1: printf(Turnoffad!n);TR0=0;break;case 2: puts(,Error!n);break;)While(!T

30、I);/必须要加TI=0;ES=I;)if(flag_time=l)flag_time=O;ad_val=get_ad();ad_vo=(float)ad_val*5.0/256.0;ES=O;TI=I;printf(Thevoltageis%fVn,ad_vo);while(!TI);TI=O;ES=I;)display(ad_val);voidtimer()interrupt1TH0=(65536-50000)256;TL0=(65536-50000)%256;t0_num+;if(t0_num=20)t0_num=0;flag_time=l;1)voidser()interrupt4RI

31、O;a=SBUF;flag-uart=1;if(a=1)flag_on=0;elseif(a=2)flag_on=l;elseflag_on=2;实现1602液晶的第一行显示“ILOVEMCU!”,在第二行显示TXMCU#include#defineucharunsignedchar#defineuintunsignedintucharcodetable=ILOVEMCU!;ucharcodetablel=TXMCU,;sbitlcden=P34;液晶使能端sbitlcdrs=P35;液晶数据命令选择端sbitdula=P26;申明Ul锁存器的锁存端sbitweIa=P27;申明U2锁存器的

32、锁存端ucharnum;voiddelay(uintz)uintx,y;for(x=z;x0;x)for(y=l10;y0;y);)voidwrite_com(ucharcom)Icdrs=O;P0=com;delay(5);Icden=I;delay(5);Icden=O;voidwrite_data(uchardate)(Icdrs=I;PO=date;delay(5);Icden=I;delay(5);Icden=O;)voidinit()dula=0;wela=0;Icden=O;Write_com(0x38);设置16X2显示,5X7点阵,8位数据接口Write_com(OXoC);

33、/设置开显示,不显示光标Write_com(OXo6);写一个字符后地址指针加1Write_com(OXo1);显示清零,数据指针清零)voidmain()init();write_com(0x80);for(num=0;numl1;num+)write-data(tablenum);delay(5);Iwrite_com(0x80+0x40);for(num=0;num13;num+)write_data(tablelnum);delay(5);Iwhile(l);实现1602第一行从左侧移入“Hell。everyone!同时第二行从右侧移入“Welcometohere!”,移入速度自定,然

34、后停留在屏幕上。#include#defineucharunsignedchar#defineuintunsignedintucharcodetable=Helloeveryone!;ucharcodetable1=Welcometohere!;sbitlcden=P34;液晶使能端sbitlcdrs=P35;液晶数据命令选择端sbitdu!a=P26;申明Ul锁存器的锁存端sbitwela=P27;申明U2锁存器的锁存端ucharnum;voiddelay(uintz)(uintx,y;for(x=z;x0;x)for(y=l10;y0;y);voidwrite_com(ucharcom)I

35、cdrs=O;P0=com;delay(5);Icden=I;delay(5);Icden=O;1voidwrite_data(uchardate)Icdrs=I;P0=date;delay(5);Icden=1;delay(5);Icden=O;)voidinit()(dula=0;wela=0;Icden=O;Write_com(0x38);设置16X2显示,5X7点阵,8位数据接口Write_com(OXOC);设置开显示,不显示光标Write_com(OXo6);写一个字符后地址指针加1Write_com(OXOI);/显示清零,数据指针清零Ivoidmain()(init();wri

36、te_com(0x80+0x10);for(num=0;num15;num+)write_data(tablcnum);delay(5);Iwrite_com(0x80+0x50);fbr(num=O;num16;num+)(write_data(tablelnum);delay(5);Ifbr(num=O;num16;num+)(write_com(Ox18);delay(200);)while(l);)实现12232液晶的第一行显示“ILOVEMCU!”,第二行显示“我爱单片机”。#include#defineuintunsignedint#defineucharunsignedchars

37、bitCS=P12;sbitSID=P11;sbitSCLK=P10;ucharcodedisps=,ILOVEMCU!;ucharcodedispx=我爱单片机!”;voiddelay_lms(uintx)uinti,j;for(j=Oyxy+)for(i=0;il10;i+);)voidsend_command(ucharcommand_data)uchari;uchari_data;1.data=OxfB;CS=I;SCLK=O;for(i=0;i8;i+)(SID=(bit)(i_data&0x80);SCLK=O;SCLK=I;1.data=i_data1;)i_data=comma

38、nd_data;i_data&=OxfO;for(i=0;i8;i+)(SID=(bit)(i_data&0x80);SCLK=O;SCLK=I;i_data=i_data1;)i_data=command_data;i_data=4;for(i=0;i8;i+)(SID=(bit)(i_data&0x80);SCLK=O;SCLK=I;1.data=i_data1;1CS=O;delayms(10);voidsend_data(ucharcommand_data)uchari;uchari_data;i_data=Oxfa;CS=I;for(i=0;i8;i+)SID=(bit)(i_dat

39、a&0x80);SCLK=O;SCLK=I;i_data=i_data1;)i_data=command_data;i_data&=0xf0;for(i=0;i8;i+)(SID=(bit)(i_data&0x80);SCLK=O;SCLK=I;1.data=i_data1;)i_data=command_data;i_data=4;for(i=0;i8;i+)(SID=(bit)(i_data&0x80);SCLK=O;SCLK=I;i_data=i_data1;)CS=O;delay_lms(10);)voidlcd_init()delay_lms(100);SelKLCOmmand(OX

40、30);*设置8位数据接口,根本指令模式。*/Smand(OXO2);/*清DDRAM*/Smand(OXO6);/*游标及显示右移位*/SeiKLCOmmand(OXOC);/*整体显示开,游标关,反白关*/SelKLCommand(OXO1);/*写入空格清屏幕*/send_command(0x80);/*设定首次显示位置*/voiddisplay_s()(uchara;send_command(0x80);for(a=0;all;a+)send-data(dispsa);voiddisplay_x()uchara;SeiKLCommand(OX92);fbr(a=O;al1;a+)(send_data(dispxa);main()lcd_init();display_s();display_x();while(l);实现12232液晶第一行从右侧移入“Hell。everyone!,同时第二行从右侧移入“欢送大家来学习!”移入速度自定,最后停留在屏幕上。#include#defineuintunsignedint#defineucharunsignedcharsbitCS=P12;sbitSID=P11;sbitSCLK=P10;u

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

宁ICP备18001539号-1