C51单片机应用技术项目化教程教学课件ppt作者李庭贵龙舰涵主编0730C51单片机应用技术项目化教程思考与习题详解_第1页
C51单片机应用技术项目化教程教学课件ppt作者李庭贵龙舰涵主编0730C51单片机应用技术项目化教程思考与习题详解_第2页
C51单片机应用技术项目化教程教学课件ppt作者李庭贵龙舰涵主编0730C51单片机应用技术项目化教程思考与习题详解_第3页
C51单片机应用技术项目化教程教学课件ppt作者李庭贵龙舰涵主编0730C51单片机应用技术项目化教程思考与习题详解_第4页
C51单片机应用技术项目化教程教学课件ppt作者李庭贵龙舰涵主编0730C51单片机应用技术项目化教程思考与习题详解_第5页
已阅读5页,还剩123页未读 继续免费阅读

下载本文档

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

文档简介

1、c51单片机应用技术项目化教程思考与习题详解项目1 设计信号灯控制系统任务6 能力拓展1.6.1 led流水灯【控制要求】p0、p2端口的led先从右到左方向依次点亮,再从左到右方向依次点亮,如此循环形成流水灯效果。【参考程序】/*/项目名称:led左右移动流水灯/功能描述:p0、p2端口8位led显示/*#include #include unsigned char scan_num;char code reserve 3 _at_ 0x3b; /保留0x3b开始的3个字节/*/延时函数/*void delayms(unsigned int ms)unsigned char k;while(

2、ms-)for(k=0;k114;k+);/*/主函数/*void main(void)unsigned char i;p0=0xff; /初始化端口p2=0xff;while(1)scan_num=0xfe; /扫描初始值for(i=0;i8;i+) /左移显示p0=scan_num; /送显示p2=scan_num;scan_num=1; /左移一位scan_num|=0x01; /最低位补1delayms(300); /延时300msp0=0xff; /关闭led显示p2=0xff;delayms(300); /延时300msscan_num=0x7f; /扫描初始值for(i=0;i=

3、1; /右移一位scan_num|=0x80; /最高位补1delayms(300); /延时300msp0=0xff; /关闭led显示p2=0xff;delayms(300); /延时300ms1.6.2 led灯精确定时闪烁【控制要求】在单片机的p0.0端口上接一个发光二极管l1,使l1不停地一亮一灭,一亮一灭的时间间隔为1s(要求利用定时器t0实现精确的1s定时),循环往复。【参考程序】#include /reg51.hsbit l1=p00;unsigned char time; /软计数器void time0(void); /函数声明/主函数void main(void)time=

4、20;th0=0x4c; /定时50mstl0=0x00;tmod=0x01;ie=0x82;tr0=1; /timer0 runwhile(1) /等待中断 l1=0;/中断函数void time0(void) interrupt 1th0=0x4c;tl0=0x00;time-;if(time=0)l1=l1;time=20;项目2 设计数码管显示系统任务6 能力拓展2.6.1 数码管字幕显示【控制要求】用8位数码管显示从右向左移动显示“-hello”。【参考程序】/*/项目名称:数码管字幕移动显示/功能描述:用8位数码管显示从右向左移动显示“-hello”/mcu:at89s52 晶振:

5、11.0592mhz/*#include /51芯片管脚定义头文件#define uchar unsigned char#define uint unsigned int/-hello-uchar display =0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xbf,0x89,0x86,0xc7,0xc7,0xc0,0xbf,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff;uchar shift,j=0;char code reserve 3 _at_0x3b; /保留0x3b开始的3个字节/*/ms延时

