前言
纯新手,程序是之前打的,没有进行过优化,有很多不成熟的地方,希望能互相学习并借鉴
下面写的是默认有一点点基础应该就可以看得懂的,会尽力详细
提示:以下是本篇文章正文内容,下面案例可供参考
一、任务要求
二、代码部分
1.继电器控制
bit on
bit----------C51扩展的变量类型
bit和int char之类的差不多,只不过char=8位, bit=“1位而已”,都是变量
其数据有两种取值:0和1,在输入0以外的其他值时,系统均把它们当1看待
一般来说我们可以用于表示真、假或是、否等二值选择
on ----------自定义的变量
这里主要是设置两种模式
当on为0时关闭继电器,为1时开启继电器
代码如下:
void jdq(bit on)
{
P2=((P2&0X1F)|0XA0);
if(on)
P0=0X1f;
else
P0=0x00;
P2&=0X1F;
}
2.LED控制部分
int类型:int类型时有符号的整数,即int类型的值可以是正整数或者负整数
i ----------自定义的变量
这里主要是控制那些灯亮
代码如下:
void led(int i)
{
P2=((P2&0X1F)|0X80);
P0=i;
P2&=0X1F;
}
3.定时器设置部分
TMOD=0x10 :
作用:设置定时器1为方式1模式(16位定时器/计数器)。
TH1=(65536-11059/12)/256;
TL1=(65536-11059/12)%256;
作用:设置初始值约为1000,可以简单理解为0.1s 刷新一次
代码如下:
void din()
{
TMOD=0X10;
TH1=(65536-11059/12)/256;
TL1=(65536-11059/12)%256;
EA=1;
TR1=1;
ET1=1;
}
或者也可以用stc直接生成,这是之前打的代码,之后就一般用stc了
4.数码管动态刷新程序
代码如下:
void display()
{
P2=((P2&0X1F)|0Xe0); //数码管段码
P0=0xff;
P2&=0X1F;
P2=((P2&0X1F)|0Xc0); //数码管位码
P0=1<<diswela;
P2&=0X1F;
P2=((P2&0X1F)|0Xe0); //数码管段码
P0=dula[disdula[diswela]];
P2&=0X1F;
if(++diswela>=8)diswela=0;
}
· 1.问: 第一个P0=0xff;
具体表达什么意思
答:相当于清屏,消隐
- 问:第二个
P0=1<<diswela;
具体表达什么意思
答:diswela(全局变量)用来选定当前数码管显示位置,例如diswela=0时,点亮选中第一个数码管,diswela=1时,选中第二个数码管,只有当选中的时候才能将位码的值传给他,而这段代码也要和最下面这个一起看
if(++diswela>=8)diswela=0;
而这里的表示的意思,按顺序选择第一到第八个数码管
- 问:第三个
P0=dula[disdula[diswela]];
具体表达什么意思
答:
dula[ ]
放置段码的数组,简单理解就是数码管上显示0-9的数组
disdula[ ]
放置你自己想选择的数字的数组
dula[disdula[diswela]]
在数码管上显示的具体数字
举个例子:
前置条件disdula[ ]={5,1,2,3,4,5,6};
如果我想让数码管的第一位显示一个数字5的话,那这个函数会怎么样
diswela=0------表示选择第一位数码管
disdula[diswela] 变成了 disdula[0]-------------表示用你在这里的第一个数字5
dula[disdula[diswela]]] 变成了 dula[5]-----------在八位数码管显示5
剩下的以后章节再写
5.总代码
iic用蓝桥杯官方提供的驱动
#include<stc15f2k.h>
#include<iic.h>
sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;
char dula[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
char disdula[]={0,0,0,0,0,0,0,0};
int diswela,ms,key,sign,date,a,jiage,stop=3,light;
bit flag;
void buzz()
{
P2=((P2&0X1F)|0XA0);
P0=0X00;
P2&=0X1F;
}
void jdq(bit on)
{
P2=((P2&0X1F)|0XA0);
if(on)
P0=0X1f;
else
P0=0x00;
P2&=0X1F;
}
void delay(int x)
{
int i;
while(x--)
for(i=0;i<5*123;i++);
}
void led(int i)
{
P2=((P2&0X1F)|0X80);
P0=i;
P2&=0X1F;
}
void din()
{
TMOD=0X10;
TH1=(65536-11059/12)/256;
TL1=(65536-11059/12)%256;
EA=1;
TR1=1;
ET1=1;
}
void display()
{
P2=((P2&0X1F)|0Xe0);
P0=0xff;
P2&=0X1F;
P2=((P2&0X1F)|0Xc0);
P0=1<<diswela;
P2&=0X1F;
P2=((P2&0X1F)|0Xe0);
P0=dula[disdula[diswela]];
P2&=0X1F;
if(++diswela>=8)diswela=0;
}
void display_1()
{
disdula[0]=11;
disdula[1]=12;
disdula[2]=5;
disdula[3]=0;
disdula[4]=0;
disdula[5]=12+date/100%10;
disdula[6]=date/10%10;
disdula[7]=date/1%10;
}
void display_2()
{
disdula[0]=11;
disdula[1]=12;
disdula[2]=5;
disdula[3]=0;
disdula[4]=0;
disdula[5]=12+jiage/100%10;
disdula[6]=jiage/10%10;
disdula[7]=jiage/1%10;
}
char anjian()
{
static int key_up=1;
int keyscan=0;
if(key_up&(s7==0||s4==0||s5==0||s6==0))
{
delay(20);
key_up=0;
if(s4==0)keyscan=4;
else if(s5==0)keyscan=5;
else if(s6==0)keyscan=6;
else if(s7==0)keyscan=7;
}else if(s7==1&&s4==1&&s5==1&&s6==1)key_up=1;
return keyscan;
}
void ad()
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x01);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
light=IIC_RecByte();
IIC_WaitAck();
IIC_Stop();
}
void main()
{
buzz();
jdq(0);
led(0xff);
din();
while(1)
{
if(stop==1|stop==3)
display_1();
else if(stop==0)
display_2();
if(light<125){if(stop==1)led(0xfc);else led(0xfd);}
else if(light>=125){if(stop==1)led(0xfe);else led(0xfd);}
if(date>=1000)stop=0;
if(flag==1)
{
ad();
flag=0;
key=anjian();
switch(key)
{
case 4:
break;
case 5:
break;
case 6:
jdq(0);
jiage=date/2;
stop=0;
led(0xff);
break;
case 7:
if(stop==0)
date=0;
stop=1;
jdq(1);
led(0xfe);
break;
}
}
}
}
void qa() interrupt 3
{
TH1=(65536-11059/12)/256;
TL1=(65536-11059/12)%256;
ms++;a++;
if(!(ms%100))flag=1;
if(ms>=1500)ms=0;
if(stop==1)
{
if(a>=150)
{
a=0;
date=date+10;
}
}
display();
}