新概念51单片机C语言教程实例代码.pdf
《新概念51单片机C语言教程实例代码.pdf》由会员分享,可在线阅读,更多相关《新概念51单片机C语言教程实例代码.pdf(138页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、新概念51单片机C语言教程-一入门、提高、开发、拓展全攻略郭天祥编著电子工业出版社例 2.2.1编写程序,点亮第一个发光二极管(part2_l.c P27)#include /52系列单片机头文件sbit ledl=PlAO;声明单片机Pl 口的第一位void main()主函数(ledl=0;/*点亮第一个发光二极管*/例 2 2 2 编写程序,点亮P1 口的若干二极管(part2_2.c P39)#include /52系列单片机头文件void main()主函数(Pl=0 xaa;/while(l);)例 2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(p
2、art2_3.cP42)#include /52系列单片机头文件#define uint unsigned int 宏 定义sbit ledl=PlA0;声明单片机Pl 口的第一位uint i,j;void main()主函数while(l)大循环(ledl=0;for(i=l;i0;i)for(j=110;j0;j-);led 1=1;for(i=1000;i0;i-)for(j=110;j0;j-);/*点亮第一个发光二极管*/延时/*关闭第一个发光二极管刃延时例 2.6.1编写程序使第一个发光二极管以间隔500ms亮灭闪动。(part2_4.c P48)#include#define u
3、int unsigned intsbit ledl=PlA0;void delay ls();void main()(while(l)led 1=0;delayls();ledl=l;delay ls();)void delay ls()(uint i,j;for(i=500;i0;i-)for(j=110;j0;j-);/52系列单片机头文件宏定义声明单片机Pl 口的第一位声明子函数/主函数/大循环/*点亮第一个发光二极管*/调用延时子函数/*关闭第一个发光二极管*/调用延时子函数子函数体例 2.7.1编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。(part2_5.c P49
4、)#include#define uint unsigned intsbit ledl=PlA0;void delayms(uint);void main()/52系列单片机头文件宏定义声明单片机Pl 口的第一位声明子函数主函数while(l)大循环ledl=0;delayms(200);ledl=l;delayms(800);/*点亮第一个发光二极管*/延时200毫秒/*关闭第一个发光二极管*/延时800毫秒void delayms(uint xms)uint i,j;for(i=xms;i0;i-)for(j=H0;j0;j-);/i=xms即延时约xms毫秒例 2.8.3利用C 51自带
5、库_crol_(),以间隔500m s,实现流水灯程序(part2_6.c P53)#include#include#define uint unsigned int/52系列单片机头文件宏定义#define uchar unsigned charvoid delayms(uint);uchar aa;声明子函数void main()(aa=0 xfe;主函数赋初值11111110while(l)大循环Pl=aa;delayms(500);aa=_crol_(aa,l);延时500毫秒将aa循环左移1位后再赋给aavoid delayms(uint xms)uint i,j;for(i=xms
6、;i0;i)forG=110;j0;j-);/i=xms即延时约xms毫秒例 3.2.1编写程序使第一个数码管显示8(part2.1_.lc P59)#include sbit dula=P2A6;sbit wela=P2A7;void main()/52系列单片机头文件申明U1锁存器的锁存端申明U2锁存器的锁存端wela=l;P0=0 xFE;wela=0;打开U2锁存器送入位选信号关闭U2锁存器dula=l;P0=0 x7F;dula=0;while(l);/打开U I锁存器送入段选信号关闭U2锁存器程序停止到这里例 3 2 2 让实验板上6 个数码管同时点亮,依次显示0 到 F,时间间隔
7、为0.5m s,循环下去。(part2.1_2.c P61)#include#define uchar unsigned char#define uint unsigned intsbit dula=P2A6;sbit wela=P2A7;uchar num;52系列单片机头文件申明U I锁存器的锁存端申明U 2锁存器的锁存端unchar code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;void delayms(uint);voi
8、d main()(wela=l;打开U2锁存端P0=0 xco;送入位选信号wela=0;关闭U2锁存端while(l)(for(num=0;num0;i)/i=xms 即延时约 xms 毫秒for(j=110;j0;j-);例 3.3.1第一个数码管显示1,时间为0.5 s,然后关闭它,立即让第二个数码管显示2,时间为 0.5s,在关闭它.直到最后一个数码管显示6,时间同样为0.5 s,关闭它之后再回来显示第一个数码管,一直循环下去。(part2.1_3.c P62)例 3.5.2用定时器0 的方式1实现第一个发光二极管以200ms间隔闪烁,用定时器1的方式1实现数码管前两位59s循环计时。
9、(part2.1_5.c P75)例 4.1.1用数码管前两位显示一个十进制数,变化范围为005 9,开始时显示0 0,每按下S2键一次,数 值 加 h每按下S 3键一次,数 值 减 1;每按下S 4 键一次,数值归零;按 下 S5键一次,利用定时器功能使数值开始自动每秒加1,再次按下S 5键,数值停止加1,保持显示原数。(part2.2_l.c P82)#include /52系列单片机头文件#define uchar unsigned char#define uint unsigned intsbit keyl=P3A4;sbit key2=P3A5;sbit key3=P3A6;sbit
10、 key4=P3A7;sbit dula=P2A6;申明U I锁存器的锁存端sbit wela=P2A7;申明U2锁存器的锁存端uchar code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;void delayms(uint);uchar numt0,num;void display(uchar numdis)显示子函数(uchar shi,ge;分离两个分别要显示的数shi=numdis/10;ge=numdis%10;dula=
11、l;P0=table shi;送十位段选数据dula=0;PO=Oxff;送位选数据前关闭所有显示,防止打开位选锁存时wela=1;原来段选数据通过位选锁存器造成混乱P0=0 xfe;送位选数据wela=0;delayms;延时dula=l;PO=tablege;送个位段选数据dula=0;P0=0 xff;wela=l;P0=0 xfd;wela=0;delayms(5);void delayms(uint xms)uint i,j;for(i=xms;i0;i)/i=xms 即延时约 xms 毫秒forG=H0;j0;j-);)void init()初始化函数(TMOD=0 x01;设置定
12、时器0 为工作方式1(0000 0001)TH0=(6553845872)/256;装初值 50ms 一次中断TL0=(65536-45872)%256;EA=1;开总中断ET0=l;开定时器0 中断)void keyscan()if(keyl=0)(delayms(lO);if(keyl=O)(num+;if(num=60)当 至 lj 60时重新归0num=0;while(!keyl);等待按键释放)1if(key2=0)(delayms(lO);if(key2=0)(if(num=0)当 至 I 0 时重新归60num=60;num;while(!key2);)if(key3=0)del
13、ayms(lO);if(key3=0)num=0;清 0while(!key3);if(key4=0)(delayms(lO);if(key4=0)while(!key4);TRO=TRO;启动或停止定时器0)void main()(init();初始化函数while(l)(keyscan();display(num);)void T0_time()interrupt 1(TH0=(6553645872)/256;重装初值TL0=(65536-45872)%256;numtO+;if(numt0=20)如果到了 20次,说 明 1 秒时间到(numt0=0;/然后把num清 0 重新再计20次
14、num+;if(num=60)num=0;例 4 2 1 实验板上电时,数码管不显示,顺序按下矩阵键盘后,数码管上依次显示0 F,六个数码管同时静态显示即可。(part2.2_2.c P87)#include /52系列单片机头文件#define uchar unsigned char#define uint unsigned intsbit dula=P2A6;申明U I 锁存器的锁存端sbit wela=P2A7;申明U 2 锁存器的锁存端uchar code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f
15、,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;void delayms(uint xms)(uint i,j;for(i=xms;i0;i)/i=xms 即延时约 xms 毫秒for(j=H0;j0;j-);)void display(uchar num)(P0=tablenum;显示函数只送段选数据dula=l;dula=0;)void matrixkeyscan()(uchar temp,key;P3=0 xfe;temp=P3;temp=temp&0 xf0;if(temp!=OxfO)(delayms(lO);temp=P3;temp=temp&OxfO;i
16、f(temp!=OxfO)(temp=P3;switch(temp)(case Oxee:key=O;break;case Oxde:key=l;break;case Oxbe:key=2;break;case 0 x7e:key=3;break;while(temp!=OxfO)(temp=P3;te mp=te mp&OxfO;)di splay(key);)P3=Oxfd;temp=P3;temp=temp&OxfO;if(temp!=OxfO)(delayms(lO);temp=P3;temp=temp&OxfO;if(temp!=OxfO)(temp=P3;switch(temp)(
17、case Oxed:key=4;break;case Oxdd:key=5;break;case Oxbd:key=6;break;case 0 x7d:key=7;break;while(temp!=OxfO)(temp=P3;temp=temp&OxfO;display(key);P3=Oxfb;temp=P3;te m p=te mp&Ox fO;if(temp!=OxfO)delayms(lO);temp=P3;temp=temp&OxfO;if(temp!=OxfO)(temp=P3;switch(temp)(case Oxeb:key=8;break;case Oxdb:key=9
18、;break;case Oxbb:key=10;break;case Ox7b:key=ll;break;)while(temp!=OxfO)(temp=P3;temp=te mp&OxfO;)display(key);)P3=0 xf7;temp=P3;te mp=te mp&OxfO;if(temp!=OxfO)(delayms(lO);temp=P3;temp=temp&OxfO;if(temp!=OxfO)temp=P3;switch(temp)(case 0 xe7:key=12;break;case 0 xd7:key=13;break;case 0 xb7:key=14;brea
19、k;case 0 x77:key=15;break;)while(temp!=0 xf0)(temp=P3;temp=temp&0 xf0;)di splay(key);void main()(P0=0;关闭所有数码管段选dula=l;dula=0;P0=0 xc0;位选中所有数码管wela=l;wela=0;while(l)matrixkeyscan();不停调用键盘扫描程序例 5.3.1用单片机控制ADC0804进行数模转换,当拧动实验板上A/D旁边的电位时,在数码管的前三位以十进制方式显示出A/D转换后的数字量(8 位 A/D转换后数值在0255变优 o (part2.3_l.c P10
20、7)#include /52系列单片机头文件#include#define uchar unsigned char#define uint unsigned intsbit dula=P2A6;sbit wela=P2A7;sbit adwr=P3A6;sbit adrd=P3A7;uchar code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;void delayms(uint xms)uint i,j;fbr(i=xms;i0;i
21、)/申明U I锁存器的锁存端中明U2锁存器的锁存端定义AD 的 WR端口定义AD 的 RD端口/i=xms即延时约xms毫秒for(j=110;j0;j-);void display(uchar bai,uchar shi,uchar ge)显示子函数(dula=l;PO=tablebai;送段选数据dula=0;P0=0 xff;送位选数据前关闭所有显示,防止打开位选锁存时wela=l;原来段选数据通过位选锁存器造成混乱P0=0 x7e;送位选数据wela=0;delayms;延时dula=l;PO=tableshi;dula=0;P0=0 xff;wela=l;P0=0 x7d;wela=
22、0;delayms(5);dula=l;PO=table|ge|;dula=O;PO=Oxff;wela=l;P0=0 x7b;wela=O;deiayms(5);void main()/主程序(uchar a,Al,A2,A3,adval;wela=l;P0=0 x7f;置CSAD为 0,选 通 ADCS以后不必再管ADCSwela=0;while(l)(adwr=1;_nop_();adwr=0;启动AD转换_nop_();adwr=l;for(a=10;a0;a-)/fTX-lC实验板AD工作频率较低,所以启动转换后要多留点时间用来转换 这里把显示部分放这里的原因也是为了延长转换时间di
23、splay(A1,A2,A3);Pl=0 xff;/读取Pl 口之前先给其写全adrd=1;/选通ADCS_nop_();adrd=0;/AD读使能_nop_();adval=Pl;/AD数据读取赋给Pl 口adrd=1;Al=adval/100;/分出百,十,和个位A2=adval%100/10;A3=adval%10;例 5 5 1 用单片机控制DAC0832芯片输出电流,让发光二级管D 12由灭均匀变到最亮,再由最亮均匀熄灭。在最亮和最暗时使用蜂鸣器分别警报一声,完成整个周期时间控制在5S左右,循环变化。(part2.3_2.c P121)#include#define uchar un
24、signed char#define uint unsigned intsbit dula=P2A6;,sbit wela=P2A7;,sbit dawn=P3A6;,sbit dacs=P3A2;sbit beep=P2A3;void delayms(uint xms)申明U1锁存器的锁存端/申明U2锁存器的锁存端定义DA 的 WR端口定义D A 的 C S端口定义蜂鸣器端口uint i,j;for(i=xms;iO;i)forC=110;j0;j-);/i=xms即延时约xms毫秒void main()uchar val,flag;dula=0;wela=0;dacs=0;dawr=0;P
25、0=0;while(l)(if(flag=O)(val+=5;P0=val;通过PO 口给DA数据口赋值if(val=255)(flag=l;beep=0;delayms(lOO);beep=1;)delayms(50);)else(val-=5;P0=val;if(val=O)通过P0 口给DA数据口赋值flag=O;beep=O;delayms(lOO);beep=1;)delayms(50);例 6.5.1在上位机上用串口调试助手发送一个字符X,单片机收到字符后返回给上位机“I getX”,串 口波特率设为 9600bps。(part2.4.c P137)#include#define
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 新概念 51 单片机 语言 教程 实例 代码
限制150内