Proteus 使用
keil使用
生成hex给Proteus 用
开始
## 利用外部中断检测独立按键
利用外部中断检测独立按键
按一下开关一个灯亮一个灯灭
#include<reg51.h>
sbit led1=P1^0;
sbit led2=P1^1;
main()
{
led1=0;
led2=1;
IT0=1;//下降沿触发INT0外部中断
EX0=1;//允许INT0外部中断
EA=1;//开总中断
while(1);
}
key() interrupt 0
{
led1=~led1;
led2=~led2;
IE0=0;
}
流水灯
#include<reg51.h>
//sbit D1=P2^7;
main()
{
//D1=1;
long i=10000;
int x;
for(x=0x80;x>=1;x=x/2)
{
P2=x;
i=10000;
while(i--);
}
}
用定时器控制流水灯
#include<reg51.h>
int count;//用于在定时器中断服务程序中计数。
main()
{
int x;
count=0;
TMOD=0X01;
//TH0和TL0分别是定时器0的高位和低位计数器寄存器。
TH0=0X3C;
TL0=0XB0;
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启全局中断
TR0 = 1; // 启动定时器0
//for(x=0x80;x>=1;x=x/2)
for(x = 0x01; x <= 0x80; x = x * 2)//反着闪烁
{
P2=x;
while(count<10);//0.5秒
count=0;
}
}
timer0() interrupt 1
{
count++;
// 重新设置定时器0的计数器,以便产生下一个定时周期。
TH0=0X3C;
TL0=0XB0;
}
PWM改变高电平的时间灯的亮度就有变化
电容:稳定电压
#include<reg51.h>
sbit led = P1^0;
main()
{
int i,j;
//不亮
j=1000;
while(j--)
{
led=0;
i=50;
while(i--);
}
//50%亮
j=1000;
while(j--)
{
led=0;
i=50;
while(i--);
led=1;
i=50;
while(i--);
}
//60%亮
j=1000;
while(j--)
{
led=0;
i=40;
while(i--);
led=1;
i=60;
while(i--);
}
//100%亮
j=1000;
while(j--)
{
led=1;
i=100;
while(i--);
}
}
静态显示电路设计–数码管
数码管display
静态显示变化字形
#include<reg51.h>
void delay(){
long i = 20000;
while(i--);
}
main()
{
int num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
int i;
for(i = 0; i<sizeof(num)/sizeof(num[0]);i++){
P2=num[i];
delay();}
}
动态显示变化字形
keil最好用英文做文件名字,中文不报错
#include<reg51.h>
void delay(){
long i = 25;
while(i--);
}
main()
{
int i,j;
int t=1;
int num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
j=1;
while(j<9){
P3=0xff-t;
P2=num[j++];
delay();
t=t*2;
}
}
一个按键设计
#include<reg51.h>
sbit key1=P1^0;
void delay(){
long i = 25;
while(i--);
}
main()
{
int i,j;
int t=1;
int shuzi;
int num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
j=1;
if(key1==0) shuzi=num[1];
else shuzi=num[0];
P3=0xfe;
P2=shuzi;
}
四个按键设计
#include<reg51.h>
void delay(){
long i = 25;
while(i--);
}
main()
{
int i,j;
int t=1;
int shuzi;
int num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
j=1;
while(1){
switch(P1){
case 0xfe: shuzi=num[1]; break;
case 0xfd: shuzi=num[2]; break;
case 0xfb: shuzi=num[3]; break;
case 0xf7: shuzi=num[4]; break;
}
P3=0xfe;
P2=shuzi;
}
while(0){//j<9){
P3=0xff-t;
P2=num[j++];
delay();
t=t*2;
}
}
软件防抖编程
#include<reg51.h> // 包含8051微控制器的头文件
void delay() {
long i = 25;
while(i--); // 简单的延时函数`
}
main() {
int i, j, k;
int t = 1;
int shuzi;
int p;
// 数字0-9在七段显示器上的编码
int num[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
shuzi = num[0]; // 初始显示数字0
while(1) {
p = P1; // 读取P1端口的值
// 检查是否有按键按下
if(p != 0xff) {
k = 2000;
while(k--); // 延时去抖
p = P1; // 再次检查P1端口的值
// 根据P1的值改变要显示的数字
if(p != 0xff) switch(P1) {
case 0xfe: shuzi = num[1]; break;
case 0xfd: shuzi = num[2]; break;
case 0xfb: shuzi = num[3]; break;
case 0xf7: shuzi = num[4]; break;
}
}
P3 = 0xfe; // 设置显示段
P2 = shuzi; // 显示数字
}
j = 1;
while(0) { // 这部分代码永远不会执行
// 以下代码似乎是用于循环显示数字,但未被使用
P3 = 0xff - t;
P2 = num[j++];
delay();
t = t * 2;
}
}
矩阵键盘
keypad
#include<reg51.h> // 包含8051微控制器的头文件
void delay() {
int k = 2000;
while(k--); // 延时去抖
}
main() {
int shuzi;
int p;
// 数字0-9在七段显示器上的编码
int num[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,0x77};
shuzi = num[0]; // 初始显示数字0
while(1) {
P1=0xf7; // 第一列接的P1^3-->11110111
p=P1;
// 检查是否有按键按下
if(p != 0xf7) {
delay();
p=P1; // 再次检查P1端口的值
// 根据P1的值改变要显示的数字
if(p != 0xf7) switch(p) {
case 0x77: shuzi = num[7]; break;
case 0xb7: shuzi = num[4]; break;
case 0xd7: shuzi = num[1]; break;
case 0xe7: shuzi = num[10]; break;
}
}
P3 = 0xfe; // 设置显示段
P2 = shuzi; // 显示数字
}
}
矩阵键盘逐列
#include<reg51.h> // 包含8051微控制器的头文件
void delay() {
int k = 2000;
while(k--); // 延时去抖
}
int readkey() {
int p;
int key;
// 将 P1^3 置为低电平,其余位保持高电平
P1 = 0xf7; // 第一列接的 P1^3 -> 11110111
p = P1;
// 检查是否有按键按下
if (p != 0xf7) {
delay(); // 延时以消除抖动
p = P1; // 再次检查 P1 端口的值
// 如果检测到按键按下
if (p != 0xf7) {
// 根据 P1 的值确定按下的键
switch (p) {
case 0x77: key = 7; break; // 第一行第一列
case 0xb7: key = 4; break; // 第二行第一列
case 0xd7: key = 1; break; // 第三行第一列
case 0xe7: key = 10; break; // 第四行第一列
}
}
}
P1 = 0xfb; //第二列
p = P1;
if (p != 0xfb) {
delay();
p = P1;
if (p != 0xfb) {
switch (p) {
case 0x7b: key = 8; break;
case 0xbb: key = 5; break;
case 0xdb: key = 2; break;
case 0xeb: key = 0; break;
}
}
}
P1 = 0xfd; // 第三列
p = P1;
if (p != 0xfd) {
delay();
p = P1;
if (p != 0xfd) {
switch (p) {
case 0x7d: key = 9; break;
case 0xbd: key = 6; break;
case 0xdd: key = 3; break;
case 0xed: key = 11; break;
}
}
}
P1 = 0xfe; // 第四列
p = P1;
if (p != 0xfe) {
delay();
p = P1;
if (p != 0xfe) {
switch (p) {
case 0x7e: key = 12; break;
case 0xbe: key = 13; break;
case 0xde: key = 14; break;
case 0xee: key = 15; break;
}
}
}
return key;
}
main() {
int p;
// 数字0-9在七段显示器上的编码
int num[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
while(1) {
int key = readkey();
P3 = 0xfe; // 设置显示段
P2 = num[key]; // 显示数字
}
}
LCD