已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章 中断类 例 4 1 P104 假设外部中断 0 和外部中断 1 均为下降沿触发 当外部中断 0 发 生时 P0 端口的电平反向 当外部中断 1 发生时 P1 端口的电 平反向 include void IS0 void interrupt 0 P0 P0 P0 端口反向 void IS1 void interrupt 2 P1 P1 P1 端口反向 void main P0 0 x00 P1 0 xFF IT0 1 IT1 1 EX0 1 EX1 1 EA 1 while 1 例 4 9 外部中断示例 在本实例中 首先通过 P1 7 口点亮发光二极管 D1 然后外部输入一脉冲串 则发光二极管 D1 亮 暗交替 2 include sbit P1 7 P1 7 void interrupt0 interrupt 0 using 2 外部中断 0 P1 7 P1 7 void main EA 1 开中断 IT0 1 外部中断 0 脉冲触发 EX0 1 外部中断 0 P1 7 0 do while 1 如果有 3 个脉冲 则灯亮 暗交替一次 可如下面编程 include Sbit P17 P1 7 unsigned char i 3 void main EA 1 IT0 1 EX0 1 P17 0 do while 1 void interrupt0 interrupt 0 i i 1 if i 0 P17 P17 i 3 3 例 4 10 如图 4 18 所示 8 只 LED 阴极接至单片机 P0 口 两开关 S0 S1 分 别接至单片机引脚 P3 2 和 P3 3 编写程序控制 LED 状态 按下 S0 后 点亮 8 只 LED 按下 S1 后 变为闪烁状态 include sbit P32 P3 2 void delay unsigned int d 定义延时子函数 while d 0 void main P0 0 xFF 熄灭 LED IT0 1 IT1 1 外中断 0 1 脉冲触发方式 EA 1 EX0 1 EX1 1 开中断 for 延时等待中断发生 void INT0 ISR interrupt 0 外中断 0 中断服务函数 P0 0 x00 void INT1 ISR interrupt 2 外中断 1 中断服务函数 while P32 0 如果有外部中断 0 则退出 delay 5000 P0 0 x00 delay 5000 P0 0 xFF 4 定时类 例 4 16 设单片机的 fosc 12MHz 要求在 P1 0 上产生周期为 2ms 的方波 要在 P1 0 上产生周期为 2ms 的方波 定时器应产生 1ms 的周期性定时 定时到对 P1 0 取反 要产生 1ms 的定时 应选择方式 1 定时器方式 TMOD 的确定 选择定时器 计数器 T0 定时器方式 方式 1 GATE 不起作用 高 4 位为 0000 TMOD 01H TH TL 的确定 单片机的 fosc 12MHz 则单片机的机器周期为 1ms 1ms 1000ms 计数器的计数初值为 65 536 1000 TH0 65 536 1000 256 TL0 65 536 1000 256 采用查询方式 程序如下 include sbit P1 0 P1 0 void main void TMOD 0 x01 TR0 1 for TH0 65536 1000 256 TL0 65536 1000 256 do while TF0 P1 0 P1 0 TF0 0 采用中断方式 程序如下 include sbit P1 0 P1 0 void timer0 void interrupt 1 using 1 P1 0 P1 0 TH0 65536 1000 256 TL0 65536 1000 256 void main void TMOD 0 x01 P1 0 0 TH0 65536 1000 256 TL0 65536 1000 256 EA 1 ET0 1 TR0 1 do while 1 5 例 4 17 设系统时钟频率为 12MHz 编程实现从 P1 1 输出周期为 1s 的方波 要输出周期为 1s 的方波 应产生 500ms 的周期性定时 定时到则对 P1 1 取 反即可实现 由于定时时间较长 一个定时器 计数器不能直接实现 一个定时器 计数器 最长定时时间为 65ms 多一点 可以用以下两种方法实现 1 方法一 用定时 计数器 T0 产生周期性为 10ms 的定时 然后用一个变量对 10ms 计数 50 次 系统时钟为 12MHz 定时 计数器 T0 定时 10ms 计数值 N 为 10000 选方式 1 方式控制字为 B 01H 则初值 X 为 X 65 536 10 000 R1 470R R2 470R D0 D1 XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0 0 AD0 39 P0 1 AD1 38 P0 2 AD2 37 P0 3 AD3 36 P0 4 AD4 35 P0 5 AD5 34 P0 6 AD6 33 P0 7 AD7 32 P1 0 1 P1 1 2 P1 2 3 P1 3 4 P1 4 5 P1 5 6 P1 6 7 P1 7 8 P3 0 RXD 10 P3 1 TXD 11 P3 2 INT0 12 P3 3 INT1 13 P3 4 T0 14 P3 7 RD 17 P3 6 WR 16 P3 5 T1 15 P2 7 A15 28 P2 0 A8 21 P2 1 A9 22 P2 2 A10 23 P2 3 A11 24 P2 4 A12 25 P2 5 A13 26 P2 6 A14 27 U1 AT89C51 VCC A B include 6 sbit P1 1 P1 1 unsigned char i 定义计数变量 void main i 0 初始化 TMOD 0 x01 TH0 65536 10000 256 TL0 65536 10000 256 EA 1 ET0 1 TR0 1 while 1 void time0 int void interrupt 1 中断服务程序 TH0 65536 10000 256 重载初始值 TL0 65536 10000 256 重载初始值 i 每发生一次中断 计数变量加 1 if i 50 发生 50 次中断 定时 0 5ms P1 1 P1 1 i 0 计数变量清零 2 方法二 用定时 计数器 T1 计数实现 对 10ms 计数 50 次 定时 计数器 T1 工作于计 数方式时 计数脉冲通过 T1 P3 5 输入 设定时 计数器 T0 定时时间到 对 P1 0 取反一次 则 T1 P3 5 每 10ms 产生一个计数脉冲 那么定时 500ms 只需计数 25 次 设定时 计数器 T1 工作于方式 2 初值 X 256 25 231 TH1 TL1 231 因为定时 计数器 T0 工作于方式 1 定时方式 则 这时方式控制字为 B 61H 定时 计数器 T0 和 T1 都采用中断方式工作 R2 470R D1 XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0 0 AD0 39 P0 1 AD1 38 P0 2 AD2 37 P0 3 AD3 36 P0 4 AD4 35 P0 5 AD5 34 P0 6 AD6 33 P0 7 AD7 32 P1 0 1 P1 1 2 P1 2 3 P1 3 4 P1 4 5 P1 5 6 P1 6 7 P1 7 8 P3 0 RXD 10 P3 1 TXD 11 P3 2 INT0 12 P3 3 INT1 13 P3 4 T0 14 P3 7 RD 17 P3 6 WR 16 P3 5 T1 15 P2 7 A15 28 P2 0 A8 21 P2 1 A9 22 P2 2 A10 23 P2 3 A11 24 P2 4 A12 25 P2 5 A13 26 P2 6 A14 27 U1 AT89C51 VCC A B include 7 sbit P1 1 P1 1 sbit P1 0 P1 0 void main TMOD 0 x61 初始化 TH0 65536 10000 256 TL0 65536 10000 256 TH1 231 TL1 231 EA 1 ET0 1 ET1 1 TR0 1 TR1 1 while 1 void time0 int void interrupt 1 T0 中断服务程序 TH0 65536 10000 256 重载初始值 TL0 65536 10000 256 重载初始值 P1 0 P1 0 void time1 int void interrupt 3 T1 中断服务程序 P1 1 P1 1 例 4 18 设系统时钟频率为 12MHz 编程实现 P1 1 引脚上输出周期为 1s 占空比为 20 的脉冲信号 根据输出要求 脉冲信号在一个周期内高电平占 0 2s 低电平占 0 8s 超出了 定时器的最大定时间隔 因此利用定时器 0 产生一个基准定时配合软件计数来 实现 取 50ms 作为基准定时 采用工作方式 1 这样这个周期需要 20 个基准 定时 其中高电平占 4 个基准定时 include sbit P1 1 P1 1 unsigned char i 定义计数变量 void main i 0 初始化 TMOD 0 x01 TH0 65536 50000 256 TL0 65536 50000 256 EA 1 ET0 1 TR0 1 while 1 void time0 int void interrupt 1 中断服务程序 TH0 65536 50000 256 重载初始值 TL0 65536 50000 256 i i 1 if i 4 P1 1 0 高电平时间到变低 else if i 20 周期时间到变高 P1 1 1 8 i 0 计数变量清零 第五章 例 5 9 串行口自发自收 include define uchar unsigned char define uint unsigned int void main uchar i 0 x55 uint j 0 TMOD 0X20 设定定时器 1 模式 2 TL1 TH1 0XF4 9 PCON 0X00 SCON 0X50 TR1 1 while 1 SBUF i 发送数据 do while RI RI 0 TI 0 i SBUF 读取接收数据 P1 i i i 将发送数据取反 for j 0 j 12500 j 例 5 10 两个单片机串行通信 1 单片机 1 的 C51 源程序代码 include define uint unsigned int define uchar unsigned char void main uchar i TMOD 0 x20 TH1 TL1 0 xff SCON 0 x50 PCON 0 x80 TR1 1 P1 0 xff while 1 P1 0 xff i P1 SBUF i 10 while TI 0 TI 0 单片机 2 的 C51 源程序 include define uint unsigned int define uchar unsigned char void main uchar i 0 TMOD 0 x20 TH1 TL1 0 xff SCON 0 x50 PCON 0 x80 TR1 1 while 1 while RI 0 RI 0 i SBUF P1 i 两个单片机串行通信 2 C51 源程序代码如下 include define uchar unsigned char define TR 1 TR 1 发送 uchar idata buf 10 uchar pf void main int 串行口初始化子函数 if TR 0 send buf 发送 else receive buf 接收 串口初始化子函数 void init void TMOD 0 x20 T1 工作于方式 2 TH0 0 xE8 TL0 0 xE8 TR1 1 SCON 0X50 串行口工作于方式 1 REN 1 发送子函数 11 void send uchar idata d uchar i do SBUF 0 xAA 发送联络信号 while TI 0 等待一帧发送完毕 TI 0 发送完毕 标志位清 0 while RI 0 等待乙机应答信号 RI 0 while SBUF 0 xBB 0 乙机未准备好 继续联络 do pf 0 校验和变量清 0 for i 0 i 10 i SBUF d i 发送一个数据 pf d i 计算校验和 while TI 0 TI 0 SBUF pf 发送校验和 while TI 0 TI 0 while RI 0 RI 0 等待乙机应答 while SBUF 0 回答出错 则重新发送 接收函数 void receive uchar idata d uchar i do while RI 0 RI 0 while SBUF 0 xAA 0 判断甲机是否请求 SBUF 0 xBB 发应答信号 while TI 0 TI 0 while 1 pf 0 清校验和 for i 0 i 10 i d i SBUF 接收数据 pf d i 计算校验和 while RI 0 RI 0 接收甲校验和 If SBUF pf 0 比较校验和 SBUF 0 x00 break 校验和相等 发 0 x00 else SBUF 0 xFF 校验和不相等 发 0Xff while TI 0 TI 0 第六章 12 静态 例 6 1 利用单片机的并行口作为静态显示的输出口的示例 静态轮流显示 12 和 AB 的 C51 源程序如下 include define uchar unsigned char uchar data dis buf 2 显示缓冲区 uchar code able 18 0 x3f 0 x06 0 x5b 0 x4f 0 x66 0 x6d 0 x7d 0 x07 0 x7f 0 x6f 0 x77 0 x7c 0 x39 0 x5e 0 x7 9 0 x71 0 x40 0 x00 显示的代码表 void dl unsigned int i for i 0 i 40000 i void display void 显示函数 uchar segcode segcode dis buf 0 P0 口显示 segcode table segcode P0 segcode segcode dis buf 1 P3 口显示 segcode table segcode P3 segcode void main void 主函数 while 1 dis buf 0 1 dis buf 1 2 显示 12 display dl dis buf 0 16 dis buf 1 16 显示 display dl dis buf 0 10 dis buf 1 11 显示 AB display dl 13 示例中的显示函数 display 可以再简单一些 如下面程序段 void display void P0 table dis buf 0 P0 口显示 P3 table dis buf 1 P3 口显示 动态 例 6 3 利用 MCS 51 单片机的并行口作为动态显示的段口与位口的示 例 6 位数码管动态显示 的 C51 源程序如下 1 随机调用 include define uchar unsigned char uchar data dis buf 6 显示缓冲区 uchar code table 18 0 x3f 0 x06 0 x5b 0 x4f 0 x66 0 x6d 0 x7d 0 x07 0 x7f 0 x6f 0 x77 0 x7c 0 x39 0 x5e 0 x79 0 x71 0 x40 0 x00 代码表 void dl ms 延时 1ms 函数 unsigned int j for j 0 j 200 j void display void 显示函数 uchar segcode bitcode i bitcode 0 xfe 位码赋初值 for i 0 i 6 i segcode dis buf i 显示缓冲器内容查表 P0 table segcode P3 bitcode dl ms P3 0 xff 关闭显示 bitcode bitcode 1 调整位码 bitcode bitcode 0 x01 void main void 14 dis buf 0 1 dis buf 1 2 dis buf 2 3 dis buf 3 4 dis buf 4 5 dis buf 5 6 while 1 display 2 定时调用 定时调用是通过定时器 计数器的定时功能来定时一定的时间 如 20ms 定时 时间到来调用显示函数 void main void 定时调用 TMOD 0 x01 TH0 20000 256 TL0 2000 256 EA 1 ET0 1 TR0 1 dis buf 0 1 dis buf 1 2 dis buf 2 3 void time0 int interrupt 1 TH0 20000 256 TL0 2000 256 display dis buf 3 4 dis buf 4 5 dis buf 5 6 while 1 例 6 6 独立式按键示例 C51 源程序如下 include define uchar unsigned char define uint unsigned int uchar data key2 code uchar dirtab 0 xc0 0 xf9 0 xa4 0 xb0 0 x99 0 x92 0 x82 0 xf8 0 x80 void dl 6 uint i 15 for i 0 i 600 i void key uchar key1 P1 0 xff key1 P1 if key1 0 xff dl 6 P1 0 xff key1 P1 if key1 0 xff key1 P1 switch key1 case 0 xff key2 8 break case 0 xfe key2 0 break case 0 xfd key2 1 break case 0 xfb key2 2 break case 0 xf7 key2 3 break case 0 xef key2 4 break case 0 xdf key2 5 break case 0 xbf key2 6 break case 0 x7f key2 7 break default break void main key2 8 while 1 key P3 dirtab key2 例 6 7 4 4 矩阵键盘示例 16 include define uchar unsigned char define uint unsigned int uchar data dir buf code uchar dirtab 0 x3f 0 x06 0 x5b 0 x4f 0 x66 0 x6d 0 x7d 0 x07 0 x7f 0 x6f 0 x77 0 x7c 0 x39 0 x5e 0 x79 0 x71 0 x40 code uchar keytab 0 xee 0 xed 0 xeb 0 xe7 0 xde 0 xdd 0 xdb 0 xd7 0 xbe 0 xbd 0 xbb 0 xb7 0 x7e 0 x7d 0 x7b 0 x77 void delay void void keyscan void dir uchar key void main void dir buf 16 while 1 keyscan dir void dir P2 dirtab dir buf void delay void uchar i for i 0 i 200 i void keyscan uchar code h code l i1 i2 P1 0 xf0 所有的行输出 0 code l P1 读列值 17 code l code l 屏蔽掉高 4 位 if code l 0 xf0 delay P1 0 xf0 code l P1 code l code l if code l 0 xf0 code h 0 xfe for i1 0 i1 4 i1 kk P1 code h code l P1 code l code l if code l 0 xf0 code h code h 1 0 x01 goto kk goto ll for ll code h code h key code h code l for i2 0 i2 16 i2 if key keytab i2 dir buf i2 例 6 10 一个 8 8 共阴极 LED 点阵显示 ILOVEYOU 不用记 一个 8 8 在某一个时刻只能显示一个字符 要想显示字符串 必须在显示完一 个字符后接着显示下一个字符 因此需要建立一个字符串库 由于每个字符有 8 个段码值 该字符串有 8 个字符 所以该字符串库中有 8 8 共 64 个段码值 字符串 ILOVEYOU 的字模段码值 I 00H 00H 42H 7EH 42H 42H 00H 00H L 00H 42H 7EH 42H 02H 02H 02H 00H O 00H 3CH 22H 42H 42H 22H 3CH 00H V 00H 40H 70H 0CH 0CH 70H 40H 00H E 00H 42H 7EH 4AH 4AH 5AH 22H 00H Y 00H 40H 62H 1EH 12H 60H 40H 00H O 00H 3CH 22H 42H 42H 22H 3CH 00H U 00H 7CH 46H 02H 02H 7CH 40H 00H 18 include define uint unsigned int define uchar unsigned char code uchar tab1 0 x00 0 x00 0 x42 0 x7e 0 x42 0 x42 0 x00 0 x00 I 0 x00 0 x42 0 x7e 0 x42 0 x02 0 x02 0 x02 0 x00 L 0 x00 0 x3c 0 x22 0 x42 0 x42 0 x22 0 x3c 0 x00 0 x00 0 x40 0 x70 0 x0c 0 x0c 0 x70 0 x40 0 x00 x00 0 x42 0 x7e 0 x4a 0 x4a 0 x5a 0 x22 0 x00 0 x00 0 x40 0 x62 0 x1e 0 x12 0 x60 0 x40 0 x00 0 x00 0 x3c 0 x22 0 x42 0 x42 0 x22 0 x3c 0 x00 0 x00 0 x7c 0 x46 0 x02 0 x02 0 x7c 0 x40 0 x00 U code uchar tab2 0 x00 0 x01 0 x02 0 x03 0 x04 0 x05 0 x06 0 x07 data uchar j void delay uint n data uint i for i 0 i n i void dir data uchar h v 0 for h j h j 8 h P0 tab1 h P3 tab2 v delay 555 P3 0 xff v if v 8 v 0 void dl 19 uint r for r 0 r 40 r dir void main void while 1 j 0 dir dl j 8 dir dl j 16 dir dl j 24 dir dl j 32 dir dl j 40 dir dl j 48 dir j 56 dir dl 例 6 12 编程在 LCD1602 上显示由键盘输入的字符或数字 不用记 20 S51 1602 晶振为 12M include reg51 h include intrins h include absacc h sbit RS P3 5 sbit RW P3 6 sbit E P3 7 define busy 0 x80 define uchar unsigned char define uint unsigned int uchar a 0 1 2 3 4 5 6 7 8 9 a b c d e f void delay LCM uchar k 延时函数 uint i j for i 0 i k i for j 0 j 60 j void test 1602busy 测忙函数 P1 0 xff E 1 RS 0 RW 1 nop nop 21 while P1 nop E 1 nop E 0 void write 1602Command uchar co 写命令函数 test 1602busy 检测 LCD 是否忙 RS 0 RW 0 E 0 nop P1 co nop E 1 LCD 的使能端 高电平有效 nop E 0 void write 1602Data uchar Data 写数据函数 test 1602busy P1 Data RS 1 RW 0 E 1 nop E 0 void init 1602 void 初始化函数 write 1602Command 0 x38 LCD 功能设定 DL 1 8 位 N 1 2 行显示 delay LCM 5 write 1602Command 0 x01 清除 LCD 的屏幕 delay LCM 5 write 1602Command 0 x06 LCD 模式设定 I D 1 计数地址加 1 delay LCM 5 write 1602Command 0 x0F 显示屏幕 delay LCM 5 void DisplayOneChar uchar X uchar Y uchar DData 22 Y X if Y X 0 x40 若 y 为 1 显示第二行 地址码 0X40 X 0 x80 指令码为地址码 0X80 write 1602Command X write 1602Data DData void display 1602 uchar DData X Y 显示函数 uchar ListLength 0 Y X while X 16 DisplayOneChar X Y DData ListLength ListLength X void delay uint i 延时程序 uint j for j 0 j i j uchar checkkey 检测有没有键按下 uchar i uchar j j 0 x0f P2 j i P2 i i if i 0 x0f return 0 else return 0 xff uchar keyscan 键盘扫描程序 uchar scancode uchar codevalue uchar a uchar m 0 uchar k uchar i j if checkkey 0 return 0 xff else 23 delay 100 if checkkey 0 return 0 xff else scancode 0 xf7 m 0 x00 键盘行扫描初值 M 为列数 for i 1 i 4 i k 0 x10 P2 scancode a P2 for j 0 j 4 j J 为行数 if a while checkkey 0 return codevalue else k k 1 scancode scancode void main 主函数 uchar s uchar z uchar i 0 j 0 i 为 LCD 的行 j 为 LCD 的列 delay LCM 15 init 1602 1602 初始化 s WELCOME TO HERE display 1602 s 0 0 第一行显示 WELCOM TO HERE delay LCM 200 delay LCM 200 delay LCM 200 while 1 if checkkey 0 x00 continue else 24 i 1 LCD 在第二行显示 z keyscan if j 16 j 0 i 1 break else DisplayOneChar j i a z j delay 100 第七章 例 7 4 采用 DAC0832 实现的波形发生器 include include define uchar unsigned char define DAC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教学资料-感恩老师主题班会-完整版课件
- 苏教版小学一年级语文下册第9单元第24课《冬日》教案
- EPS系统安装施工工艺及施工方法
- 针织企业安全管理员日常检查安全操作规程
- 关于肠道传染病培训试题及答案
- 校园数据备份与恢复管理细则
- 设备故障抢修应急预案
- 养老院老人跌倒应急预案演练脚本
- 品牌新闻发布会策划方案
- 产品出厂检验管理规范
- 2026江苏连云港市金融控股集团有限公司招聘17人笔试备考题库及答案详解
- 2026四川雅安市雨城区考试招募医疗卫生辅助岗位人员13人笔试模拟试题及答案详解
- 2026-2030中国戏曲音乐文化行业运行态势及前景动态预测报告
- 2026公司安全生产管理制度及文件汇编(2026版)
- 农产品质量安全检测机构考核评审员考试题及答案
- 初中数学尺规作图全解|五种基本作图与综合应用
- 2026年湖南省中考英语真题含答案
- GB 47501-2026旋转电机安全技术规范
- 2026年市场监督管理局招聘考试笔试试题及答案解析
- 急性缺血性卒中再灌注治疗质量改进建议2026
- 施工现场高空作业专项施工方案
评论
0/150
提交评论