功能:通過按鍵進行簡單的加減,比如:數碼管數值是1000,按充值鍵(ADD)充值50,數碼管就變為1050,再按消費鍵(DEC)消費10,數碼管數值變為1040.
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
充值和消費2.PNG (39.93 KB, 下載次數: 40)
下載附件
2018-5-27 17:50 上傳
充值和消費1.PNG (40.87 KB, 下載次數: 36)
下載附件
2018-5-27 17:50 上傳
0.png (47.23 KB, 下載次數: 48)
下載附件
2018-5-27 18:16 上傳
單片機程序源碼:
- #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)
2018-5-27 17:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|