赞
踩
目录
1、微机一台,Keil C集成开发环境
2、DP-51PRO.NET综合实验箱
3、Proteus仿真软件
注:本实验报告采用的单片机为AT89C51,其晶振频率为12MHz
1、51单片机的P1口接8个发光二极管LED,相邻的4个LED为一组,实现两组LED每隔1秒交替点亮一次,周而复始,画出电路,并用C51编写程序。
提示:1秒延时函数建议采用定时器编程实现。
方法1——for循环嵌套实现1秒延时
- //循环嵌套实现——8个LED小灯分两组交替亮
- #include <reg51.h>
- void main()
- {
- unsigned int i; /*范围为0~65535*/
- unsigned char j; /*范围为0~255*/
- P1 = 0xf0; /*LED灯初始状态*/
- while(1)
- {
- for(i=1000;i>0;i--)
- for(j=124;j>0;j--); /*循环实现1秒定时*/
- P1 = ~P1; /*换另一组小灯亮*/
- }
- }
代码分析:
内层for循环:for (j = 124; j > 0; j --) 循环124次,所消耗的时间为:124次×8个指令周期×1微秒 = 992微秒
外层for循环:for(i =1000; i > 0; i --) 循环1000次,将内层消耗的时间放大1000倍,还要加上自身所消耗的8个指令周期
for循环嵌套:总消耗的时间为:1000×(992+8)= 1秒,实现了1秒延时。
方法2——定时器T0模式1实现1秒定时
- //定时器实现——8个LED小灯分两组交替亮
- #include <reg51.h>
- void main()
- {
- unsigned char i = 10;
- P1 = 0xf0; /*设置P1口的初始状态,即LED灯初始亮灭状态*/
- TMOD = 0x01; /*T0方式1定时*/
- TR0 = 1; /*启动T0定时器*/
- while(1)
- {
- TH0 = 15536/256; /*设置定时高八位初值*/
- TL0 = 15535%256; /*设置定时低八位初值*/
- while(!TF0); /*查询TF0是否为1,以定时50ms*/
- TF0 = 0; /*TF软件清零*/
- i - -;
- if(i = = 0)
- {
- P1 = ~P1; /*P1口取反,使另外一组灯亮*/
- i = 20; /*对T0定时次数计数20次,实现1s定时*/
- }
- }
- }
代码分析:
采用16位计数/定时器最大定时为2^16×1微秒=65.536毫秒,不能直接满足定时1秒的要求,故而考虑先定时50毫秒,然后对定时50毫秒计数20次,从而实现1秒定时。
T0采用方式1(M1M0=01)16位定时方式,定时初值 = 2^16-50毫秒/1微秒 = 15536
设置定时器T0的初值,溢出时TF为1,然后TF软件清零,再对T0定时进行计数,实现了1秒定时。
电路仿真:
2、单片机P1口接8个发光二极管,/INT0引脚接一拨位开关或按键。开始P1.0对应LED亮,以后每中断一次,下一个LED亮,顺序下移且每次只有一个LED亮,周而复始,画出电路,并用C51编写程序。
思考:/INT0引脚直接接拨位开关或按键,现象有什么不同?如何去改进电路?
方式1——外接拨位开关
- //拨动开关触发中断
- #include <reg51.h>
- void x_int() interrupt 0 /*中断服务函数*/
- {
- P1 = (P1>>1) | 0x80;
- if(P1 == 0xff)
- {
- P1 = 0x7f;
- }
- }
- void main()
- {
- P1 = 0xfe;
- EA = 1; /*开中断总开关*/
- EX0 = 1; /*允许INTO中断*/
- IT0 = 1; /*下降沿产生中断*/
- while(1); /*等待中断*/
- }
电路仿真:
方式2——外接按键
- //按动按键触发中断
- #include <reg51.h>
- void x_int() interrupt 0 /*中断服务函数*/
- {
- P1 = (P1>>1) | 0x80;
- if(P1 == 0xff)
- {
- P1 = 0x7f;
- }
- }
- void main()
- {
- P1 = 0xfe;
- EA = 1; /*开中断总开关*/
- EX0 = 1; /*允许INTO中断*/
- IT0 = 1; /*下降沿产生中断*/
- while(1); /*等待中断*/
- }
电路仿真:
代码分析:
通过INT0引脚外接拨位开关,拨动开关形成外部中断,或者外接一按键,按动按键产生边沿信号形成外部中断,然后通过中断服务函数中的移位操作和逻辑运算等来改变LED小灯的状态。
单片机这个东西学起来还真是有趣~(【狗头】)
如果你觉得这篇文章写的还不错的话,别忘记向小新竖起你的大拇指(点赞)哦!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。