单片机C语言编程与设计.ppt
《单片机C语言编程与设计.ppt》由会员分享,可在线阅读,更多相关《单片机C语言编程与设计.ppt(75页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 1.基本示例分析基本示例分析 2.单片机应用系统设计单片机应用系统设计单片机C语言编程与设计一、基本示例分析:一、基本示例分析:例例1、LED的控制的控制 使用使用805l的的Port 1连接连接8个个LED,以产生跑马灯以产生跑马灯的效果。连接好电路并且完成程序之后,您将可的效果。连接好电路并且完成程序之后,您将可以看到以看到8个个LED依次轮流闪烁。依次轮流闪烁。在这次练习中,您将学会如何使用在这次练习中,您将学会如何使用I/O Port输输出数据,以及如何使用循环实现时间延迟。出数据,以及如何使用循环实现时间延迟。电电路路图图#include void delay(void)/*del
2、ay 函数函数*/unsigned char i,j;/*这个函数执行时间的延迟这个函数执行时间的延迟*/for(i=0;i255;i+)for(j=0;j255;j+);void main(void)unsigned char j=0XFE;/*声明变量声明变量 j*/while(1)/*无穷循环无穷循环*/*依次让依次让LED 0,1,2,3,4,5,6,7闪烁闪烁*/j=(j1)|0 x01;if(j=0XFF)j=0XFE;P1=j;/*将数值输出到将数值输出到Port1,控制控制LED亮或灭亮或灭*/delay();/*调用调用 delay 函数函数*/例例2、指、指拨开关的输入拨开
3、关的输入 目的是使用目的是使用8051的的Port l连接到连接到8个个LED,Port 2则连接到则连接到1个指拨开关,当用户拨动指拨开关时,相个指拨开关,当用户拨动指拨开关时,相对应的对应的LED就会亮或灭。就会亮或灭。在这次练习中,您将学会如何使用在这次练习中,您将学会如何使用8051输入数据。输入数据。例如,您要从例如,您要从Port 2Port 2输入数据给变量输入数据给变量temptemp时,可时,可以执行以执行temp=P2temp=P2;电电路路图图#include void delay(void)/*delay 函数函数*/unsigned char i,j;/*这个函数执行
4、时间的延迟这个函数执行时间的延迟*/for(i=0;i255;i+)for(j=0;j255;j+);void main(void)unsigned char temp;/*声明变量声明变量temp */while(1)/*无穷循环无穷循环*/temp=P2;/*将将P2输入的数据直接放入变量输入的数据直接放入变量temp当中当中*/P1=temp;/*将变量将变量temp中的数据直接输出到中的数据直接输出到Port 1*/delay();例例3、七段显示器的控制七段显示器的控制 目的是使用目的是使用8051的的Port 1连接到一个共阳的七连接到一个共阳的七段显示器,然后让段显示器,然后让8
5、051轮流显示轮流显示09。当您连接好。当您连接好电路,并且完成程序之后,您将看到七段显示器电路,并且完成程序之后,您将看到七段显示器依次显示依次显示09。在这次练习中,您将学会如何使用在这次练习中,您将学会如何使用805l控制共控制共阳七段显示器的显示。阳七段显示器的显示。一个共阳七段显示器的外观和引脚如图所示。一个共阳七段显示器的外观和引脚如图所示。这个共阳七段显示器的引脚分别连接到这个共阳七段显示器的引脚分别连接到805l的的Port l引脚。引脚。电电路路图图#include code seven_seg10=0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF
6、8,0X80,0X90;void delay(void)/*时间延迟的函数时间延迟的函数*/unsigned char i,j;for(i=0;i255;i+)for(j=0;j255;j+);void main(void)unsigned char i;/*变量变量 i 用来储存用来储存 09*/while(1)/*无穷循环无穷循环*/for(i=0;i10;i+)P1=seven_segi;/*输出输出 09 到共阳七段显示器到共阳七段显示器*/delay();/*调用时间延迟函数调用时间延迟函数delay*/共阳七段显示器有一共同接点连接到共阳七段显示器有一共同接点连接到5 5V V,其
7、余的七支引其余的七支引脚分别如图所示脚分别如图所示 因此如果要让所指定的因此如果要让所指定的LED发光时,就必须输出发光时,就必须输出0,反之则输出反之则输出1,所以我们可以用下,所以我们可以用下表排列出所要显示字符表排列出所要显示字符和必须输出的信号。下表中,假设和必须输出的信号。下表中,假设dotdot点接在最高位,而点接在最高位,而且不点亮,且不点亮,所以一直都是所以一直都是1 1 。将以上的信息编成将以上的信息编成16进制码,然后存放在定义为进制码,然后存放在定义为seven_ seg的数组中。的数组中。我们将共阳七段显示器显示出我们将共阳七段显示器显示出09的字型码储存在程序的字型码
8、储存在程序存储器中存储器中。当用户有固定不变的数据时,就可以储存在程序当用户有固定不变的数据时,就可以储存在程序存储器中。储存在程序存储器的数据必须存声明的变景附加存储器中。储存在程序存储器的数据必须存声明的变景附加上上codecode,如以下的声明方式:如以下的声明方式:code seven_seg10=0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90;例例4、计时器、计时器Timer0 的溢出中断控制的溢出中断控制 在前面,我们曾经捉到过使用在前面,我们曾经捉到过使用for循环实现时间延循环实现时间延迟并不是很精确,例如,程序会受到中断的执
9、行而影响迟并不是很精确,例如,程序会受到中断的执行而影响延迟时间。在这次实习中,您将学会如何使用延迟时间。在这次实习中,您将学会如何使用8051的的Timer0计时器溢出中断实现准确的时间延迟。计时器溢出中断实现准确的时间延迟。本本练习练习使用使用8051的的Port 1连接到一个共阳七段显示连接到一个共阳七段显示器,然后利用计时计数器器,然后利用计时计数器Timer l,让让8051在指定的时在指定的时间间隔内显示出间间隔内显示出09。当您连接好电路,并且完成程序当您连接好电路,并且完成程序之后,您将可以看到七段显示器依次显示之后,您将可以看到七段显示器依次显示0 9。#include#de
10、fine TIMER0_COUNT 0 xEE11 const seven_seg10=0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90;unsigned char timer0_tick,i=0;static void timer0_isr(void)interrupt TF0_VECTOR using 1 TR0=0;TL0=(TIMER0_COUNT&0 x00FF);TH0=(TIMER0_COUNT 8);TR0=1;timer0_tick+;if(timer0_tick=200)i+;if(i=10)i=0;timer0_tick=
11、0;P1=seven_segi;static void timer0_initialize(void)EA=0;/*设定系统不接受所有的中断设定系统不接受所有的中断*/timer0_tick=0;TR0=0;/*关闭关闭Timer0*/TMOD=0 x01;/*设定计时器设定计时器0为为16位的工作模式位的工作模式*/TL0=(TIMER0_COUNT&0 x00FF);/*设定设定TL0的数值的数值*/TH0=(TIMER0_COUNT 8);/*设定设定TH0的数值的数值*/PT0=0;/*设定计时器设定计时器0有比较高的优先级有比较高的优先级*/ET0=1;/*设定接受设定接受Timer
12、0的中断的中断*/TR0=1;/*启动启动Timer0*/EA=1;/*设定系统接受中断设定系统接受中断*/void main(void)timer0_initialize();while(1);/*无穷循环无穷循环*/使用计时计数器使用计时计数器Timer0之前,必须先执行之前,必须先执行Timer0的初的初始化功能。始化功能。Timer0初始化按照以下的步骤:初始化按照以下的步骤:(1)先暂停接受所有的中断。先暂停接受所有的中断。(2)关闭关闭Timer0。(3)设置计时器设置计时器0的工作模式。的工作模式。(4)设置计时器设置计时器0的计数器数值的计数器数值(TL0和和TH0数值数值)。
13、(5)设置计时器设置计时器0有比较高的优先级有比较高的优先级(这一个步骤可以省略这一个步骤可以省略)。(6)设置接受设置接受Timer0的中断。的中断。(7)启动启动Timer0。(8)(8)设置系统接受中断。设置系统接受中断。中断定时时间计算:中断定时时间计算:如果外接石英晶体的频率是如果外接石英晶体的频率是12MHz时,因为时,因为8051的一个机械周期需要的一个机械周期需要12个石英晶体的振荡周期,个石英晶体的振荡周期,所以每秒就有所以每秒就有1000 000次的机械周期,换言之机械周次的机械周期,换言之机械周期是期是1us。如果我们希望如果我们希望Timer0每秒中断每秒中断200次,
14、那次,那么我们就必须让么我们就必须让Timer0每数每数5 000次就中断次就中断1次次(1 000 000/200=5000)。因为。因为Timer0的溢出中断是的溢出中断是Timer0数数到到65536(16进制表示时是进制表示时是10000H)就产生中断,因此就产生中断,因此要让要让Timer0数数5 000次就中断次就中断1次时就必须设置次时就必须设置Timer0等于等于10000H-(12000000(12200),也也就是就是0 xEE11。接下来我们可以利用以下的指令分别接下来我们可以利用以下的指令分别设置设置Timer0计数器的低计数器的低8位和位和Timer0的高的高8位。位
15、。TL0=(TIMER0_COUNT&0 x00FF);/*设定设定TL0的数值的数值*/TH0=(TIMER0_COUNT 8);/*设定设定TH0的数值的数值*/Timer0的溢出中断服务程序格式如下所示:的溢出中断服务程序格式如下所示:static void timer0_isr(void)interrupt TF0_VECTOR using 1 加入中断之后必须处理的程序加入中断之后必须处理的程序 其中其中TF0 VECTOR是定义在文件是定义在文件regx51.h中的常量,中的常量,其数值是其数值是1,这是因为,这是因为Timer0的中断向量是的中断向量是1。TF0_VECTOR后面
16、所接的后面所接的using 1,表示进入表示进入Timer0的溢出中断服务程序之后会使用寄存器组的溢出中断服务程序之后会使用寄存器组1(Register Bank 1),而离开而离开Timer0的溢出中断服务程序时编译器也的溢出中断服务程序时编译器也会自动恢复使用原先的寄存器组会自动恢复使用原先的寄存器组 8051中有中有4个寄存器组,分别是寄存器组个寄存器组,分别是寄存器组0到寄存到寄存器组器组3,当,当8051开始执行时会自动采用寄存器组开始执行时会自动采用寄存器组0。进入中断服务程序时采用不同的寄存器组,可以进入中断服务程序时采用不同的寄存器组,可以避免破坏原先尚未进入避免破坏原先尚未进
17、入Timer0溢出中断服务程序时所溢出中断服务程序时所使用的寄存器内容。使用的寄存器内容。用户当然也可以采用原先的寄存器,但是此时就用户当然也可以采用原先的寄存器,但是此时就必须维护寄存器的内容,一般足存进入中断服务程序必须维护寄存器的内容,一般足存进入中断服务程序前先将使用到的寄存器放入堆栈中,等到要离开之后前先将使用到的寄存器放入堆栈中,等到要离开之后冉重新由堆栈取出,并恢复原先的数值,这种做法在冉重新由堆栈取出,并恢复原先的数值,这种做法在维护管理上要小心。维护管理上要小心。例例5、外部中断、外部中断 INT0 本实验使用本实验使用AT89S51的的Port 1连接到连接到8颗颗LED,
18、Port 1在正常状况下会输出跑马灯,然后通过用户在正常状况下会输出跑马灯,然后通过用户触动外部的硬件来中断触动外部的硬件来中断INT0,当当INT0引脚有低电引脚有低电位的脉冲出现时,位的脉冲出现时,8个个LED会一闪一灭会一闪一灭4次。次。在这次练习中,您将学会如何使用外部中断在这次练习中,您将学会如何使用外部中断INT0。电电路路图图#include void delay(void)/*delay 函数函数*/unsigned char i,j;/*这个函数执行时间的延迟这个函数执行时间的延迟*/for(i=0;i255;i+)for(j=0;j255;j+);void delay_4i
19、sr(void)/*delay_4isr 函数函数*/unsigned char i,j;/*这个函数执行时间的延迟这个函数执行时间的延迟*/for(i=0;i255;i+)for(j=0;j255;j+);static void xint0_isr(void)interrupt IE0_VECTOR unsigned char i,j=0XFF;/*变量变量 j*/for(i=0;i16;i+)j=j;P1=j;/*将数值输出到将数值输出到 LED 输出端口输出端口*/delay_4isr();void main(void)unsigned char j=0XFF;/*变量变量 j*/EA=
20、0;/*设定系统不接受所有的中断设定系统不接受所有的中断*/EX0=1;/*设定接受设定接受INT0的中断的中断*/PX0=1;EA=1;/*设定系统接受中断设定系统接受中断*/while(1)/*无穷循环无穷循环*/*依次让依次让LED 0,1,2,3,4,5,6,7闪烁闪烁*/j=(j1)|0 x01;if(j=0XFF)j=0XFE;P1=j;/*将数值输出到将数值输出到 LED 输出端口输出端口*/delay();/*调用调用 delay 函数函数*/例例6、按钮检测1 目的是使用目的是使用805 1的的PORT 2连接到一个弹跳式连接到一个弹跳式按钮作为输入,按钮作为输入,PORT
21、1则连接到则连接到1个共阳七段显示个共阳七段显示器。程序执行时,共阳七段显示器会先显示器。程序执行时,共阳七段显示器会先显示0,之之后当用户每按一次弹跳按钮,共阳七段显示器所显后当用户每按一次弹跳按钮,共阳七段显示器所显示的数字就会加示的数字就会加1,直到,直到9之后又会恢复到之后又会恢复到0。电电路路图图#include#define TRUE 1#define FALSE 0code seven_seg10=0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90;void delay(void)/*wait function*/unsigned
22、char i,j;/*only to delay for LED flashes*/for(i=0;i96;i+)for(j=0;j255;j+);/函数函数 keypressed 检查是否有按键按检查是否有按键按下下 int keypressed()do while(P2_0=1);delay();if(P2_0=0)delay();if(P2_0=0)return TRUE;while(1);void main(void)int c;P1=seven_segc;do if(keypressed()c+;if(c=10)c=0;P1=seven_segc;while(1);在这一个程序中,我
23、们写了一个判断按钮是否在这一个程序中,我们写了一个判断按钮是否被按下的函数被按下的函数keypressed,这一个函数在用户按下这一个函数在用户按下按钮时就返回按钮时就返回TRUE(1)。因为按下按钮时,必须消除按钮弹起的时间,因为按下按钮时,必须消除按钮弹起的时间,因此当程序检测到按钮事件时因此当程序检测到按钮事件时(P2 0等于等于0时时),必须,必须延迟一段时问之后再检查延迟一段时问之后再检查P2_0是否还是是否还是0,如果还是如果还是0,就表示按钮确实被按下,否则就表示只是无效信就表示按钮确实被按下,否则就表示只是无效信息而已。根据这个原理,所以设计出函数息而已。根据这个原理,所以设计
24、出函数keypressed的流程图,如图所示。的流程图,如图所示。例例7、按钮检测2 上一节的按钮检测程序中,消除弹起的时间是利用上一节的按钮检测程序中,消除弹起的时间是利用循环来延长一段时间之后,然后再检查按钮,这种做法循环来延长一段时间之后,然后再检查按钮,这种做法虽然可以消除弹起时间,但是却也造成循环执行时其他虽然可以消除弹起时间,但是却也造成循环执行时其他工作无法进行的缺点,所以在这一节中,我们把时间延工作无法进行的缺点,所以在这一节中,我们把时间延迟的部分交给迟的部分交给Timer0来处理,如此一来,就可以让来处理,如此一来,就可以让CPU处理其他事情了。处理其他事情了。本本练习练习
25、使用使用8051的的PORT 2连接到连接到2个弹跳式按钮作个弹跳式按钮作为输入,其中一个是上数的弹跳按钮,另一个则是下数为输入,其中一个是上数的弹跳按钮,另一个则是下数的弹跳按钮。的弹跳按钮。PORT l则连接到则连接到1个共阳七段显示器。程个共阳七段显示器。程序执行时,共阳七段显示器会先显示出序执行时,共阳七段显示器会先显示出0,之后每当用之后每当用户单击一次上数的弹跳按钮,共阳七段显示器所显示的户单击一次上数的弹跳按钮,共阳七段显示器所显示的数字就会加数字就会加1,直到,直到9之后又会恢复到之后又会恢复到0。而每当用户按而每当用户按一次下数的弹跳按钮,共阳七段显示器所显示的数字就一次下数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 语言 编程 设计
限制150内