C51单片机

这篇博客详细介绍了如何使用C51单片机进行LED控制,从工程建立开始,逐步讲解了LED点亮、闪烁,以及单个和多个LED的循环移位操作,适合初学者入门实践。

一、工程建立

  1. 建立工程 // new project -> 保存(弹窗否)并选择cpu为atm89c51(弹窗否)
  2. 创建新文本 //(FILE下方空白图标-> 保存并命名为main.c)
  3. 将c文件添加到工程 //(右击souce文件夹 -> add file to…)
  4. 生成hex文件 //(第三行魔法棒 -> output -> 勾选creat hex)
  5. 设置晶振频率 //(第三行魔法棒 -> target -> 修改为12Mhz)

二、LED

<1-1>、LED点亮

#include "reg52.h"    //调用52单片机头文件

sbit led1=P2^0;       //位定义led1为P2.0端口

void main()
{
    while(1)
    {
        led1=0;       //循环令led1电平为0(点亮led)
    }
}

<1-2>、LED闪烁

#include "reg52.h"    //包含52单片机头文件

typedef unsigned int u16;    //重定义数据类型 0~65535
typedef unsigned char u8;    //0~255

sbit led1=P2^0;       //位定义led1为P2.0端口

u16 i;

/********定时器0初始化函数*******/
void Timer0Init()
{
    TMOD|=0X01;        //定时器工作方式寄存器TMOD赋值(确定T0,T1工作方式)
    TH0=0XFC;TL0=0X18; //设初值(1ms)
    ET0=1;             //选择中断方式T0
    EA=1;              //打开总中断
    TR0=1;             //启动定时
}

/*********主函数********/
void main()
{
    Timer0Init();
    while(1)
    {
        if(i==1000)          //定时达到1s时
        {
            i=0;

            led1=~led1;        //将led1电平置反
        }             
    }
}

/************定时器0中断函数**************/
void Timer0() interrupt 1
{
    TH0=0XFC;TL0=0X18;      //重新装入初值
    i++;    
}

<1-3>、一个LED循环移位

#include <reg52.h>    //调用52单片机头文件

typedef unsigned int u16;    //重定义数据类型 0~65535
typedef unsigned char u8;    //0~255

u16 i,n;                    //设置循环变量

/********定时器0初始化函数*******/
void Timer0Init()
{
    TMOD|=0X01;        //定时器工作方式寄存器TMOD赋值(确定T0,T1工作方式)
    TH0=0XFC;TL0=0X18; //设初值(1ms)
    ET0=1;             //选择中断方式T0
    EA=1;              //打开总中断
    TR0=1;             //启动定时
}

/*********主函数********/
void main()
{
    Timer0Init();
    while(1)
    {
        if(i==1000)          //定时达到1s时
        {
            i=0;

            P2=~(0x01<<n);   //将0000 0111左移n位后取反
            if(++n==8)
                n=0;         //n为8时瞬间重新置0
        }             
    }
}

/************定时器0中断函数**************/
void Timer0() interrupt 1
{
    TH0=0XFC;TL0=0X18;      //重新装入初值
    i++;    
}

<1-4>、三个LED循环移位

#include <reg52.h>    //调用52单片机头文件

typedef unsigned int u16;    //重定义数据类型 0~65535
typedef unsigned char u8;    //0~255

u16 i,n;                    //设置循环变量

/********定时器0初始化函数*******/
void Timer0Init()
{
    TMOD|=0X01;        //定时器工作方式寄存器TMOD赋值(确定T0,T1工作方式)
    TH0=0XFC;TL0=0X18; //设初值(1ms)
    ET0=1;             //选择中断方式T0
    EA=1;              //打开总中断
    TR0=1;             //启动定时
}

/*********主函数********/
void main()
{
    Timer0Init();
    while(1)
    {
        if(i==1000)  //定时达到1s时
        {
            i=0;

            if(n<6)
                P2=~(0x07<<n); //将0000 0111左移n位后取反
            if(n==6)
                P2=~0xc1;
            if(n==7)
                P2=~0x83;
            if(++n==8)        
                n=0;    //n为8时瞬间重新置0                 
        }             
    }
}

/************定时器0中断函数**************/
void Timer0() interrupt 1
{
    TH0=0XFC;TL0=0X18;      //重新装入初值
    i++;    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值