完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1、规范使用我们的单片机开发板
(1)、给单片机通电之后, 不要用手触摸引脚 (2)、芯片不能装反 (3)、先关闭单片机电源,再撤掉数据线 2、LED流水灯 /*------------------按键 ---------------------*/ 我们51单片机。一共是配置有4个独立的按键 key1 ===》 P3^3 key2 ===》 P3^4 key3 ===》 P3^6 key4 ===》 P3^7 ***it key1 = P3^3; if(key1 == 0) { 执行语句1; } else { ````````; } 练习: 编写一个按键控制LED灯的函数; 测试没有小抖动的程序与消除抖动之间的区别。 /*-------------------模块化编程----------------*/ 1、对工程进行模块化划分 一个模块一个.c 一个.c 对应一个 .h 在.c 文件中 , 一个功能一个函数 在*.c文件中,如果需要需要用到其他模块的函数 怎么办? #include "****.h" 去包含 在.c文件中 , 每一个函数, 我们需要对它进行功能注释, 方便以后进行复习回顾 练习: 把我们的工程进行模块化 全局变量 、 局部变量 int a ; void sum() { int b = 1 , c = 2; a = b + c; } void chu() { int b = 2 , c = 1; a = b / c; } main() { sum(); chu(); } /---------* 蜂鸣器 * ------- / 蜂鸣器: 蜂鸣器电路: 使用的PNP型三极管 驱动蜂鸣器 , 当P0^7为低电平时,PN结 正向偏置,三极管导通,蜂鸣器发出声音: ***it beep = P0^7; 练习: 通过按键,操作我们的蜂鸣器 ======================================================== /---------------------中断------------------------/ 1、问题的引入 while(1) { if( 0 == key1 ) ; if( 0 == key2 ) ; } 上面这种检测按键是否按下的方式: 称之为 “轮询” 2、轮询 轮流的询问 , (相当于 CPU 一直询问按键 1 与 按键 2 , 是否按下) 显然 , 轮询去判断按键 ,有什么缺点? (1)、 占用CPU (2)、 轮询存在时间差 我们这里用的方式是一直在等待 , 那么有没有一种方法 , 不用去登 , 而是当有按键按下或者弹起的时候 , 来通知 “我” ==》》 中断系统 1、什么是中断? 我们一般把打断CPU执行顺序的事件 , 称之为中断 , C51中断原理: 当特定的中断产生时 , CPU会立即切换到中断模式 打断我们main函数的执行 , 到指定的地址去执行中断处理函数。 例子: 看综艺 玩游戏、打电话 中断源: 产生中断事件的设备 C51中 支持 5 个中断 外部中断0 P3^2 定时器0中断 外部中断1 P3^3 定时器1中断 串口中断 那么当中断产生之后 , 我们如何知道是哪一个中断呢?我们该去哪里找 CPU如何知道是哪一个中断: 中断向量表: 不同的中断 , 对应的不同的入口地址 [tr]编号中断源:入口地址[/tr]
所以请多看、多记编号 C51中断的配置: 外部中断0 、 1: 触发方式: 低电平触发: IT0 = 0 IT1 = 0 下降沿触发: IT0 = 1 IT1 = 1 中断开关: EX0 -> 外部中断 0 EX1 -> 外部中断 1 使能外部中断 EX0 EX1 , 置 1 中断总开关 EA = 1 C语言如何去编写我们的中断系统函数 1、中断初始化 2、编写中断服务函数 练习: 通过外部按键中断 ,去打断我们main执行的流水灯 , 中断服务函数(另一种花样的流水灯程序) 伪代码: /*-----------中断初始化函数---------------*/ void interrupt_init() { //配置外部中断1 , 低电平触发: //使能外部中断1 //开启中断总允许 } /*------------中断服务函数---------------*/ void interrupt(void) interrupt 编号 { //用户自由编写 } 实例 #include"interrupt.h" #include"led.h" #include"key.h" #include /*-----------中断初始化函数---------------*/ void interrupt_init() { IT1 = 0; //配置外部中断1,低电平触发 EX1 = 1; //使能外部中断1 EA = 1; //开启中断总允许 } /*------------中断服务函数---------------*/ void interrupt_IT1(void) interrupt 2 { led_huayang(); } /*-------------数码管-------------*/ 数码管: 准备来说,是LED数码管 是由多个发光二极管封装在一起组成“8”字型的器件 对应的LED引脚已经在内部连接成功,总共8个LED 分别对应的字母为 a , b , c ,d , e , f , g ,dp 例如: 显示数字 “2” a亮,b亮,c灭 , d亮 ,e亮 ,f灭 ,g亮 ,dp亮 0010 0100 ==》 0x24 我们16进制对应的二进制表达式: 低字节是在右边 所以我们的寄存器P0组的P0^0对应的 是最右边的比特 所以需要从右开始依次对P0组进行改写 0010 0100 0x24 进行寄存器整体赋值 P0 = 0x24; 在点亮我们的数码管之前: 要开启相应的位选 , 也就是开关 是的我们的a~dp把条引线去作用于对应的数码管 位选代码 #include"shumaguan.h" #include"delay.h" #include ***it w1 = P1^0; ***it w2 = P1^1; ***it w3 = P1^2; ***it w4 = P1^3; void show_0718(){ w4 = 0; P0 = 0xc0; delay_ms(1); w4 = 1; w3 = 0; P0 = 0xf8; delay_ms(1); w3 = 1; w2 = 0; P0 = 0xf9; delay_ms(1); w2 = 1; w1 = 0; P0 = 0x7f; delay_ms(1); w1 = 1; } 总结今天讲的内容: 蜂鸣器、按键 、模块化编程、数码管 、中断 1、外部按键中断实现所有的数码管依次从0显示到9 中断用外部中断1 , 下降沿触发的方式 (用到延时函数) |
||
|
||
只有小组成员才能发言,加入小组>>
3318 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9063 浏览 16 评论
4088 浏览 18 评论
1185浏览 3评论
609浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
601浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2337浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1897浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 11:00 , Processed in 0.990081 second(s), Total 49, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号