单片机基础一 2020/3/17

2020-03-17  本文已影响0人  LH大牛

1.最小单片机系统:晶振,电源,复位电路
2.点亮led灯:

#include<reg51.h>
sbit LED =P2^0;//声明引脚,P是大写
void main()
{
      LED=0;//引脚输出低电平
      while(1);//程序停止在这里
}

3.led流水灯左右移程序

#include<reg51.h>
#include<intrins.h>
#define led P2

void delay (int i)
{
    while(i--); 
}
int main()
{
    int count=0,i=0;
    while(1)
    {
        for(i=0;i<=16;i++)
        {
            if(i<=8)
            {
                led=(0xfe<<count);//11111110=fe
                delay(5000); 
                count++;
                if(count>=8)
                {
                    count=0;
                }
            }
            else
            {
                led=(0x7f>>count);//11101111=7f
                delay(5000);
                count++;
                if(count>=8)
                {
                    count=0;
                    i=0;
                }
            }
        }
    }
    return 0;
}

移位运算:右移左补0,左移右补0;
例如:1111 1110 ——左移1位:1111 1100
右移1为:0111 1111
3.定时器
Ⅰ.时钟周期:时钟周期是时序中的最小单位,时钟周期=1/时钟源频率(晶振频率)
Ⅱ.机器周期:机器周期是指完成一条指令的时间,机器周期=12x时钟周期
Ⅲ.定时器寄存器
定时器:T0,T1
TCON:定时器控制寄存器


tcon.PNG
tcon控制寄存器描述

注意:当只要能够有硬件置1或者清0的,单片机可自动完成; 只有软件清0的,只能用程序完成;
TMOD -定时器寄存器模式的位分配


TMOD -定时器寄存器模式的位分配
TMOD寄存器描述
TMOD寄存器描述
TMOD寄存器工作模式
TMOD寄存器工作模式
注意:TCON可以直接位寻址,TMOD不可以直接位寻址;
例子:TR1=1;允许操作
M1=1; 不允许操作
定时器模式1电路示意图
定时器模式1电路示意图

使用定时器步骤:
1.设置TMOD,配置好工作模式
2.设置计数寄存器 TH0和TL0初值;
3.设置TCON,通过TR0=1来让定时器计数;
4.判断TCON寄存器TF0位,检测定时器溢出情况;

定时器初值设置:(以晶振12M为例)
时钟周期=1/1200 0000;机器周期=12x时钟周期=12/120 0000=0.000001 s
定时20ms=0.02s
s(机器周期个数)x 机器周期 = 0.02s
s=0.02/0.000001 =20,000次
16位定时器的终值=2^16=65536
经过20000后,到达终值65536,那么初值65536-20000=45536;
45536的16进制为:B1E0;
所以高8位THn=0xB1,低8位:TLn=0xE0;

程序:使用定时器点亮流水灯

#include<reg51.h>
#define LED P2
int main()
{
        unsigned int count=0;
        unsigned int i=0;//必须写道定时器设置前面 DSQ.C(10): error C141: syntax error near 'unsigned'
        TMOD=0x01;  //1.设定计数器工作模式
        TH0=0xB1;   //2.给定初值
        TL0=0xE0;
        TR0=1;      //3.打开计时器
        
        while(1)
        {
            if(TF0==1)
            {
                TF0=0;
                TH0=0xB1;
                TL0=0xE0;
                i++;
            }
            if(i>=50) //定时1s
            {
                if(count<8)
                {
                    i=0;
                    LED=(0xfe<<count);
                    count++;
                }
                else
                {
                    count=0;
                }
            }
        }
        return 0;
}

4.数码管


数码管
#include<reg51.h>
#define nu P0

sbit LSA=P2^2;//不能直接赋值,赋值必须用sbit进行位限制
sbit LSB=P2^3;
sbit LSC=P2^4;
int ch[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//共阴极
void delay(int i)
{
    while(i--);
}

int main()
{
    int i=0;
    LSA=0;
    LSB=0;
    LSC=0;
    while(1)
    {   for(i=0;i<=16;i++)
        {
            nu=ch[i];
            delay(50000);
        }
        i=0;
    }
}



      







上一篇下一篇

猜你喜欢

热点阅读