功能:通过按键进行简单的加减,比如:数码管数值是1000,按充值键(ADD)充值50,数码管就变为1050,再按消费键(DEC)消费10,数码管数值变为1040.
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机程序源码:
- #include <REGX51.H>
- #define uchar unsigned char
- #define uint unsigned int
- #define out P0
- sbit sda=P2^0;
- sbit scl=P2^1;
- sbit add=P3^6;
- sbit dec=P3^7;
- sbit wx1=P1^4;
- sbit wx2=P1^5;
- sbit wx3=P1^6;
- sbit wx4=P1^7;
- #define card1 0xa0
- #define card2 0xa2
- #define card3 0xa4
- #define card4 0xa6
- #define card5 0xa8
- #define card6 0xaa
- #define card7 0xac
- #define card8 0xae
- uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- //***************************//
- uint temp=1000;
- //***************************//
- void delay()
- {;;}
- //***************************//
- //***************************//
- void delay_1(uint x)
- {while(x--);}
- //***************************//
- //***************************//
- void start()
- {
- sda=1;
- scl=1;
- delay();
- sda=0;
- delay();
- }
- //***************************//
- //***************************//
- void stop()
- {sda=0;
- scl=1;
- delay();
- sda=1;
- delay();
- }
- //***************************//
- //***************************//
- /*该函数(respons())用于主器件--单片机"检测"从器件(该从器件内部具有iic接口,
- 能自动产生应答信号)接到数据后返回给主器件--单片机的应答信号
- (有应答时为sda=0,无应答时为sda=1)*/
- void respons() //其实该函数真正的作用是模拟产生第九个时钟脉冲,从而满足iic总线协议的时序要求
- {uchar i=0;
- scl=1;delay();
- while((sda==1)&&(i<250))i++;
- scl=0;delay();
- }
- //***************************//
- //***************************//
- /*该函数(ack_iic(bit a))模拟的应答信号是由主器件--单片机(一般用在主器件--单片机从总线上读数据后,
- 此时主器件--单片机的角色为接收器)"主动产生"并返回给从器件的应答信号
- (当形参a=0时为应答,当形参a=1时为非应答)*/
- void ack_iic(bit a) // 当形参a=0时为应答,当形参a=1时为非应答
- {if(a==0)sda=0;
- else sda=1;
- delay();
- scl=1;
- delay();
- scl=0;
- delay();
- }
- //***************************//
- //***************************//
- void init() //iic总线初始化函数(将两根线的电平全部拉高,使总线处于"备用"状态)
- {
- scl=1;sda=1;delay();
- }
- //***************************//
- //***************************//
- void write_byte(uchar dat)
- {uchar i,temp;
- temp=dat;
- scl=0;delay();
- for(i=0;i<8;i++)
- {temp=temp<<1;
- sda=CY;delay();scl=1;delay();scl=0;delay();
- }
- sda=1;delay();//向端口写1,为后续的"读字节"函数做好准备!最好加上这一句,因为51单片机的I/O口为准双向口,在读入端口数据前应先向端口写1,以确保读入数据准确!
- }
- //***************************//
- //***************************//
- uchar read_byte()
- {uchar i,j,k;
- sda=1;//先向端口写1,最好加上这一句,因为51单片机的I/O口为准双向口,在读入端口数据前应先向端口写1,以确保读入数据准确!
- for(i=0;i<8;i++)
- {scl=1;delay();j=sda;k=(k<<1)|j;
- scl=0;delay();
- }
- return k;
- }
- //***************************//
- /*"写操作"函数,设置三个参数,其中num为器件地址,address为字节地址,dat为要写入的数据*/
- void write_add(uchar num,uchar address,uchar dat)
- { start();
- write_byte(num);
- respons();
- write_byte(address);
- respons();
- write_byte(dat);
- respons();
- stop();
- }
复制代码
全部资料51hei下载地址:
AT24C02(消费 充值).rar
(50.25 KB, 下载次数: 53)
|