51开发板的程序——自用精简版——持续更新
目录
程序11——用矩阵按键控制数码管
程序12——点阵LED循环点亮——74HC595 串口转并口通讯
程序13——用动态数码管显示字符或者图像
程序14——用独立按键控制直流电动机转动
程序15——用外部中断控制LED的亮灭
程序17——用定时器中断控制LED亮灭
文章是用51开发板来实现各种例程,相比于教程本代码有详细注释,而且编程思路容易理解
程序11——用矩阵按键控制数码管
#include "reg52.h"
#include
#define led P0 //p2口为led
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;sbit R1=P1^7;
sbit R2=P1^6;
sbit R3=P1^5;
sbit R4=P1^4;
sbit L1=P1^3;
sbit L2=P1^2;
sbit L3=P1^1;
sbit L4=P1^0;void delay(u16 i) //延迟函数
{while(i--);
}u8 smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
u16 word;
void keybord() //确定按的什么键
{R1=0;R2=1;R3=1;R4=1;if(L1==0) {word=smgduan[1];} else if(L2==0){word=smgduan[2];}else if(L3==0){word=smgduan[3];}else if(L4==0){word=smgduan[4];}R1=1;R2=0;R3=1;R4=1;if(L1==0) {word=smgduan[5];} else if(L2==0){word=smgduan[6];}else if(L3==0){word=smgduan[7];}else if(L4==0){word=smgduan[8];}R1=1;R2=1;R3=0;R4=1;if(L1==0) {word=smgduan[9];} else if(L2==0){word=smgduan[10];}else if(L3==0){word=smgduan[11];}else if(L4==0){word=smgduan[12];}R1=1;R2=1;R3=1;R4=0;if(L1==0) {word=smgduan[13];} else if(L2==0){word=smgduan[14];}else if(L3==0){word=smgduan[15];}else if(L4==0){word=smgduan[16];}}
void main() //主函数
{while(1){LSA=1;LSB=0;LSC=1;//点亮led6数码管 keybord(); //选字//while(word!=0); //防抖led=word;delay(10);}}
程序12——点阵LED循环点亮——74HC595 串口转并口通讯
#include "reg52.h"
#include "intrins.h"typedef unsigned int u16;
typedef unsigned char u8;
sbit SER=P3^4;
sbit dCLK=P3^5;
sbit SRCLK=P3^6;
sbit led1=P0^7;
u8 a;
u8 num;void delay(u16 i) //延迟函数
{while(i--);
}void ctob(u8 dat)
{for(a=0;a<8;a++) //进入并行数据{SER=dat>>7; //SER只能接收串行数据(单个数)dat<<=1; //次高位补上SRCLK=0; //上升沿进入位移储存器SRCLK=1;}dCLK=0; //上升沿储存器输入——显示dCLK=1;
}void main() //主函数
{ num=0x01;led1=0; while(1){ctob(num);num=_crol_(num,1); //复位后右移动delay(50000); }
}
点亮第一行第一个灯
#include "reg52.h"
#include "intrins.h"typedef unsigned int u16;
typedef unsigned char u8;
sbit SER=P3^4;
sbit dCLK=P3^5;
sbit SRCLK=P3^6;
sbit led1=P0^7;
u8 a;
u8 num1;
u8 num2;void delay(u16 i) //延迟函数
{while(i--);
}void ctob(u8 dat1,u8 dat2)
{for(a=0;a<8;a++) //进入并行数据{SER=dat1<<7; //SER只能接收串行数据(单个数)dat1>>=1; //次高位补上SRCLK=0; //上升沿进入位移储存器 先进入DPhSRCLK=1;}dCLK=0; //上升沿储存器输入——显示dCLK=1;delay(500000);for(a=0;a<8;a++) //进入并行数据{SER=dat2>>7; //右移7位;SER只能接收串行数据(单个数)dat2<<=1; //次高位补上SRCLK=0; //上升沿进入位移储存器SRCLK=1;}dCLK=0; //上升沿储存器输入——显示dCLK=1;}void main() //主函数
{ num1=0x01;num2=0x00;led1=0; while(1){ctob(num1,num2);delay(5000); }
}
程序13——用动态数码管显示字符或者图像
#include "reg52.h"
#include "intrins.h"typedef unsigned int u16;
typedef unsigned char u8;
sbit SER=P3^4;
sbit dCLK=P3^5;
sbit SRCLK=P3^6;
sbit led1=P0^7;
u8 a;
u8 num1;
u8 num2;void delay(u16 i) //延迟函数
{while(i--);
}LED_hang[]={0x10,0x50,0x3E,0x16,0x52,0x7E,0x10,0x10}; //点亮的数字图案
LED_lie[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};void ctob(u8 dat1,u8 dat2)
{for(a=0;a<8;a++) //进入并行数据{SER=dat1<<7; //SER只能接收串行数据(单个数)dat1>>=1; //次高位补上SRCLK=0; //上升沿进入位移储存器 先进入DPhSRCLK=1;}dCLK=0; //上升沿储存器输入——显示dCLK=1;delay(5);for(a=0;a<8;a++) //进入并行数据{SER=dat2>>7; //右移7位;SER只能接收串行数据(单个数)dat2<<=1; //次高位补上SRCLK=0; //上升沿进入位移储存器SRCLK=1;}dCLK=0; //上升沿储存器输入——显示dCLK=1;}
void main() //主函数
{ u8 j;num2=0x00;while(1){for(j=0;j<8;j++){P0=LED_lie[j]; //依次点亮1-8列ctob(LED_hang[j],num2); //对1-8列的各行点亮delay(10); }delay(50000); }
}
程序14——用独立按键控制直流电动机转动
#include "reg52.h"
#include "intrins.h"typedef unsigned int u16;
typedef unsigned char u8;
sbit speed=P1^0;
sbit keybord=P3^1;void delay(u16 i) //延迟函数
{while(i--);
}void main() //主函数
{ while(1){if(keybord==0){ delay(500);if(keybord==0){speed=~speed;}while(!keybord); }}
}
程序15——用外部中断控制LED的亮灭
为什么用外部中断不用if条件判断(因为:if必须放在程序中的前面或者后面,中断只要打开,就是先执行,比如扫地机器人判断是否需要去充电了,不能总是来判断,用中断可以大大简化我们的程序。)
#include "reg52.h"
#include "intrins.h"typedef unsigned int u16;
typedef unsigned char u8;
sbit led=P2^0;
sbit keybord=P3^2;void delay(u16 i) //延迟函数
{while(i--);
}void int0int()
{EA=1; //总中断打开EX0=1; //外部中断1允许位打开EX1=0; //外部中断2允许位关闭IT0=1; //下降沿有效
}void int0() interrupt 0
{delay(500);if(keybord==0){led=~led; //灯的亮灭控制}}void main() //主函数
{ int0int(); //先打开终端while(1); //保持主函数有执行的程序
}
程序17——用定时器中断控制LED亮灭
#include "reg52.h"
#include "intrins.h"typedef unsigned int u16;
typedef unsigned char u8;
sbit led=P2^0;
u16 a; void delay(u16 i) //延迟函数
{while(i--);
}void Timer0int() //打开定时器中断
{TMOD|=0X01;//1对定时器T0配置 定时模式 01工作方式16位定时器TH0=0XFC; TL0=0X18; //2所需定时时间EA=1; //3总中断打开 开放定时器中断ET0=1; //定e时器T0中断允许位TCON=0X10; //4对TCON配置 使T0计时器打开
}void Timer0() interrupt 1 //中断内的函数
{
//每过1ms TF0变一次TH0=0XFC; TL0=0X18;//必要 对计时重置a=a+1;if(a==1000){a=0;led=~led;}
}void main() //主函数
{ Timer0int();while(1);
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
