51单片机基础知识-STC89C52
写一写学习51之后总结得基本知识吧,单片机多练习多体会才能有进步,要不啥也得不到;
//先写一下我定义的引脚和用到的函数,虽然没啥用
#include <REGX52.H>
#include<intrins.h>
//定义LED灯
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
sbit led5=P1^4;
sbit led6=P1^5;
sbit led7=P1^6;
sbit led8=P1^7;
// //定义数码管
sbit W1 = P1^0;
sbit W2 = P1^1;
sbit W3 = P1^2;
sbit W4 = P1^3;
//定义蜂鸣器
sbit FM=P0^7;
//定义按键
sbit K1=P3^3;
sbit K2=P3^4;
sbit K3=P3^5;
sbit K4=P3^6;
//定义软件延时函数
void delay(unsigned int x)
{
int a;
int b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
下面的话就是几个比较简单的程序,基本没有什么难度,记得把注释符号去掉
// 简单的点灯
// int main(void)
// {
// P1=0xfe;
// while(1)
// {
// P1=_cror_(P1,1);
// delay(100);
// }
// return 0;
// }
// 数码管静态显示521
//void main()
//{
//unsigned int a;
//W4=W1=W2=W3=0; //打开所有数码管
//while(1)
//{
//P0=0x92;
//delay(500);
//P0=0xa4;
//delay(500);
//P0=0xf9;
//delay(500);
//}
//}
//数码管静态显示 1-9
//unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//
//int main()
//{
//int a;
//
//W4=W1=W2=W3=0; //打开所有数码管
// while(1)
// {
// P0=table[a];
// delay(600);
// if(a<9)
// {
// a++;
// }
// else
// {
// a=0;
// }
// }
//return 0;
//}
//数码管动态显示5201314
// unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//
//int main()
//{
//
////W4=W1=W2=W3=0; //打开所有数码管
// while(1)
// {
// P0=table[5];
// W1=0;
// delay(80);
// W1=1;
//
// P0=table[2];
// W2=0;
// delay(80);
// W2=1;
//
// P0=table[0];
// W3=0;
// delay(80);
// W3=1;
//
// P0=table[1];
// W4=0;
// delay(800);
// W4=1;
//
// P0=table[0];
// W3=0;
// delay(80);
// W3=1;
//
// P0=table[2];
// W2=0;
// delay(80);
// W2=1;
// }
//return 0;
//}
//蜂鸣器
//int main()
//{
//
//while(1)
//{
//
// FM=0;
// delay(3000);
// FM=~FM;
// delay(3000);
//}
//return 0;
//}
//基本按键的使用
// int main()
// {
// while(1)
// {
//if(K1==0)
//{
//delay(10);
//if(K1==0)
//{
//led1=0;
//}
//}
//
// if(K2==0)
//{
//delay(10);
//if(K2==0)
//{
//led2=0;
//}
//}
//
//if(K3==0)
//{
//delay(10);
//if(K3==0)
//{
//led3=0;
//}
//}
//
//if(K4==0)
//{
//delay(10);
//if(K4==0)
//{
//led4=0;
//}
//}
// else
// {
// P1=0xff;
// }
// }
// }
中断 定时器 通信得话就比较重要了,得自习看看了
// 简单的中断
/*我用的这个单片机得K1按键可以触发中断*/
// int main()
// {
//
// EA=1; // 全局中断打开
// EX1=1; //外部中断1 打开
// IT1=0; //低电平触发
// P1=0xB7;
// while(1)
// {
// P1=_crol_(P1,1);
// delay(400);
// }
// return 0;
// }
//
// void zhonduan() interrupt 1 //中断函数
// {
// P1=0;
// }
然后写定时器。定时器的话应该有这么几个元素,用来初始化
【EA=1;打开总中断;
ET0=1;定时器0的中断打开;
TR0=1;定时器0的开关打开;
TMOD;工作反射光hi
TH0;高八位;
TL0;低八位;】
// 定时器的基本应用 1微妙的使用 实现led灯的简短闪烁
//void Timer_0Init(void) //1微秒@11.0592MHz
//{
// TMOD &= 0xF0; //设置定时器模式
// TMOD |= 0x01; //设置定时器模式
// TL0 = 0xF5; //设置定时初值
// TH0 = 0xFF; //设置定时初值
// TF0 = 0; //清除TF0标志
// TR0 = 1; //定时器0开始计时
// EA=1; // 打开总中断
// ET0=1; //定时器0中断打开
//}
//
//void timer() interrupt 1
//{
// TL0 = 0xF5; //设置定时初值
// TH0 = 0xFF; //设置定时初值
//led4=~led4;
//}
//int main()
//{
//led4=0;
//Timer_0Init();
//while(1);
//return 0;
//}
// LED以1000ms的时间闪烁 定时器的使用
// int i=0;
//void Timer0Init(void) //1毫秒
//{
// EA=1;
// ET0=1;
// TR0 = 1; //定时器0开始计时
// TMOD = 0x01; //设置定时器模式
// TL0 = 0xCD; //设置定时初值
// TH0 = 0xD4; //设置定时初值
//
//}
//
//
// void time()interrupt 1
// {
//
// TL0 = 0xCD; //设置定时初值
// TH0 = 0xD4; //设置定时初值
// i++;
// }
//
//
// int main()
// {
// P1=0xfe;
// Timer0Init();
// while(1)
// {
// if(i==10)
// {
// P1=_crol_(P1,1);
// i=0;
// }
// }
// }
然后就是串口通讯,这也是比较重要的,同样他也是包含很多元素的
【SCON 或 SMO SM1
TMOD
TH0
TL0
TR0
EA=1;
ES=1;
REN=1】
// 串口通信 接收发送数据
// void USART()
// {
// SCON=0x50;
// // SM0=0 ;SM1=1;
// // 串口的工作方式 上面的都是写法
// REN=1; //启动串口接收数据
// TMOD=0x20;
// PCON=0x00;
// TH1=0xfd;
// TL1=0xfd;
// ES=1;
// EA=1;
// TR1=1;
// }
//
// void main()
// {
//USART();
//while(1);
//}
//
//void uuu() interrupt 4
//{
//unsigned char date;
//
//date = SBUF; //取出接受的数据
// RI = 0; //清处接受中断标志位
// SBUF = date;
// while(!TI);
// TI=0; //清除发送中断位
// }
然后下面就是PWM
先写个软件延时,体会内涵
//最简单的PWM写法 软件延时
//sbit LED=P1^4; //LED
//
//void delay(unsigned int i)
//{
// while(i--);
// }
//
//void main()
//{
// while(1)
// {
// int i;
// for(i=10;i<=1000;i=i+5)
// {
// LED=0; //低电平点亮
// delay(i);
// LED=1; //高点平灭
// delay(1000);
// }
// for(i=1000;i>=10;i=i-20)
// {
// LED=0; //低电平点亮
// delay(i);
// LED=1; //高点平灭
// delay(1000);
// }
// }
//}
然后写一个以特定亮度运行的LED灯
//unsigned int time=0;
//unsigned int PWM=20;
// void Timer0Init(void) // 100微秒@11.0592MHz
//{
// TMOD = 0xF0; //设置定时器模式
// TL0 = 0xAE; //设置定时初值
// TH0 = 0xFB; //设置定时初值
// TF0 = 0; //清除TF0标志
// TR0 = 1; //定时器0开始计时
// ET0=1;
// EA=1;
//
//}
//
// void timer()interrupt 1
// {
// TL0 = 0xAE;
// TH0 = 0xFB;
// time++;
// }
//
//
//int main()
//{
// Timer0Init();
// while(1)
// {
// if(time>100)
// {
// time=0;
// }
// if(time<PWM)
// {
// led5=0;
// }
// if(time>=PWM)
// {
// led5=1;
// }
// }
// return 0;
// }
最后是必须会的呼吸灯
120毫秒更新占空比 2000微秒的周期 50%-95%的循环,每次增加5%亮度
unsigned int N=0;
unsigned int T=0;
unsigned int PWM_V=10;
bit BZW=0;
void Timer0Init(void) //100微秒@11.0592MHz
{
// AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x02; //设置定时器模式
TL0 = 0xA4; //设置定时初值
TH0 = 0xA4; //设置定时重载值
// TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA=1;
ET0=1;
}
int main()
{
Timer0Init();
while(1);
return 0;
LED=1;
}
void uuuu() interrupt 1
{
T++;
N++;
if(N==PWM_V)
{
LED=0;
}
if(N==20)
{
N=0;
LED=1;
}
if((T==12000)&&(BZW==00))
{
PWM_V++;
T=0;
if(PWM_V==19)
{
BZW=1;
}
}
if((T==12000)&&(BZW==1))
{
PWM_V--;
T=0;
if(PWM_V==10)
{
BZW=0;
}
}
}
然后是串口通信控制LED,为以后的2.4G 蓝牙做基础
unsigned char ui;
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
// AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
// AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
// ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA=1;
ES=1;
REN=1;
}
int main()
{
UartInit();
while(1)
{
if(ui=='1')
{
led5=0;
}
if(ui=='2')
{
led5=1;
}
}
return 0;
}
void uuu()interrupt 4
{
unsigned char date;
date = SBUF;
ui = SBUF;
RI=0;
SBUF=date;
while(!TI);
TI=0;
}
51单片机的话就这么多的基础知识了,多练习才会有进步

浙公网安备 33010602011771号