C51单片机应用技术项目化教程 教学课件 ppt 作者 李庭贵 龙舰涵 主编 2014-07-30 《C51单片机应用技术项目化教程》思考与习题详解.doc

上传人:rrsccc 文档编号:8822341 上传时间:2021-01-18 格式:DOC 页数:128 大小:882.50KB
返回 下载 相关 举报
C51单片机应用技术项目化教程 教学课件 ppt 作者 李庭贵 龙舰涵 主编 2014-07-30 《C51单片机应用技术项目化教程》思考与习题详解.doc_第1页
第1页 / 共128页
C51单片机应用技术项目化教程 教学课件 ppt 作者 李庭贵 龙舰涵 主编 2014-07-30 《C51单片机应用技术项目化教程》思考与习题详解.doc_第2页
第2页 / 共128页
C51单片机应用技术项目化教程 教学课件 ppt 作者 李庭贵 龙舰涵 主编 2014-07-30 《C51单片机应用技术项目化教程》思考与习题详解.doc_第3页
第3页 / 共128页
C51单片机应用技术项目化教程 教学课件 ppt 作者 李庭贵 龙舰涵 主编 2014-07-30 《C51单片机应用技术项目化教程》思考与习题详解.doc_第4页
第4页 / 共128页
C51单片机应用技术项目化教程 教学课件 ppt 作者 李庭贵 龙舰涵 主编 2014-07-30 《C51单片机应用技术项目化教程》思考与习题详解.doc_第5页
第5页 / 共128页
点击查看更多>>
资源描述

《C51单片机应用技术项目化教程 教学课件 ppt 作者 李庭贵 龙舰涵 主编 2014-07-30 《C51单片机应用技术项目化教程》思考与习题详解.doc》由会员分享,可在线阅读,更多相关《C51单片机应用技术项目化教程 教学课件 ppt 作者 李庭贵 龙舰涵 主编 2014-07-30 《C51单片机应用技术项目化教程》思考与习题详解.doc(128页珍藏版)》请在三一文库上搜索。

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 unsigned 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/*

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

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1