在这篇文章里我会讲述其他的基础知识,以便理解,因为每个板子他学习模块的顺序不同,把定时器有拉出来讲一讲
1.变量
变量分为局部变量和全局变量 ,在函数外面就在上面定义声明的就是全局变量,下面的所有函数都可以使用,全局变量一般定义在开头位置,在函数内部定义声明的是局部变量,只能在这个函数内部使用。但是全局变量会增加内存的消耗,局部变量只有在该变量存在的函数内运行时才会占用内存单元,函数结束后释放内存。到了后期复杂程序,最好使用局部变量,少用全局,改数据改代码也会好修改一些。同时如果你把全局和局部的变量名设置的一样,局部会优先,所以不要因为懒写成一个名字.
2.static
这个是静态的意思,它怎么来使用呢,首先在函数内部定义的局部变量是有一个隐藏的auto,这是指动态变量或者叫自动变量,如果加上一个static就是静态局部变量,注意的是全局变量都是静态变量,特点是只赋值了一次初值,在之后程序运行的时候,这个值就保留了了上一次的值接着运行。
void display(uchar i)
{ static uchar wei;
P0 = 0XFF;//清除断码
WE = 1;//打开位选锁存器
P0 = weixuan[wei];
WE = 0;//锁存位选数据
switch(wei)
{
case 0: DU = 1; P0 = duanxuan[i/100%10]; DU = 0; break;
case 1: DU = 1; P0 = duanxuan[i/10%10]; DU = 0; break;
case 2: DU = 1; P0 = duanxuan[i%10]; DU = 0; break;
}
wei++;
if(wei == 3)
wei = 0;
}
这是一个数码管的函数,这个函数我是放在了中断函数里每五毫秒扫描一次,每次会使用上一次的wei的值。完整函数在上一篇各中断类型里的最后一个。
3.先描述一下定时器的问题,我只讲部分有用的,详细请参考数据手册或者其他资料。
先提一个词叫晶振,它是给电路提供频率的,时钟周期就等于1/晶振,C51系列的标准构架下它的一个机械周期是12个时钟周期,而定时器就是每经过一个机械周期自动加一,溢出后为0。
下面是定时器存储寄存器
TH0 | 定时器0高八位 |
TL0 | 定时器0低八位 |
TH1 | 定时器1高八位 |
TL1 | 定时器1第八位 |
一共16位两个字节最大到65535
下面看一下 定时器控制寄存器TCON
TF1 定时器1的溢出标志,为1则需软件清零或者进入定时器中断清零
TR1 启动定时器1
TF0,TR0同上
下面是定时器模式寄存器TMOD(不可位寻址),什么叫不可位寻址比如上面TCON里的TR1=1;是可以这样写的,但是TMOD里的C/T不能写C/T=1,要写成TMOD=0x05;的形式。
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
符号 | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
对应的 | T1 | T1 | T1 | T1 | T0 | T0 | T0 | T0 |
T1,T0 表示定时器1,0
C/T 置1是计数器,置0是定时器
M1 M0 决定工作模式
0 0 0
0 1 1 16位定时器
1 0 2
1 1 3
4.中断和定时器看我之前文章的代码
5.先用取模软件做一个心形图案,因为我使用的是74hc595就没用中断,如果你使用的是74hc138要使用中断。
#include<reg52.h>
#include<intrins.h>
sbit DI = P3^4;//串口输入
sbit s_clk = P3^5;//移位寄存器
sbit r_clk = P3^6;//输出寄存器
unsigned char code leddian[8]={0xE7,0xC3,0x81,0x00,0x00,0x00,0x99,0xFF};
unsigned char i;
void send_byte(unsigned char dat)
{
r_clk = 0;
s_clk = 0;
for(i=0;i<8;i++)
{
if(dat & 0x01)
DI = 1;
else
DI = 0;
s_clk = 1;
dat>>=1;
s_clk = 0;
}
}
void main ()
{
unsigned j,row;
while(1)
{
row = 0x80;
for(j=0;j<8;j++)
{
send_byte(leddian[j]);
send_byte(row);
r_clk = 1;
r_clk = 0;
row=_cror_(row,1);
}
}
}
6.下面是让图形竖向动起来,要了解74hc595,自己去查数据手册
#include<reg52.h>
#include<intrins.h>
sbit DI = P3^4;//串口输入
sbit s_clk = P3^5;//移位寄存器
sbit r_clk = P3^6;//输出寄存器
unsigned char code leddian[]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xC3,0xE7,0xE7,0xE7,0xE7,0xC3,0xFF,0x99,
0x00,0x00,0x00,0x81,0xC3,0xE7,0xFF,0x99,
0x99,0x99,0x99,0x99,0x81,0xC3,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};
unsigned char i;
void send_byte(unsigned char dat)
{
r_clk = 0;
s_clk = 0;
for(i=0;i<8;i++)
{
if(dat & 0x01)
DI = 1;
else
DI = 0;
s_clk = 1;
dat>>=1;
s_clk = 0;
}
}
void main ()
{ unsigned char row = 0x80;
unsigned int cnt=0;
unsigned char k=0;
unsigned char index = 0;
TMOD =0x01;
TH0 = 0xfc;
TL0 = 0x67;
TR0 = 1;
row = 0x80;//行
while(1)
{
if(TF0==1)
{
TH0 = 0xfc;
TL0 = 0x67;
cnt++;
}
switch(k)
{
case 0:send_byte(leddian[index+7]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
case 1:send_byte(leddian[index+6]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
case 2:send_byte(leddian[index+5]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
case 3:send_byte(leddian[index+4]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
case 4:send_byte(leddian[index+3]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
case 5:send_byte(leddian[index+2]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
case 6:send_byte(leddian[index+1]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
case 7:send_byte(leddian[index+0]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k=0; break;
default :break;
}
if(cnt>=800)
{
cnt = 0;
index ++;
}
if(index>=32)
index = 0;
}
}
下面让它横向动起来和竖向不太一样
#include<reg52.h>
#include<intrins.h>
sbit DI = P3^4;//串口输入
sbit s_clk = P3^5;//移位寄存器
sbit r_clk = P3^6;//输出寄存器
unsigned char code leddian[30][8]={
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//1
{0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE},//2
{0xFF,0xFC,0xFE,0xFE,0xFE,0xFE,0xFE,0xFC},//3
{0xFF,0xF8,0xFC,0xFC,0xFC,0xFC,0xFC,0xF8},//4
{0xFF,0xF0,0xF9,0xF9,0xF9,0xF9,0xF9,0xF0},//5
{0xFF,0xE1,0xF3,0xF3,0xF3,0xF3,0xF3,0xE1},//6
{0xFF,0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3},//7
{0xFF,0x87,0xCE,0xCE,0xCE,0xCF,0xCF,0x87},//8
{0xFF,0x0E,0x9C,0x9C,0x9C,0x9E,0x9F,0x0F},//9
{0xFF,0x1C,0x38,0x38,0x38,0x3C,0x3E,0x1F},//10
{0xFF,0x39,0x70,0x70,0x70,0x78,0x7C,0x3E},//11
{0xFF,0x73,0xE0,0xE0,0xE0,0xF0,0xF8,0x7C},//12
{0xFF,0xE6,0xC0,0xC0,0xC0,0xE0,0xF0,0xF9},//13
{0xFF,0xCC,0x80,0x80,0x80,0xC0,0xE1,0xF3},//14
{0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7},//15
{0xFF,0x33,0x01,0x01,0x01,0x03,0x87,0xCF},//16
{0xFF,0x67,0x03,0x03,0x03,0x07,0x0F,0x9F},//17
{0xFF,0xCE,0x06,0x06,0x06,0x0E,0x1E,0x3F},//18
{0xFF,0x9C,0x0C,0x0C,0x0C,0x1C,0x3C,0x7E},//19
{0xFF,0x39,0x19,0x19,0x19,0x39,0x78,0xFC},//20
{0xFF,0x73,0x33,0x33,0x33,0x73,0xF0,0xF8},//21
{0xFF,0xE6,0x66,0x66,0x66,0xE6,0xE0,0xF0},//22
{0xFF,0xCC,0xCC,0xCC,0xCC,0xCC,0xC0,0xE1},//23
{0xFF,0x99,0x99,0x99,0x99,0x99,0x81,0xC3},//24
{0xFF,0x33,0x33,0x33,0x33,0x33,0x03,0x87},//25
{0xFF,0x67,0x67,0x67,0x67,0x67,0x07,0x0F},//26
{0xFF,0xCF,0xCF,0xCF,0xCF,0xCF,0x0F,0x1F},//27
{0xFF,0x9F,0x9F,0x9F,0x9F,0x9F,0x1F,0x3F},//28
{0xFF,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x7F},//29
{0xFF,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0xFF},//
};
unsigned char i;
void send_byte(unsigned char dat)
{
r_clk = 0;
s_clk = 0;
for(i=0;i<8;i++)
{
if(dat & 0x01)
DI = 1;
else
DI = 0;
s_clk = 1;
dat>>=1;
s_clk = 0;
}
}
void main ()
{ unsigned char row = 0x80;
unsigned int cnt=0;
unsigned char k=0;
unsigned char index = 0;
TMOD =0x01;
TH0 = 0xfc;
TL0 = 0x67;
TR0 = 1;
row = 0x80;//行
while(1)
{
if(TF0==1)
{
TH0 = 0xfc;
TL0 = 0x67;
cnt++;
}
switch(k)
{
case 0:send_byte(leddian[index][7]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
case 1:send_byte(leddian[index][6]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
case 2:send_byte(leddian[index][5]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
case 3:send_byte(leddian[index][4]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
case 4:send_byte(leddian[index][3]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
case 5:send_byte(leddian[index][2]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
case 6:send_byte(leddian[index][1]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
case 7:send_byte(leddian[index][0]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k=0; break;
default :break;
}
if(cnt>=800)
{
cnt = 0;
index ++;
}
if(index>=30)
index = 0;
}
}