没有合适的资源?快使用搜索试试~ 我知道了~
首页51单片机外围电路设计及C语言LED控制实例
51单片机外围电路设计及C语言LED控制实例
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 98 浏览量
更新于2024-07-01
收藏 1.24MB DOC 举报
本资源文档详细介绍了51单片机的基本外围电路设计以及相关的C语言程序编写。51单片机作为一款广泛应用的微控制器,其外部引脚和内部结构是理解和开发的基础。文档首先从单片机的I/O口操作入手,例如P0口,它是89C51单片机的一个重要接口,可以作为输入输出口使用。P0.0端口通过不同的连接方式,如拉高电阻或直接驱动,能够控制LED的点亮与熄灭,这里展示了利用C语言编程实现LED闪烁的实例,通过延时函数来控制脉冲信号的周期。 在电路设计方面,文档提到的最小系统包括晶体振荡电路,用于稳定单片机的工作频率,通常选择12MHz的晶振;加电复位电路确保单片机正确启动,通过R1和电解电容器C3共同完成。此外,为了保护LED,电路中还配备了限流电阻R3,防止电流过大损坏LED。 程序设计部分使用了Keil C软件,这是一种流行的嵌入式开发工具。文档倡导在编写程序前建立清晰的文件管理体系,将所有与项目相关的源代码、编译后的hex文件等存放在特定的文件夹中,以便于管理和查找。编程步骤涉及创建新项目、设置硬件连接、编写C代码,以及调试和编译程序。 在实际操作中,学习者会逐步掌握如何配置定时器或中断系统来精确控制LED的闪烁周期,以及如何通过C语言的结构体、指针等高级特性进行更复杂的外围设备控制。同时,文档提供的实例和理论知识相结合,使得学习者能更好地理解51单片机的工作原理,并能在实践中应用所学知识。 这份文档是针对初学者和有一定基础的开发者,提供了全面的51单片机外围电路设计实践指导和C语言编程案例,适合进行单片机基础训练和项目开发。通过深入学习,读者可以掌握单片机控制外部设备的关键技能,并为进一步的嵌入式系统设计打下坚实基础。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/85996098/bge.jpg)
. .
14 / 86
(2)为什么不用 P2 口直接驱动数码管?
(3)本案例如果 200 微秒中断 1 次,也可以实现 1 定时,显示结果会怎样?
3.2.3 设计一个 6 位数码管时间显示程序
本案例使用 6 位数码管显示时间,能显示时/分/秒,显示格式是 00.00.00 到 23.59.59。
其中小时和分钟之间的小数点常亮,分钟和秒之间的小数点进行秒闪烁。
一、参考电路
二、参考程序
/*****************************************************************************/
#include<reg51.h>
#defined unsigned char uchar
code uchar seven_seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
code uchar seg_scan[6] = {0xfb,0xf7,0xef,0xdf,0bf,0x7f}; //各个数码管对应的位选数据
uchar counter[3] = {0,0,0}; //时位、分位和秒位
uchar tick,cp,i,j; //tick:秒信号,cp:中断次数累计
void dispaly(void)
{
uchar d;
d = d * tick; //d 的值 1 秒内改变 1 次,要么 0x00,要么 0xff
d = d | 0x7f; //d 的值 1 秒内改变 1 次,要么 0x7f,要么 0xff
swich(i)
{
case 0 : P0 = seven_seg[counter[0]%10]; break; //显示秒个位
case 1 : P0 = seven_seg[counter[0]/10]; break; //显示秒十位
case 2 : P0 = d & seven_seg[counter[0]%10]; break; //数据高 8 位 1 秒改变 1 次,实现小
//数点秒闪烁
case 3 : P0 = seven_seg[counter[0]/10]; break; //显示分十位
case 4 : P0 = 0x7f & seven_seg[counter[0]%10]; break; //显示数据高 8 位为低电平,小数点
常亮
case 5 : P0 = seven_seg[counter[0]/10]; break; //显示时十位
} break;
P2 = seg_scan[i];
i++;
if(i == 6) i = 0;
}
void timer0_isr(void) interrupt 1 // timer0 中断服务函数
{
TR0 = 0; //停止计数
TL0 = 0x11; // TL0 重新预置
TH0 = 0xee; // TH0 重新预置
TR0 = 0; //开始计数
cp++; // timer0 中断 1 次,变量 cp 加 1
if(cp == 100) //中断 100 次,时间刚好为 0.5 秒
{
![](https://csdnimg.cn/release/download_crawler_static/85996098/bgf.jpg)
. .
15 / 86
cp = 0;
tick = ~tick; //秒脉冲信号
j++;
}
if(j == 2) //刚好 1 秒
{
j = 0;
counter[0]++; //个位数,1 秒加 1
}
if(counter[0] == 60) {counter[0]= 0; counter[1]++;}
if(counter[1] == 60) {counter[1]= 0; counter[2]++;}
if(counter[2] == 24) counter[2]= 0;
display();
}
void timer0_initialize(void) // timer0 中断初始化函数
{
EA = 0;
TMOD = 0x01;
TR0 = 0;
TL0 = 0x11;
TH0 = 0xee;
PT0 = 1;
ET0 = 1;
EA = 1;
TR0 = 1;
}
void main (void)
{
timer0_initialize() // timer0 初始化,为中断做好准备
while (1);
}
/*****************************************************************************/
三、程序说明
1.利用 counter[2]、counter[1] 和 counter[0]变量分别表示时、分和秒位的数值大小,
也可以利用结构体定义这些变量,如:
/*************************/
typedef struct
{
ucar hour;
ucar min;
ucar sec;
}time;
time now; //now 是数据类型为 time 的变量
/*************************/
![](https://csdnimg.cn/release/download_crawler_static/85996098/bg10.jpg)
. .
16 / 86
然后就可以用 now.hour,now.min 和 now.sec 分别代替 counter[2]、counter[1] 和
counter[0].变量
2.执行 timer0 中断服务函数时调用了 dispaly()函数,直接把 dispaly()的函数体程序写
在中断函数体内也行,但中断服务函数会显得臃肿。timer0 每 5 毫 秒 中 断 1 次 , 调 用
dispaly()函数执行 1 次,在执行 dispaly()过程中,当 i = 0 时,只显示秒个位,当 i = 1 时,
只显示秒十位,依次类推。为了让小时的个位小数点常亮,让小时个位显示时,把显示编码
数据的高 8 位设置为 0;为了分个位小数点秒闪烁,把分个位小数点位设置一个周期变化的
量即可。
3.程序与复杂,使用的变量就愈多,在程序分析和设计时,需要注意使用的变量最好使
用有一定含义的字符表示。
3.3 键盘程序设计
按键是一种开关,通过外界作用力,导电金属或导电非金属接触与分离实现电路通断
![](https://csdnimg.cn/release/download_crawler_static/85996098/bg11.jpg)
. .
17 / 86
的控制是按键的基本机械原理,如计算机键盘、手机、MP3 以与电子表按键。按键是计算
机系统输入设备,也是人机信息交换的主要途径。
按键按下会产生抖动现象,不能安全有效的对系统控制,本节根据按键产生的抖动机
理,提出以中断、延时等措施消除键盘输入过程中的不稳定因素,实现单片机系统键盘的稳
定输入。
3.3.1 键盘抖动现象
按键按下都会发出一声响,谁然有的按键声音很轻微,但这都是导体碰撞产生的震动。
这种现象称为键盘抖动。如果不对键盘的抖动进行处理,按键会对系统电路或程序产生意外
的干扰。为了观察按键的抖动现象,我们先做一个小实验,分析一下一个微触按键产生抖动
对系统的影响。
图 3-3-1 加数计数小系统图 3-3-2 加数计数小系统
在图 3-3-1 所示的一个加数计数小系统中,设计数器的脉冲输入端 CP 为上升沿有效,
加计数器初始显示为 0。按键不按时,CP = 0,计数器不加 1 计数。一般认为:按键按下,
CP 端由低电平变为高电平,含有电平上升沿,计数器加 1 计数,并且按下 1 次,计数器加
1。实际实验时会发现,按键按下 1 次,计数器不是加 1,而是跳跃一次性增加 3 或 4。原
因是按键按下在导体接触的瞬间产生了震动。图 3-3-2 是按键按下过程中 CP 端实际电平改
变情况。T1 为不按按键时刻,T2 为按键按下瞬间的抖动,T3 为按键按下稳定时刻,T4 为
按键放开时刻瞬间,T5 为按键放开时刻。从图中可以了解到,按键按下的瞬间由于震动会
是按键内部的导体稳定接触,而是在导通和不导通之间来回弹跳,虽然时间一瞬间,但使 CP
端获得了多个电平的上升沿。按键抖动时间的长短由按键的机械特性决定,一般为 5ms~
10ms。因此不能直接把按键作为 1 个脉冲的输入。
在数字电路中,常利用触发器消除键盘抖动,但在单片机系统中,按键可以直接接在
单片机的 I/O 口上,常利用键盘程序来消除键盘的抖动现象。
3.3.2 利用外部中断 INT0 实现键盘输入
本案列利用外部中断 INT0 作为键盘输入端,当按键按下时,让单片机执行外部中断服务程
T1 T2 T3
T4
T5
高电平
低电平
加计数器
+VCC
CP
KEY
R
![](https://csdnimg.cn/release/download_crawler_static/85996098/bg12.jpg)
. .
18 / 86
序,在中断服务中完成键盘控制。
一、参考电路
在最小系统基础上,单片机的 P0.0 口接一只 LED,键盘接在 P3.2 端口,按键不按时,由
于 P3.2 接有上啦电阻 R3,所以 P3.2 此时为高电平+5V,如果按键按下,P3.2 电源地短路,
P3.2 为低电平。为了消除键盘抖动现象,键盘两端并联滤波电容器 C4。
图 3-3-3 利用外部中断 INT0 实现键盘输入电路
二、程序设计
/*****************************************************************************/
#include<reg51.h>
sbit LED = P0^0;
void int0_isr(void) interrrupt 0 //INT0 中断服务函数,INT0 的中断号为 0
{ unsigned char i = 0;
i = ~i; //INT0 中断 1 次,i 值改变 1 次
LED = i; //INT0 中断 1 次,LED 工作状态变化 1 次
delay(); //调用延时函数
}
void main(void)
{ LED = 0; //芯片初始化时,LED 灭
EA = 0;
EX0 = 1; //开启 INT0 中断
PX0 = 1; //INT0 中断优先,可以省去
EA = 1; //开启总中断开关
while(1); //等待按键按下,中断发生
}
/*****************************************************************************/
三、程序说明
这里没有设置 INT0 是下降沿触发中断或是低电平触发中断,原因是按键按下,不管产
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
2
3
4
5
6
7
8
P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7
P2.7/A15
P2.6/A14
P2.5/A13
P2.4/A12
P2.3/A11
P2.2/A10
P2.1/A9
P2.0/A8
RESET
XTAL2
XTAL1
EA
ALE
PSEN
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD
10
11
12
13
14
15
16
17
P1.7
1
19
18
9
C1 30P
C2 30P
CY 12MHz
R1 1K
C3 10
μ
IC STC89C51
VCC
R2 1K
LED1
VCC(+5V)
R3 10K
C4 0.1
KEY
剩余85页未读,继续阅读
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
matlab大师
- 粉丝: 2631
- 资源: 8万+
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 计算机人脸表情动画技术发展综述
- 关系数据库的关键字搜索技术综述:模型、架构与未来趋势
- 迭代自适应逆滤波在语音情感识别中的应用
- 概念知识树在旅游领域智能分析中的应用
- 构建is-a层次与OWL本体集成:理论与算法
- 基于语义元的相似度计算方法研究:改进与有效性验证
- 网格梯度多密度聚类算法:去噪与高效聚类
- 网格服务工作流动态调度算法PGSWA研究
- 突发事件连锁反应网络模型与应急预警分析
- BA网络上的病毒营销与网站推广仿真研究
- 离散HSMM故障预测模型:有效提升系统状态预测
- 煤矿安全评价:信息融合与可拓理论的应用
- 多维度Petri网工作流模型MD_WFN:统一建模与应用研究
- 面向过程追踪的知识安全描述方法
- 基于收益的软件过程资源调度优化策略
- 多核环境下基于数据流Java的Web服务器优化实现提升性能
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)