20141109 【 单片机——串口通讯——中断 】 八段数码管显示通信内容
2014-11-09 19:16
309 查看
根据串口通讯规则,
还有自己编写的 八段数码管 显示规则编写的程序。
主要是:
1.串口通讯·输入:执行中断,模拟缓冲区保存输入的数据(最多16Byte)。
2.串口通讯·输出:保存数据的同时,通过SBUF输出到屏幕。
3.数据处理:把读入模拟缓冲区的数据输出到8个八段数码管中(循环覆盖)。
就这样,没什么特别的。
其实本来想输出到 液晶屏1602 中的,
可惜我买的 液晶屏1602 自带单片机处理程序(用来和Arduino通信的,没有和单片机通信的接口)。
还有自己编写的 八段数码管 显示规则编写的程序。
主要是:
1.串口通讯·输入:执行中断,模拟缓冲区保存输入的数据(最多16Byte)。
2.串口通讯·输出:保存数据的同时,通过SBUF输出到屏幕。
3.数据处理:把读入模拟缓冲区的数据输出到8个八段数码管中(循环覆盖)。
就这样,没什么特别的。
其实本来想输出到 液晶屏1602 中的,
可惜我买的 液晶屏1602 自带单片机处理程序(用来和Arduino通信的,没有和单片机通信的接口)。
#include <reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char #define DIGIT_MAX 16 #define LCD P0 #define LCD_BIN P2 const uchar digital[DIGIT_MAX+5] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x80}; // 0123456789 AbCdEF. + 17 const uchar digital_bin[8] = {0xE3, 0xE7, 0xEB, 0xEF, 0xF3, 0xF7, 0xFB, 0xFF}; //{0x00, 0x04, 0x08, 0x0C, 0x10, 0x14, 0x18, 0x1C}; const uint TIME_H = 0xF3; // 4800bps const uint TIME_L = 0xF3; uint TIME; void u_init(){ SCON = 0x50; //0移位寄存器,1可变异步收发器8+2,2固定9+2,3可变9+2 [4]0允许串行接收 TMOD = 0x20; //计数器工作方式2 PCON = 0x80; //波特率加倍 TH1 = 0xF3; //4800bps * 2 TL1 = 0xF3; ES = 1; //打开 接受中断 EA = 1; //打开 总中断 TR1 = 1; //打开 计数器 } uchar LCD_dat[8], no=7; uchar buffer[16], now; uchar to_digital(uchar x){ if( '0'<=x && x<='9' ) return digital[x-'0']; switch( x ){ case 'a': case 'A': return 0x77; case 'b': case 'B': return 0x7C; case 'c': return 0x58; case 'C': return 0x39; case 'd': case 'D': return 0x5E; case 'e': case 'E': return 0x79; case 'f': case 'F': return 0x71; case 'h': return 0x74; case 'H': return 0x76; case 'p': case 'P': return 0x73; case 'o': case 'O': return 0x5C; case 'l': return 0x30; case 'L': return 0x38; case 'j': return 0x0D; case 'J': return 0x0F; case 'n': return 0x54; case '-': return 0x40; case '.': return 0x80; default: return 0x49;// '三' } } void main(){ uint i, cnt; u_init(); while( 1 ){ for(i=0; i<now; i++){ LCD_dat[no] = to_digital( buffer[i] ); no = (no+0x07)&0x07; } now = 0; for(i=0; i<8; i++){ LCD_BIN = digital_bin[i]; for(cnt=10; cnt; cnt--) if( i==no ) LCD = LCD = LCD_dat[i] | 0x80; else LCD = LCD_dat[i]; LCD = 0x00; } } } void u_int1() interrupt 4{ buffer[now] = SBUF; //接收数据 RI = 0; //手动清除中断标志 SBUF = buffer[now]; //发送数据 now = (++now)&0x0F; //下一个 保存位置 while( !TI ); //发送完毕 TI = 0; //发送标志复位 //数据处理 } /* 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, // 0123456789 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x08, // AbCdEF. 0x58, 0x3D, 0x76, 0x74, 0x0F, 0x0D, 0x38, 0x30, 0x54, 0x40, // cGHhJjLln- 0x5C, 0x73, 0x64, 0x48, 0x49, // oPS?? */
相关文章推荐
- 20141108 【 单片机——万年历DS1302——中断 】 用DS1302模块 & 数码管显示万年历
- 学习笔记 从零开始学单片机(2) 全八段数码管显示
- 使用单片机的定时器0和中断实现9到0的倒计时功能,并用数码管显示
- 凌阳61单片机使用7段数码管显示数字时钟的程序
- 单片机C51串口中断接收和发送测试例程(含通信协议的实现)
- 整理2010年51单片机程序--4*4按键与数码管显示
- 数码管流动显示(自己的单片机)
- 数码管流动显示(自己的单片机)
- 单片机C51串口中断接收和发送测试例程(含通信协议的实现)
- 单片机数码管0000-9999显示问题
- 定时器控制数码管动态显示(单片机)
- 单片机控制流水灯 数码管显示时间 蜂鸣器报警
- 关于单片机和PC通信显示中文的乱码问题。
- 单片机C51串口中断接收和发送测试例程(含通信协议的实现)——龚建伟
- 谁帮忙编写 一个 四位数码管显示分钟和秒钟的单片机c语言吧
- lesson3 数码管静态显示及定时器和中断应用
- 关于89S51单片机数码管显示的小工具
- 单片机数码管动态显示—C语言版
- 基于tx-1c 51单片机中断使用及数码管显示的使用方法
- 使用中断INT0和INT1来实现数码管显示以及清零