6、子函数/*void delayms(uint ms)uchar t;while(ms-) for(t=0;t0;i-)p0=displayi+j;p2=shift;shift=(shift1)|0x01;delayms(1);p2=0xff;/*/函数名称:主函数/函数功能:/*void main()uchar k;p0=0xff;p2=0xff;while(1)for(j=0;j17;j+)for(k=0;k125;k+)ledplay();2.6.2 数码管左移右移显示p0端口接动态数码管的字形码笔段,p2端口接动态数码管的数位选择端,p1.0接一个开关,当开关接高电平时,显示“12345

7、678”字样;当开关接低电平时,显示“87654321”字样。【硬件设计】主控模块采用atmel公司生产的at89s52单片机。选用8段共阳极数码管,数码管的a、b、c、d、e、f、g、dp段分别与单片机p0口的p0.0、p0.1、p0.2、p0.3、p0.4、p0.5、p0.6、p0.7相连,用来控制显示数字的形状。数码管的公共使能端com连接三极管c8550的集电极,三极管c8550主要用于信号的放大,以驱动数码管工作。三极管8550的基极通过限流电阻接到单片机p2口的p2.0,通过控制三极管c8550的基极电平来打开或关闭数码管的显示,起到“使能”作用。三极管c8550的集电极接5v电源

8、。动态数码显示模块与单片机的接口电路如图2-9所示。图2-9 动态数码显示模块与单片机的接口电路【软件设计】/*/项目名称:动态数码显示/功能描述:当开关接高电平时,显示“12345678”;/ 当开关接低电平时,显示“87654321”。/*#include unsigned char code table1=0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80;unsigned char code table2=0x80,0xf8,0x82,0x92,0x99,0xb0,0xa4,0xf9;unsigned char i;unsigned char t1,t2;u

9、nsigned char temp;sbit k1=p10;/主函数void main(void)while(1)temp=0xfe;for(i=0;i8;i+)if(k1=1) p0=table1i;else p0=table2i;p2=temp;temp=(temp1)|0x01;for(t1=0;t14;t1+)for(t2=0;t2200;t2+);项目3 设计按键识别系统任务6 能力拓展3.6.1 多路开关状态指示【控制要求】单片机at89s52的p0.0p0.3连接4个发光二极管l1l4,p1.0p1.3 连接4个按钮开关 k1k4,编程将开关的状态反映到发光二极管上:开关闭合,对

10、应的灯亮;开关断开,对应的灯灭。【参考程序】#include sbit k1=p10;sbit led1=p00;sbit k2=p11;sbit led2=p01;sbit k3=p12;sbit led3=p02;sbit k4=p13;sbit led4=p03;/*/主函数/*void main(void)while(1)if(k1=0) led1=0; /灯1亮else led1=1; /灯1灭if(k2=0) led2=0; /灯2亮else led2=1; /灯2灭if(k3=0) led3=0; /灯3亮else led3=1; /灯3灭if(k4=0) led4=0; /灯4

11、亮else led4=1; /灯4灭3.6.2 一键多功能按键识别技术【控制要求】开关k1接在p1.0管脚上,在at89s51单片机的p0端口接有四个发光二极管,上电的时候,l1接在p0.0管脚上的发光二极管在闪烁,当每一次按下开关k1的时候,l2接在p0.1管脚上的发光二极管在闪烁,再按下开关k1的时候,l3接在p0.2管脚上的发光二极管在闪烁,再按下开关k1的时候,l4接在p0.3管脚上的发光二极管在闪烁,再按下开关k1的时候,又轮到l1在闪烁了,如此轮流下去。【参考程序】#include unsigned char id;/*/延时函数/*void delay10ms(void)unsi

12、gned char i,j;for(i=20;i0;i-)for(j=248;j0;j-);/*/延时函数/*void delay02s(void)unsigned char i;for(i=20;i0;i-)delay10ms();/*/主函数/*void main(void)while(1)if(p1_0=0)delay10ms();if(p1_0=0)id+;if(id=4) id=0;while(p1_0=0);switch(id)case 0:p0_0=p0_0;delay02s();break;case 1:p0_1=p0_1;delay02s();break;case 2:p0_

13、2=p0_2;delay02s();break;case 3:p0_3=p0_3;delay02s();break;项目4 设计报警器系统任务6 能力拓展4.6.1 外部中断计数【控制要求】利用单片机的外部中断功能进行计数,然后将计数值输出到数码管上显示。按下k5键,计数值加1(外部中断0);按下k6键,计数值减1(外部中断1);采用3位数码管显示,最大计数值255。【参考程序】/*/项目名称:int0、int1中断计数/功能:通过连接在int0和int1的按键k5与k6实现程序/对外部中断次数进行计/数,计数值显示在7段数码管上。/int0(k5):计数值递增/int1(k6):计数值递减/

14、*#include #include unsigned char code leddata=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90,0xff;/段码unsigned char data display3; /显示缓存单元unsigned char code scan_bit8=0xfe,0xfd,0xfb,0xf7,0xef,0xdf, 0xbf,0x7f;/位码unsigned char count; /计数单元char code reserve3_at_0x3b; /保留0x3b开始的3个字节/*/延时函数/*void dela

15、yms(unsigned int ms)unsigned char k;while(ms-) for(k=0;k114;k+);/*/数据处理与显示函数/*void disp_count( )unsigned char n,temp;temp=count;/数据处理for(n=0;n0;n-)if(displayn=0) displayn=0x0a;else break;for(n=0;n3;n+)p0=leddatadisplayn; /显示段码p2=scan_bitn; /输出位码delayms(1);p2=0xff; /关闭显示/*/主函数/*void main(void)p0=0xff

16、;p1=0xff;p2=0xff;it0=0; /低电平触发;如it0=1为下降沿触发it1=0; /低电平触发;如it0=1为下降沿触发ea=1; /总中断允许ex1=1; /开启int1中断ex0=1; /开启int0中断while(1)disp_count(); /数码管显示/*/int0中断函数(加计数)/*void int0_isr(void)interrupt 0unsigned char x;ex0=0; /关闭int0中断count+; /计数值加1/用显示程序进行延时for (x=0;x70;x+) disp_count();ex0=1; /开启int0中断/*/int1中断

