单片机
返回首页

串口通信-数据发送到PC加1后接收到单片机在数码管上显示

2015-04-29 来源:51hei

本程序的完整原理图下载: http://www.51hei.com/f/ks51.pdf 


/**
*功能:串口通信-数据发送到PC加一后接收到单片机在数码管上显示
*时间:2014年3月2日10:04:07
*作者:寒竹子
*备注:波特率:19200bps
*总结:串口通信时需要发送和接收数据时可以用到串口中断,在中断中进行数据的发送和接收,
*    数码管显示时必须要放在while (1)中,只有这样才可以正常显示数字!
**/

#include

typedef unsigned int uint;
typedef unsigned char uchar;

//数码管段选和位选声明
sbit WELA = P2^7;
sbit DULA = P2^6;

//数码管编码
uchar code table[] = {
0x3F,  //'0'
                0x06,  //'1'
                0x5B,  //'2'
                0x4F,  //'3'
                0x66,  //'4'
                0x6D,  //'5'
                0x7D,  //'6'
                0x07,  //'7'
                0x7F,  //'8'
                0x6F   //'9'
};
uint num = 254;

void UART_init();
void UART_init();
void display(uint num);

int main(void)
{
UART_init();
WELA = 1;
P0 = 0xFF;
WELA = 0;
DULA  = 1;
P0 =  0x00;
DULA = 0;

while (1)//等待串口发送和接收数据中断
{
//在数码管上显示
display(num);//数码管显示是动态显示的,所以必须要放在while (1)循环中,这样才可以动态显示!
P1 = num;
}

return 0;
}

//串口通信初始化(定时器T1初始化和串口通信方式的选择)
void UART_init()
{
//设定T1定时器工作方式2,八位自动重装,用于设定串口通信波特率
TMOD = 0x20;//T1: GATE C/!T 0 0 M1 M0:10 T0:0000
//设定波特率19200bps 初值 X = 2^8 - 11059200 / 19200 / 12 /32; X = 254.5 0xFE
TH1 = TL1 = 0xFE;
TR1 = 1;//打开定时器T1
SCON = 0x50;//设定串口通信方式1,八位异步传输波特率可设定
/*
SM0 = 0;
SM1 = 1;//方式1
REN = 1;//允许接收
*/
//因为要进行发送和接收,需要用到串口中断
EA = 1;//开总中断
ES = 1;//开定时器T1中断
}

//延时xms
void delayms(uint xms)
{
uint i, j;

for (i = 0; i < xms; i++)
for (j = 0; j < 110; j++);
}

//数码管显示
void display(uint num)
{
//将num分解
uchar bai, shi, ge;

bai = num / 100 % 10;
shi = num / 10 % 10;
ge  = num % 10;

//先段选后位选
DULA = 1;//打开段选锁存器
P0 = table[ge];//送入个位
DULA = 0;//关闭段选锁存器
P0 = 0xFF;//先关闭所有数码管的显示,避免乱码
WELA = 1;//打开位选锁存器
P0 = 0xDF;//1101 1111
WELA = 0;//关闭位选锁存器
//延时3毫秒
delayms(3);
P0 = 0x00;//消影

//十位
DULA  = 1;
P0 = table[shi];
DULA = 0;
P0 = 0xFF;
WELA = 1;
P0 = 0xEF; //1110 1111
WELA = 0;
delayms(3);
P0 = 0x00;

//百位
DULA = 1;
P0 = table[bai];
DULA = 0;
P0 = 0xFF;//关闭所有数码管,避免段选数据的影响
WELA = 1;
P0 = 0xF7; //1111 0111
WELA = 0;
delayms(3);
P0 = 0x00;//消影
}

//串口通信中断
void UART_sendAndReceive_int() interrupt 4//串口中断号4
{
//判断发送和接收的完成
if (TI)//硬件置位,发送数据完成
{
TI = 0;//TI清零,等待发送下一位数据
//允许接收数据
REN = 1;
}
//接收
if (RI)//接收完成
{
RI = 0;//RI清零,等待接收下一位数据
//取出SBUF中的数据
num = SBUF;
//num++
num++;
//禁止接收数据
REN = 0;
SBUF = num;//发送num
}
}

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • PIC单片机控制的遥控防盗报警器电路

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 如何构建一个触摸传感器电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章