单片机小白篇1 -51单片机代码加密程序
利用AT24c02芯片進行保存數據
通過讀取芯片的數據,密碼為9,若從芯片讀到的數據是9,那么8個小燈全亮
原理是i2c總線的知識,單片機模擬
下面是代碼
learning.c
#include<reg52.h>//控制四個獨立按鍵對at24c02進行讀寫
#include"i2c.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit k1=P3^1;//保存顯示的數據
sbit k2=P3^0;//讀取上次保存的數據
sbit k3=P3^2;//對顯示的數據進行累加
sbit k4=P3^3;//清零
sbit La=P2^2;//分別表示A0,A1,A2
sbit Lb=P2^3;
sbit Lc=P2^4;
unsigned char code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f};
u8 num=0,disp[4];
void delay(u16 i)
{
while(i–);
}
void Keypros()//按鍵處理函數
{
if(k10)
{
delay(1000);//消抖
if(k10)
{
At24c02Write(1,num);//1是地址
}
while(!k1);
}
if(k20)
{
delay(1000);
if(k20)
{
num=At24c02Read(1);
if (num9) P2=0;//補充代碼,密碼為9,效果為小燈全亮,代碼的簡易加密程序
}
while(!k2);
}
if(k30)
{
delay(1000);
if(k30)
{
num++;
if(num>255)num=0; //因為我們定義的num是一個字節的,所以最大也就是256
}
while(!k3);
}
if(k40)
{
delay(1000);
if(k4==0)
{
num=0;
}
while(!k4);
}
}
void datapros()
{
disp[0]=smgduan[num/1000];//千位
disp[1]=smgduan[num%1000/100];//百位
disp[2]=smgduan[num%1000%100/10];//十位
disp[3]=smgduan[num%1000%100%10];//個位
}
void Display()
{
int i;
for(i=0;i<4;i++)
{
switch (i) //需要用到74HC138譯碼器的真值表
{
case 0:La=0;Lb=0;Lc=0;break;
case 1:La=1;Lb=0;Lc=0;break;
case 2:La=0;Lb=1;Lc=0;break;
case 3:La=1;Lb=1;Lc=0;break;
}
P0=disp[3-i];
delay(100);
P0=0x00; //起到消影的作用
}
}
void main()
{
while(1)
{
Keypros();
datapros();
Display();
}
}
i2c.c
#include"i2c.h"
void Delay10us() //誤差 -0.234375us,延時10us
{
unsigned char a;
for(a=3;a>0;a–);
}
void I2cStart()//起始信號函數
{
SDA=1;
//Delay10us();
SCL=1;
Delay10us();
SDA=0;
Delay10us();
SCL=0;
Delay10us();
}
void I2cStop()//終止信號
{
SDA=0;
//Delay10us();
SCL=1;
Delay10us();
SDA=1;
Delay10us();
}
unsigned char I2cSendByte(unsigned char dat)//發送字節的函數
{
unsigned char a=0;
for(a=0;a<8;a++)
{
SDA=dat>>7;//因為數據從最高位開始傳送
dat=dat<<1;
Delay10us();
SCL=1;
Delay10us();//讓數據保存好
SCL=0;
Delay10us();
}
unsigned char I2cReadByte()
{
unsigned char a=0,dat=0;
SDA=1;
Delay10us();
for(a=0;a<8;a++)
{
}
void At24c02Write(unsigned char addr,unsigned char dat)
{
I2cStart();//起始信號
I2cSendByte(0xa0);//有無應答在發送函數里面就有體現了
I2cSendByte(addr);
I2cSendByte(dat);
I2cStop();
}
unsigned char At24c02Read(unsigned char addr)
{
unsigned char num;
I2cStart();//起始信號
I2cSendByte(0xa0);
I2cSendByte(addr);
I2cStart();//方向變了,所以又需要起始信號
I2cSendByte(0xa1);
num=I2cReadByte();
I2cStop();
return num;
}
i2c.h
#ifndef _I2C_H //定義頭文件的格式
#define _I2C_H
#include <reg52.h>
sbit SCL=P2^1;
sbit SDA=P2^0;//定義管腳
void I2cStart();
void I2cStop();
unsigned char I2cSendByte(unsigned char dat);
unsigned char I2cReadByte();
void At24c02Write(unsigned char addr,unsigned char dat);
unsigned char At24c02Read(unsigned char addr);
#endif
總結
以上是生活随笔為你收集整理的单片机小白篇1 -51单片机代码加密程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一名即将退休的架构师告诉Java程序员们
- 下一篇: ElasticSearch入门-搜索(j