找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4142|回复: 0
打印 上一主题 下一主题
收起左侧

单片机学习笔记(十四)串口实验

[复制链接]
跳转到指定楼层
楼主
ID:108531 发表于 2016-3-12 16:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
RS232串行通信是常见的通信方式之一,本版采用MAX232电平转换芯片使单片机的串口和计算机的串口相连进行通信。
C语言源程序:
/***************************************************************************
功能:首先LED显示串口接收的数据,然后将该数据发送给上位机
***************************************************************************/
#include <reg52.h> //52单片机头文件包含
#define uint unsigned  int  //定义uint 为 unsigned int 型
#define uchar unsigned char //定义uchar 为 unsigned char 型
sbit wei1=P2^0; //定义wei1 为 P2端口的0号引脚接数码管第一位
sbit wei2=P2^1; //定义wei2 为 P2端口的1号引脚接数码管第二位
uchar code table[]={0xC0,0xF9,0xA4,0xB0,
                        0x99,0x92,0x82,0xF8,
                        0x80,0x90,0x88,0x83,
                        0xC6,0xA1,0x86,0x8E}; //定义共阳数码管码表
uchar idata buffer[32]; //定义一个32个字节的缓冲区
uchar l_datatemp;  //定义l_datatemp用于存储新接收的数据
uchar l_data; //定义l_data用于存储显示的数据
void init (void); // 初始化函数声明
void send_char_com(uchar ch); //串口发送函数声明
void delay(uint z); //延时函数声明
void main() //入口函数
{
    uchar l_data1,l_data2; //定义临时变量l_data1,l_data2用于处理临时数据
    l_datatemp=0; //将l_datatemp赋值为0
    l_data=0; //将l_data赋值为0
    init(); //串口收发初始化
    while(1) //主循环
    {
        if(l_data!=l_datatemp) //如果接收的数据与原来显示的数据不同,更新原来显示的数据
        {
            l_data=l_datatemp; //更新原来的数据        
            send_char_com(l_data); //向串口发送更新后的数据
        }
          l_data1=l_data&0xf0;//取高四位显示
          l_data1=l_data1>>4;
           wei1=0;
           P0=table[l_data1];
           delay(5);
           wei1=1;
          l_data2=l_data&0x0f; //取低四位显示
           wei2=0;
           P0=table[l_data2];
           delay(5);
           wei2=1;
    }
}
void init(void) //串口初始化,波特率2400 方式1 8 UART
{
    TMOD=0x20;
    PCON=0x00;
    SCON=0x50;
    TH1=0xF3;
    TL1=0xF3;
    TR1=1; //启动定时器/计数器,还与GATE位状态有关
    ES=1; //允许串行中断
    EA=1; //总中断开
}
void send_char_com(uchar ch) //查询方式向串口发送一个字符
{
    SBUF=ch;
    while(TI==0);
    TI=0;
}
void receive(void) interrupt 4 using3 //中断方式从串口接收字符
{
    if(RI)
    {
        if(TI) //处理发送中断
        {
            TI=0;
        }
        RI=0;
        l_datatemp=SBUF;
    }
}
void delay(uint z) //延时
{
    uint x,y; //定义x,y用于循环计数
    for(x=z;x>0;x--) //主循环循环z次
        for(y=110;y>0;y--) //子循环循环110次
}
//实验现象用串口调试助手软件向单片机发送字符09则数码管将显示09

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表