【51单片机】代码实例
LED灯—依次点亮#include<reg51.h>#include<math.h>void delay(unsigned int n){int i;for(i=0;i<n;i++);}void LED_left_to_right()//从左到右依次点亮{unsigned int ADDR;unsigned i =1;unsign...
·
LED灯
—LED灯闪烁
#include<reg51.h>
#include<math.h>
sbit LED=P2^0;
void delay(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++);
}
void main()
{ LED=0;
while(1)
{
LED=~LED;
delay(20000);
}
}
—流水灯
#include<reg51.h>
#include<math.h>
void delay(unsigned int n)
{
int i;
for(i=0;i<n;i++);
}
void LED_flow_ltor()
{
unsigned char cnt=0;
unsigned char i=0;
unsigned int ADDR;
while(1)
{
ADDR=~(0x01<<cnt);
P2=ADDR;
delay(20000);
cnt++;
if(cnt==8)
while(1)
{
P2=ADDR/pow(2,i);
delay(20000);
i++;
if(i==8)
{
i=0;
cnt=0;
break;
}
}
}
}
void main()
{
LED_flow_ltor();
}
—依次点亮
#include<reg51.h>
#include<math.h>
void delay(unsigned int n)
{
int i;
for(i=0;i<n;i++);
}
void LED_left_to_right()//从左到右依次点亮
{
unsigned int ADDR;
unsigned char i =1;
ADDR=0x01;
delay(30000);
while(1)
{
P2=~ADDR;
if(i==8)break;
delay(30000);
ADDR+=pow(2,i);
i++;
}
}
void LED_right_to_left()//从右到左依次点亮
{
unsigned int ADDR;
unsigned char i =6;
ADDR=0x80;
delay(20000);
while(1)
{
P2=~ADDR;
if(i==-1)break;
delay(30000);
ADDR+=pow(2,i);
i--;
}
}
void main()
{ while(1){
LED_left_to_right();
LED_right_to_left();
}
}
数码管
—灯管选位
灯管选位 LSA LSB LSC
---------------------
右1 0 0 0
右2 1 0 0
右3 0 1 0
右4 1 1 0
右5 0 0 1
右6 1 0 1
右7 0 1 1
右8 1 1 1
—从左至右显示0-7
#include <reg51.h> //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
void delay(u16 i)
{
while(i--);
}
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=1;LSB=1;LSC=1; break;//显示第0位
case(1):
LSA=0;LSB=1;LSC=1; break;//显示第1位
case(2):
LSA=1;LSB=0;LSC=1; break;//显示第2位
case(3):
LSA=0;LSB=0;LSC=1; break;//显示第3位
case(4):
LSA=1;LSB=1;LSC=0; break;//显示第4位
case(5):
LSA=0;LSB=1;LSC=0; break;//显示第5位
case(6):
LSA=1;LSB=0;LSC=0; break;//显示第6位
case(7):
LSA=0;LSB=0;LSC=0; break;//显示第7位
}
P0=smgduan[i];
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
void main()
{
while(1)
{
DigDisplay(); //数码管显示函数
}
}
—流水显示相同数字
#include<reg51.h>
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char led[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void main()
{
unsigned char cnt=0;
unsigned char i=0;
TMOD=0x01;
TH0=0xBB;
TL0=0xB8;
TR0=1;
while(1)
{
if(TF0==1)
{
TF0=0;
TH0=0xB8;
TL0=0x00;
cnt++;
if(cnt>=25)
{
cnt=0;
switch(i)
{
case 1:LSA=0;LSB=0;LSC=0;break;
case 2:LSA=1;LSB=0;LSC=0;break;
case 3:LSA=0;LSB=1;LSC=0;break;
case 4:LSA=1;LSB=1;LSC=0;break;
case 5:LSA=0;LSB=0;LSC=1;break;
case 6:LSA=1;LSB=0;LSC=1;break;
case 7:LSA=0;LSB=1;LSC=1;break;
case 8:LSA=1;LSB=1;LSC=1;break;
}
P0=led[9];
i++;
if(i==9)i=1;
}
}
}
}
—流水显示不同数字
#include<reg51.h>
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char led[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void main()
{
unsigned char cnt=0;
unsigned char i=0;
unsigned char sum=0;
TMOD=0x01;
TH0=0xBB;
TL0=0xB8;
TR0=1;
while(1)
{
if(TF0==1)
{
TF0=0;
TH0=0xB8;
TL0=0x00;
cnt++;
if(cnt>=50)
{
cnt=0;
switch(i)
{
case 1:LSA=0;LSB=0;LSC=0;break;
case 2:LSA=1;LSB=0;LSC=0;break;
case 3:LSA=0;LSB=1;LSC=0;break;
case 4:LSA=1;LSB=1;LSC=0;break;
case 5:LSA=0;LSB=0;LSC=1;break;
case 6:LSA=1;LSB=0;LSC=1;break;
case 7:LSA=0;LSB=1;LSC=1;break;
case 8:LSA=1;LSB=1;LSC=1;break;
}
P0=led[sum];
i++;
if(i==9)i=1,sum++;
if(sum==16)sum=0;
}
}
}
}
—99999999~0秒计时
#include<reg51.h>
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char led[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char ledbuff[8]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
void main()
{
unsigned char i=0;
unsigned int cnt=0;
unsigned long sec=99999999;
TMOD=0x01;
TH0=0xFC;
TL0=0x67;
TR0=1;
while(1)
{
if(TF0==1)
{
TF0=0;
TH0=0xFC;
TL0=0x67;
cnt++;
if(cnt>=1000){
cnt=0;
sec--;
ledbuff[0]=led[sec%10];
ledbuff[1]=led[sec/10%10];
ledbuff[2]=led[sec/100%10];
ledbuff[3]=led[sec/1000%10];
ledbuff[4]=led[sec/10000%10];
ledbuff[5]=led[sec/100000%10];
ledbuff[6]=led[sec/1000000%10];
ledbuff[7]=led[sec/10000000%10];}
P2=0xFF;//消隐
switch(i)
{
case 0:LSA=0;LSB=0;LSC=0;i++;P0=ledbuff[0];break;
case 1:LSA=1;LSB=0;LSC=0;i++;P0=ledbuff[1];break;
case 2:LSA=0;LSB=1;LSC=0;i++;P0=ledbuff[2];break;
case 3:LSA=1;LSB=1;LSC=0;i++;P0=ledbuff[3];break;
case 4:LSA=0;LSB=0;LSC=1;i++;P0=ledbuff[4];break;
case 5:LSA=1;LSB=0;LSC=1;i++;P0=ledbuff[5];break;
case 6:LSA=0;LSB=1;LSC=1;i++;P0=ledbuff[6];break;
case 7:LSA=1;LSB=1;LSC=1;i=0;P0=ledbuff[7];break;
default:break;
}
}
}
}
—0~9999秒计时
#include<reg51.h>
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char led[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char ledbuff[4]={0xFF,0xFF,0xFF,0xFF};
void main()
{
unsigned char i=0;
unsigned int cnt=0;
unsigned long sec=0;
TMOD=0x01;
TH0=0xFC;
TL0=0x67;
TR0=1;
while(1)
{
if(TF0==1)
{
TF0=0;
TH0=0xFC;
TL0=0x67;
cnt++;
if(cnt>=1000){
cnt=0;
sec++;
ledbuff[0]=led[sec%10];
ledbuff[1]=led[sec/10%10];
ledbuff[2]=led[sec/100%10];
ledbuff[3]=led[sec/1000%10];}
P2=0xFF;//消隐
switch(i)
{
case 0:LSA=0;LSB=0;LSC=0;i++;P0=ledbuff[0];break;
case 1:LSA=1;LSB=0;LSC=0;i++;P0=ledbuff[1];break;
case 2:LSA=0;LSB=1;LSC=0;i++;P0=ledbuff[2];break;
case 3:LSA=1;LSB=1;LSC=0;i=0;P0=ledbuff[3];break;
default:break;
}
}
}
}
蜂鸣器
—启动蜂鸣器
#include <reg51.h>
sbit beep=P1^5;
void delay(unsigned char i)
{
while(i--);
}
void main()
{
while(1){
beep=~beep;
delay(100);//调节蜂鸣器音色
}
}
独立按键
—控制LED灯的开关
#include <reg51.h> //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
# K1=P3^1;
# K2=P3^0;
# K3=P3^2;
# K4=P3^3
sbit k1=P3^1; //定义P31口是k1
sbit led=P2^0; //定义P20口是led
void delay(u16 i)
{
while(i--);
}
void keypros()
{
if(k1==0) //检测按键K1是否按下
{
delay(1000); //消除抖动 一般大约10ms
if(k1==0) //再次判断按键是否按下
{
led=~led; //led状态取反
}
while(!k1); //检测按键是否松开
}
}
void main()
{
led=1;
while(1)
{
keypros(); //按键处理函数
}
}
步进电机
—启动步进电机
#include <reg51.h>
sbit moto=P1^0;
void delay(unsigned int i)
{
while(i--);
}
void main()
{
unsigned char i;
moto=0; //关闭电机
for(i=0;i<100;i++) //循环100次,也就是大约5S
{
moto=1; //开启电机
delay(5000); //大约延时50ms
}
moto=0; //关闭电机
}
/**************************************************************************************
实验现象:下载程序后,D1小灯循环点亮1秒,熄灭1秒。使用单片机内部定时器可以实现准确延时
接线说明: (具体接线图可见开发攻略对应实验的“实验现象”章节)
1,单片机-->LED&交通灯模块
P20-->D1
注意事项:
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
/*******************************************************************************
* 函 数 名 : Timer0Init
* 函数功能 : 定时器0初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0Init()
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
Timer0Init(); //定时器0初始化
P2=0xAA;
while(1);
}
/*******************************************************************************
* 函 数 名 : void Timer0() interrupt 1
* 函数功能 : 定时器0中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0() interrupt 1
{
static u16 i;
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
i++;
if(i==1000)
{
i=0;
P2=~P2;
}
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献3条内容
所有评论(0)