登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 串口通信

[复制链接]
发表于 2019-2-14 00:08:13 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 串口通信
开始时间: 2019-02-11
结束时间: 2019-02-13
串口通信可以实现电脑控制单片机,这一点是让人很激动的
学了之后发现很简单,只需要配置好UART就行了
作业的控制流水灯和蜂鸣器也只是该怎么写就怎么写,只是在T1中断里面加一个控制程序
下面这个是控制流水灯程序,就是在T1中加了一个接收一次数据就改变一次LED小灯是否能亮的程序
其他的和普通流水灯程序一样
#include <reg52.h>

sbit ENLED = P1^1;
unsigned char code LedChar[] = {  
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[7] = {  
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
unsigned char T0RH = 0;  
unsigned char T0RL = 0;
unsigned char RxdByte = 0;  
unsigned char flag200ms = 0;
unsigned char flagLight = 1;
void ConfigTimer0(unsigned int ms);
void ConfigUART(unsigned int baud);
void FlowingLight();
void main()
{
    EA = 1;      
    ENLED = 0;   
    ConfigTimer0(1);  
    ConfigUART(9600);  
   
    while (1)
    {
        if (flagLight == 0)
        {
            LedBuff[6] = 0xFF;  
        }
        else
        {
            if (flag200ms != 0)   
            {
                flag200ms = 0;
                FlowingLight();
            }
        }
        LedBuff[0] = LedChar[RxdByte & 0x0F];
        LedBuff[1] = LedChar[RxdByte >> 4];
    }
}
void FlowingLight()
{
    static unsigned char dir = 0;   
    static unsigned char shift = 0x01;   
    LedBuff[6] = ~shift;     
    if (dir == 0)           
    {
        shift = shift << 1;   
        if (shift == 0x80)   
        {
            dir = 1;
        }
    }
    else                     
    {
        shift = shift >> 1;   
        if (shift == 0x01)   
        {
            dir = 0;
        }
    }
}
void ConfigTimer0(unsigned int ms)
{
    unsigned long tmp;  
   
    tmp = 33177600 / 12;     
    tmp = (tmp * ms) / 1000;
    tmp = 65536 - tmp;        
    tmp = tmp + 13;           
    T0RH = (unsigned char)(tmp>>8);   
    T0RL = (unsigned char)tmp;
    TMOD &= 0xF0;  
    TMOD |= 0x01;  
    TH0 = T0RH;     
    TL0 = T0RL;
    ET0 = 1;     
    TR0 = 1;   

void ConfigUART(unsigned int baud)
{
    SCON  = 0x50;  
    TMOD &= 0x0F;   
    TMOD |= 0x20;   
    TH1 = 256 - (33177600/12/32)/baud;  
    TL1 = TH1;   
    ET1 = 0;      
    ES  = 1;     
    TR1 = 1;      
}

void LedScan()
{
    static unsigned char i = 0;   
   
    P0 = 0xFF;
if(i == 6)
{
  P2 = (P2 & 0xF8) | 6;
}
else
{
  P2 = (P2 & 0xF8) | (5-i);
}
P0 = LedBuff;
  if (i < 6)
{
    i++;
}
  else
{
    i = 0;
}
}
void InterruptTimer0() interrupt 1
{
    static unsigned char tmr200ms = 0;
   
    TH0 = T0RH;   
    TL0 = T0RL;
    LedScan();   
    tmr200ms++;
    if (tmr200ms >= 200)
    {
        tmr200ms = 0;
        flag200ms = 1;
    }
}
void InterruptUART() interrupt 4
{
    if (RI)  
    {
        RI = 0;  
        RxdByte = SBUF;
        SBUF = RxdByte;   
        flagLight = !flagLight;  
    }
    if (TI)   
    {
        TI = 0;
    }
}

好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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