17、函数(减计数)/*void int1_isr(void)interrupt 2unsigned char x;ex1= 0; /关闭int1中断count-; /计数值减1/用显示程序进行延时for(x=0;x70;x+)disp_count();ex1=1; /开启int1中断4.6.2 产生“叮咚”门铃声【控制要求】当按下开关sp1(接p1.4)时,单片机产生“叮咚”声,从蜂鸣器(接p3.7)输出。【参考程序】#include sbit p1_4=p14;sbit p3_7=p37;unsigned char t5hz;unsigned char t7hz;unsigned int tcn

18、t;bit stop;bit flag;/*/主函数/*void main(void)unsigned char i,j;tmod=0x02; /0000 0010方式2th0=0x06;tl0=0x06;et0=1;ea=1;while(1)if(p1_4=0)for(i=10;i0;i-)for(j=248;j0;j-);if(p1_4=0)t5hz=0;t7hz=0;tcnt=0;flag=0;stop=0;tr0=1;while(stop=0);/*/中断程序/*void t0 (void) interrupt 1 using 0tcnt+;if(tcnt=200)tcnt=0;if(

19、flag=0)flag=flag;elsestop=1;tr0=0;if(flag=0)t7hz+;if(t7hz=3)t7hz=0;p3_7=p3_7;elset5hz+;if(t5hz=4)t5hz=0;p3_7=p3_7;4.6.3 演奏音乐【控制要求】演唱“两只老虎”:单片机的p3.7外接扬声器,利用定时/计数器与中断唱出音乐“两只老虎”,其乐谱如下:|1231 |1231 |345- |345- |56 54 31 |56 54 31 |151- |151- |【参考程序】#include #define uint unsigned int#define uchar unsigned

20、 charsbit loudspeaker=p37;/音阶musical_scaleuint code musical_scale=64580,64684,64777,64820,64898,64968,65030,64260,65058;/(65536-x)1us=1912us/2 x=65536-856=64580/乐谱music_score/0x14,0x24,0x34,0x14;/0x14,0x24,0x34,0x14/0x34,0x44,0x58/0x34,0x44,0x58/0x52, ,0x62,0x52,0x42,0x34,0x14/0x52, ,0x62,0x52,0x42,

21、0x34,0x14/0x14,0x84,0x16,0x02/0x14,0x84,0x16,0x02/高四位为音符,第四位为节拍uchar code music_score=0x14,0x24,0x34,0x14,/0x14,0x24,0x34,0x14,/0x34,0x44,0x58, /0x34,0x44,0x58, /0x52,0x62,0x52,0x42,0x34,0x14,/0x52,0x62,0x52,0x42,0x34,0x14,/0x14,0x84,0x16,0x02,/0x14,0x84,0x16,0x02,/0x00;/音符,musical_note;节拍,music_rhy

22、thmuchar musical_note,music_rhythm;/*/延时函数/*void delay(uint z)uchar i,j;while(z-)for(i=0;i250;i+)for(j=0;j120;j+);/*/演唱函数/*void sing(uint i)musical_note=music_scorei/16; /高四位为音符music_rhythm=music_scorei%16; /低四位为节拍/*/主函数/*void main( )uint i;ie=0x82;tmod=0x01;while(1)for(i=0;music_scorei!=0;i+)sing(i

23、);if(musical_note=0) tr0=0;else th0=musical_scalemusical_note-1/256;tl0=musical_scalemusical_note-1%256;tr0=1;delay(music_rhythm);tr0=0;loudspeaker=0;/*/定时器t0中断函数/*void time0(void) interrupt 1th0=musical_scalemusical_note-1/256;tl0=musical_scalemusical_note-1%256;loudspeaker=loudspeaker;项目5 设计马表控制系统

24、任务6 能力拓展5.6.1 pwm控制led灯渐亮渐灭【控制要求】利用定时器控制产生占空比可变的pwm波。按k1,pwm值增加,则占空比减小,p0口的8个led灯渐暗。按k2,pwm值减小,则占空比增加,p0口的8个led灯渐亮。当pwm值增加到最大值或最小值时,蜂鸣器将报警。【参考程序】/*/项目名称:pwm控制led灯渐亮渐灭/led显示/mcu: at89s52 晶振:11.0592mhz/*/功能:利用定时器控制产生占空比可变的pwm波/ 按k1,pwm值增加,则占空比减小,led灯渐暗。/ 按k2,pwm值减小,则占空比增加,led灯渐亮。/ 当pwm值增加到最大值或减小到最小值时,

25、蜂鸣器将报警。/*#includesbit k1=p14 ; /pwm值增加键sbit k2=p15 ; /pwm值减少键sbit beep=p37 ; /蜂鸣器unsigned char pwm=0x7f ; /赋初值char code reserve 3 _at_ 0x3b; /保留0x3b开始的3个字节/*/延时函数/*void delayms(unsigned char ms)unsigned char i;while(ms-) for(i=0 ; i114;i+);/*/延时函数/*void delay(unsigned char t)while(t-);/*/蜂鸣器函数/*void

26、 beep()unsigned char i;for(i=0;i100;i+)delay(100);beep=!beep; /beep取反beep=1; /关闭蜂鸣器delayms(100);/*/主函数/*void main( )p1=0xff;tmod=0x21;th0=0xfe; /1ms延时常数tl0=0x66 ; /频率调节th1=pwm ; /脉宽调节tl1=0;ea=1;et0=1;et1=1;tr0=1;while(1)doif(pwm!=0xff) pwm+;delayms(10);else beep() ;while(k1=0);doif(pwm!=0x02) pwm- ;

27、delayms(10);else beep();while(k2=0);/*/定时器0中断服务函数(频率)/*void timer0() interrupt 1tr1=0;th0=0xfe; /1ms延时常数tl0=0x66 ; /频率调节th1=pwm;tr1=1;p0=0x00; /启动输出/*/定时器1中断服务程序 (脉宽)/*void timer1() interrupt 3tr1=0;p0=0xff; /结束输出5.6.2 60秒倒计时动态显示【控制要求】二位数码显示(动态扫描),从60开始,每秒数值减1,减到0后再从60开始,不断循环。【参考程序一】#include unsigne

28、d char duanma10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned char weima2=0xfd,0xfe;unsigned char jishu1=0,jishu2=0,miao=60;unsigned char xianshi2=0,0;/*/延时函数:20*250*2us=10000us=10ms/*void delay10ms(void)unsigned char i,j;for(i=20;i0;i-)for(j=250;j0;j-);/*/初始化函数/*void chushihua(void)tmo

29、d=0x01;th0=0x4c;tl0=0x00;ea=1;et0=1;tr0=1;/*/主函数/*void main(void)chushihua();while(1)xianshi0=duanmamiao/10;xianshi1=duanmamiao%10;jishu1+;if(jishu1=2) jishu1=0;/当jishu1=0,p2=weima0=0xfe,即p2.0=0/当jishu1=1,p2=weima1=0xfd,即p2.1=0;p2=weimajishu1;p0=xianshijishu1;delay10ms();/*/中断函数/*void daojishi(void)

30、 interrupt 1th0=0x4c;tl0=0x00;jishu2+;if(jishu2=20)jishu2=0;miao-;if(miao=0xff) miao=60;【参考程序二】#include unsigned code ledcode=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned char counter,time;void delay(void); /延时函数void display(void); /显示函数/*/主函数/*void main(void)counter=60;time=20; /1s=50

31、ms*20th0=0x4c;tl0=0x00;tmod=0x01;ie=0x82; /1000 0010btr0=1; /t0 runwhile(1); /等待中断:当tf01,进入t0中断函数/*/延时函数/*void delay(void) /20*100*2usunsigned char i,j;for(i=20;i0;i-)for(j=100;j0;j-);/*/显示函数/*void display(void)unsigned char loop;for(loop=5;loop0;loop-) /循环为了稳定显示数码管两位数p0=0xff;p2=0xff;p2=0xfd; /1111

32、1101bp0=ledcodecounter/10;delay();p0=0xff;p2=0xff;p2=0xfe; /1111 1110bp0=ledcodecounter%10;delay();/*/t0中断函数/*void t0_interrupt(void) interrupt 1th0=0x4c;tl0=0x00;display();time-;if(time=0)counter-; /60-1time=20;if(counter=0) counter=60;5.6.3 数字钟设计【控制要求】6位数码管显示,采用动态扫描方式,两位显示时位,两位显示分位,两位显示秒位,初始时间位23点

33、58分46秒。、【参考程序】#include /数码管段码控制:0,1,2,3,4,5,6,7,8,9unsigned char duanma10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/数码管位码控制:p2.7 p2.6 p2.4 p2.3 p2.1 p2.0unsigned char weima6=0x7f,0xbf,0xef,0xf7,0xfd,0xfe;unsigned char jishu1=0,jishu2=0,shi=23,fen=58,miao=46;/数码管显示位控制unsigned char xianshi6=0,0,0,0,0,0;/*/延时函数/*void delay10ms(void)unsigned char i,j;for(i=10

温馨提示

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

评论

0/150

提交评论