8051/2 单片机基础 LED闪烁,蜂鸣器,数码管驱动,独立按键,中断,定时中断,串口通信

从软件转硬件路总是很艰难,各种电路知识,3个多月了,现在总算是入门了。

AT 8051/2
1.驱动LED闪烁
2.驱动蜂鸣器进行响动
3.驱动共阳级,单数码管,0—9 变化(MPX1-CA) - 使用8排阻 + NPN三极管 
4.驱动共阴级,但数码管,0-9 变化(MPX1-CC) - 使用芯片74HC245  + PNP三极管
5.独立按键,控制单片机,并点亮/熄灭LED
6.中断,控制点亮/熄灭LED - INT0 , INT1
7.定时中断,控制点亮/熄灭LED - T0 , T1
8.串口通信

电路图:

 

C代码:

/**
* 8051 DEMO 1
* 1.驱动LED闪烁
* 2.驱动蜂鸣器进行响动
* 3.驱动共阳级,单数码管,0—9 变化(MPX1-CA) - 使用8排阻 + NPN三极管 
* 4.驱动共阴级,但数码管,0-9 变化(MPX1-CC) - 使用芯片74HC245  + PNP三极管
* 5.独立按键,控制单片机,并点亮/熄灭LED
*
* 8051 规定中断号如下
* INT0  中断号  0
* INT1  中断号  2
* T0    中断号  1
* T1    中断号  3
* 串口  中断号   4
*
* 6.中断,控制点亮/熄灭LED - INT0 , INT1
* 7.定时中断,控制点亮/熄灭LED - T0 , T1
* 8.串口通信
*/

#include "REG52.H"
#include "intrins.h"

//数据类型定义
typedef unsigned char U8;

//段选,显示0~9的值,共阳极
U8 code yang[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//段选,显示0~9的值,共阴极
U8 code yin[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//使用P2^0 进行LED闪烁
sbit led = P2^0;
//使用P2^1 进行蜂鸣器报警
sbit buz = P2^1;
//使用P2^2 控制,P0共阳极数码管进行片选
sbit ls1 = P2^2;
//使用P2^3 控制,P1 共阴级数码管进行片选
sbit ls2 = P2^3;
//使用P2^4 捕获按键状态,控制 P2^5 的LED
sbit btn = P2^4;
sbit btn_led = P2^5;
//使用P2^6 捕获按键状态,进行中断控制 P2^5 的LED
sbit btn2 = P2^6;
//使用P2^7 接入LED实现,定时器1秒控制LED闪烁
sbit timer_led = P2^7;

//延迟1秒
void delay1s()   //误差 -0.000000000227us
{
    U8 a,b,c;
    for(c=13;c>0;c--)
        for(b=247;b>0;b--)
            for(a=142;a>0;a--);
    _nop_();  //if Keil,require use intrins.h
}
//延迟 10ms
void delay10ms()   //误差 -0.000000000002us
{
    U8 a,b;
    for(b=249;b>0;b--)
        for(a=17;a>0;a--);
}

//按键按下,点亮或者熄灭LED
void btn_click()
{
    if(btn==0){ //检查按键是否按下
        delay10ms();
        if(btn==0){ //再次检查是否按下
            btn_led = !btn_led;
        }
        while (!btn);
    }
}

/**
* INT0,INT1
* 中断方式,按键按下,点亮或者熄灭LED 
*/

//初始化按钮2的中断,使用P3^2 INT0 中断实现
void btn2_init()
{
    IT0 = 1; //下降沿 触发
    EX0 = 1; //打开INT0的中断允许
    EA = 1; //打开总中断
}

void btn2_start() interrupt 0
{
    delay10ms();
    if(btn2==0){
        btn_led = !btn_led;
    }
}

/**
* T0,T1
* 定时器中断,实现定时点亮或者熄灭LED
* 这里使用T0
*/
void timer_init()
{
    TMOD = 0X01;
    TH0 = (65536 - 10*1000) / 256;//(65536-X)为定时器初值,如定时10ms
    TL0 = (65536 - 10*1000) % 256;
    ET0 = 1; //打开定时器0 的中断
    EA = 1; //打开总中断
    TR0 = 1; //打开定时器0
}

void timer_start() interrupt 1
{
    TH0 = (65536 - 100*1000) / 256;//(65536-X)为定时器初值,如定时100ms
    TL0 = (65536 - 100*1000) % 256;
    timer_led = !timer_led;
}
/**
* 串口通信 
* RXD 和 TXD  
* 接线方法为,RXD - TXD , TXD - RXD
* IO口:P3^0 和 P3^1
*/
void uart_init()
{ 
   SCON = 0x50;
   TMOD = 0x20;
   //装在波特率 高8位和低8位,9600
   TH1 = 0xFD;
   TL1 = 0xFD;
   ES = 1; //打开接收中断
   TR1 = 1; //打开总中断
   EA = 1; //打开总中断
}

//收串口数据
U8 uart_get()
{
   U8 rx_data = 0;
   while(0==RI); //0 串口没有数据
   //如果是1
   rx_data = SBUF;
   RI=0;
   return rx_data;
}

//发送一个字符
void uart_char(char data1)
{
   SBUF = data1; //将待发送的字符串放入缓冲器
   while(TI==0); //等待完发送
   TI=0;       // 发送中断标志 清0
}

//发送字符串
void uart_string(U8 *buffer)
{
   U8 *plter = buffer;
   while((*plter)!=0x00){
      uart_char(*plter);
      plter++;
   }
}

void uart_start() interrupt 4
{
      U8 rx_data = 0;
      rx_data = uart_get();
      uart_string("recv data : ");
      uart_char(rx_data);
      uart_string("\r\n");
}

//主函数执行
void main()
{
    U8 i;

    i = 0;
    led = 0;
    buz = 0;
    ls1 = 1; //选用NPN型3级管,单片机给高电平导通
    ls2 = 0; //选用PNP型3级管,单片机给低电平导通

    btn_led = 1;//默认是关的
    timer_led  = 1; //默认不点亮
   
    //开启中断监听
    btn2_init();
    //开启定时器监听
    timer_init();

    //初始化串口
    uart_init();
    
    while (1)
    {
        buz=!buz;
        led=!led;
        
        //独立按键检查
        btn_click();

        //> 9 重置为0
        if(i>9){
           i=0; 
        }
        //进行片选
        P0 = yang[i];
        P1 = yin[i];

        //延迟1秒
        delay1s();
        i = i+1;

        //消隐 共阳数码管
        P0 = 0xFF;
        //消隐 共阴数码管
        P1 = 0x00;
    }

}

 

感谢您的支持,写的文章如对您有所帮助,开源不易,请您打赏,谢谢啦~

 

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值