亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? max7221(多路)2.c

?? 單片機應用系統(光盤內容)
?? C
字號:
#include <reg51.h>					//AD7135直接與單片機相連  采用查詢的方法  多路
#include <absacc.h>
#include <intrins.h>
#define uchar 	unsigned char
#define uint 	unsigned int
#define ulong 	unsigned long
#define ADP2   	P2
#define ADP0   	P0
#define CD4051  P1
#define fosc	12			    	// 晶振頻率
#define time0	2000				// 定時2000us
#define jishu   1000            	// 假設AD輸入電壓與對應瞬時功率的基數
									//	1V對應1000w
uint idata jisuandu; 				// 臨時變量,用于計算電度數
uint idata time0_0; 				// 臨時變量,用于計算定時
sbit STAT7135= P1^7; 				// 7135的啟動端
sbit busy  = P2^6;  				// 7135的忙端
sbit st  = P2^5;     				// 7135的選通端
sbit CS7221  = P1^5;				// 7221的片選
sbit DIN7221 = P1^4;				// 7221的數據端
sbit CLK7221 = P1^6;				// 7221的時鐘端
sbit SDA=P3^1;						//2416的數據端
sbit SCL=P3^0;						//2416的時鐘端
//sbit en_24c16=P3^4;
uchar DISPBUF[8]={0,1,2,3,4,5,6,7};	//顯示緩沖區
uchar ADBUF[40]=0;					//AD緩沖區  (萬千百十個)*8
uchar TIME[2]=0;   					//用于定時
uchar BUF[5]=0;  					//數據處理緩沖區


void delay(uint n);					//延時子程序
void Initial7221(void);				//MAX7221初始化
void WR7221(uchar addr,uchar Data);	//MAX7221寫程序
void Max7221Display(uchar *buffer);	//MAX7221顯示程序
void time2ms(void);					//定時器0初始化程序
void time0_int(void);				//定時器0中斷服務程序
void ICL7135(void);					//ICL7135 8路信號AD轉換程序
void SAVE(void);					//電量存儲 轉電度程序
void start_bit(void);				//IIC開始條件				
void stop_bit(void);				//IIC停止條件
void mast_ack(void);				//IIC應答
bit write_8bit(uchar ch);			//IIC寫8位數據
uchar read24c16(uint address,uchar *shu);					//IIC讀字節數據
uchar write24c16(uint address,uchar ddata);					//IIC寫字節數據
uchar page_wr(uint firstw_ad,uint counter,uchar *firstr_ad);//IIC頁寫
uchar page_rd(uint firstrd_ad,uint count,uchar *firstwr_ad);//IIC頁讀



main()
{	//while(page_wr(0,120,0)==0);			//初次使用時 清電量數
    Initial7221();              			//初始化7221
    Max7221Display(&DISPBUF[0]); 			//開機默認顯示0~7
    delay(40);								//延時
	time2ms();								//啟動定時器
	while(1)
	{
		 if(TIME[1]%10==0) 					//5秒時間到
		{	ICL7135(); 						//啟動8路AD轉換
			SAVE();							//存儲電能
		}
	}   
}


void WR7221(uchar addr,uchar Data)			//MAX7221的寫子程序
{
    uchar i;
    CS7221  = 0;		     				//片選有效
    for (i=0;i<8;i++)     					//寫8位地址
    {
        CLK7221 = 0;						//時鐘低
        DIN7221 = (addr&(0x80>>i)) ? 1:0;	//先發高位 依次到低位
        _nop_();
        _nop_();
        CLK7221 = 1;						//時鐘高  上升沿鎖數據
        _nop_();
        _nop_();
    }
    for (i=0;i<8;i++)     					//寫8位數據
    {
        CLK7221 = 0;						//時鐘低
        DIN7221 = (Data&(0x80>>i)) ? 1:0;	//先發高位 依次到低位
        _nop_();
        _nop_();
        CLK7221 = 1;						//時鐘高  上升沿鎖數據
        _nop_();
        _nop_();
    }
    CS7221  = 1;		     				//片選無效
}

void Initial7221(void)	//MAX7221初始化
{
    WR7221(0x0A,0x0A);	//亮度地址0AH,0x00~0x0F,0x0F最亮
    WR7221(0x0B,0x07);	//掃描LED個數地址0BH,0x00~0x07,最多掃描8個數碼管
    WR7221(0x0C,0x01);	//工作模式地址0x0C. 0x00:關斷;0x01:正常
    WR7221(0x09,0xFF);	//編碼模式地址0x09. 0x00~0xFF:哪一位為1,哪一位就支持編碼
}

void Max7221Display(uchar *buffer)	//MAX7221顯示子程序
{
    uchar i;
    for (i=0;i<8;i++)				//MAX7221的8個數碼管顯示
    {
        WR7221(i+1,*(buffer+i));	//調MAX7221的寫子程序
    }
}



void delay(uint n)		     		//延時程序
{
    uint i,j;
    for (i=0;i<n;i++)
        for (j=0;j<1140;j++);
}



void time2ms(void)		     		//T0定時器初始化
{
    TMOD=0x01;				     	// T0工作方式1
    /* 2ms 定時設置 */
    time0_0 = 65536-time0*fosc/12;	//計算初值
    TH0=(time0_0/256);	     		//裝定時器0初值
    TL0=(time0_0%256);
    TR0=1;			     			//啟動定時器0
    ET0=1;			     			//打開定時器0中斷
    EA=1;			     			//打開總中斷
}

/* 定時器0中斷服務子程序,定時用于AD轉換  
1s約轉換3次,8路信號約3s時間  
為了時間充裕 5s采集一次電能信號 */
void time0_int(void) interrupt 1
{
    TH0=(time0_0/256);				//重裝定時器0初值
    TL0=(time0_0%256);
    TIME[0]++;
    if (TIME[0]==250) 				//250*2ms=500ms=0.5s時間到
    {
        TIME[0]=0;					//到0.5s時 TIME[0]清0  
        TIME[1]++;					//TIME[1]加1   內存的0.5秒的整數倍
    }
}

void ICL7135(void)								//啟動8路AD轉換
{
    uchar i,j;
    STAT7135=1;									//7135啟動端使能 啟動AD轉換
    CD4051=CD4051&0xf0;							//設置CD4051的第一路信號輸入AD
    for (j=0;j<=7;j++)							//8路循環測量
    {
        i=CD4051&0xf0;							//讀P1口的狀態 保護高位
        CD4051=j|i;								//通過j調節 多路開關的轉換
        STAT7135=1;								//7135啟動端使能 啟動AD轉換
        i=busy;									//讀7135的正在轉換 忙端
        do{i=busy;}while(busy==0);				//忙端為0時 等待 直到開始轉換        
        do{i=busy;}while(busy==1);				//忙端為1時 正在轉換 等待
        STAT7135=0;								//7135 禁止AD轉換
        do{i=ADP2;}while((ADP2&0x010)!=0x010);	//讀7135的D5,直到D5為1
        if ((ADP2&0x010)==0x010)				//D5為1開始讀AD轉換結果
        {
            //STAT7135=0;
            ADBUF[j*5]=ADP0&0x0f;				//讀7135的萬位
            do{i=ADP2;}while((ADP2&0x08)!=0x08);//讀7135的D4,直到D4為1
            ADBUF[1+j*5]=ADP0&0x0f;				//讀7135的千位
            do{i=ADP2;}while((ADP2&0x04)!=0x04);//讀7135的D3,直到D3為1
            ADBUF[2+j*5]=ADP0&0x0f;				//讀7135的百位
            do{i=ADP2;}while((ADP2&0x02)!=0x02);//讀7135的D2,直到D2為1
            ADBUF[3+j*5]=ADP0&0x0f;				//讀7135的十位
            do{i=ADP2;}while((ADP2&0x01)!=0x01);//讀7135的D1,直到D1為1
            ADBUF[4+j*5]=ADP0&0x0f;				//讀7135的個位
			//ADBUF[0]=j+1;						//路號
			//Max7221Display(&ADBUF[j*5]);		//當頻率慢時可以顯示AD轉換的結果
        }
    }
}

void SAVE(void)  									//電能處理 保存
{
    uchar k,i;
    ulong kk,kk1,kk2;
    if (TIME[1]<120)   								//小于1分鐘時 120*0.5=60s 簡單加
    {
        for (k=0;k<=7;k++)  						//8路電能循環存儲
        {
            while (page_rd(k*5,5,&BUF[0])==0);		//讀原來的電能 各路5位數字
            for (i=0;i<=4;i++)
            {
                BUF[i]=BUF[i]+ADBUF[i+k*5];			//本次的電能和原來的電能求和
            }
            while (page_wr(k*5,5,&BUF[0])==0);		//存新的總電能
        }
    }
    if (TIME[1]==120) 								//等于1分鐘時  做電度數的處理
    {
        TIME[1]=0;
        for (k=0;k<=7;k++)							//8路電能循環轉換成電度數 存儲
        {
            while (page_rd(k*5,5,&BUF[0])==0);		//讀原來的電能 各路5位數字
            for (i=0;i<=4;i++)
            {
                BUF[i]=BUF[i]+ADBUF[i+k*5];			//本次的電能和原來的電能求和
            }
			while (page_wr(k*5,5,0)==0);  			//清寄存的電能
            kk=(ulong)BUF[0]*10000+(ulong)BUF[1]*1000+(ulong)BUF[2]*100+(ulong)BUF[3]*10+(ulong)BUF[4];
													// 把電能轉化為千瓦時 即度
			while(page_rd(100+k*2,2,&BUF[0])==0);	//讀上次余數 
			kk=kk*jishu+(ulong)BUF[0]*100+(ulong)BUF[1];//  (jishu*1000)/(10000*12*60)=jishu/7200
			kk1=kk/7200;             				//取電度數
			kk2=kk%7200;			                //kk1為電度數   kk2 余數			
			BUF[0]=(uchar)(kk2/100);                //分兩部分存儲電度的余數   100為界
			BUF[1]=(uchar)(kk2%100);
			while(page_wr(100+k*2,2,&BUF[0])==0);	//電度的存余數			
			
			
			while (page_rd(50+k*5,5,&BUF[0])==0);   //讀原來電度數
			kk1=kk1+(ulong)BUF[0]*10000+(ulong)BUF[1]*1000+(ulong)BUF[2]*100+(ulong)BUF[3]*10+(ulong)BUF[4];
													//原來的電度和新的電度數相加 
			BUF[0]=(uchar)(kk1/10000);             	//萬
			BUF[1]=(uchar)((kk1%10000)/1000);     	//千
			BUF[2]=(uchar)(((kk1%10000)%1000)/100); //百
			BUF[3]=(uchar)((kk1%100)/10);         	//十
			BUF[4]=(uchar)((kk1%100)%10);         	//個
			while(page_wr(50+k*5,5,&BUF[0])==0);    //存新電度數
			
			
			DISPBUF[0]=k+1;                         //顯示戶號
			DISPBUF[1]=0xf;                         //顯示2個F
			DISPBUF[2]=0xf;
			DISPBUF[3]=BUF[0];                      //顯示此時電度數
			DISPBUF[4]=BUF[1];
			DISPBUF[5]=BUF[2];
			DISPBUF[6]=BUF[3];                              
			DISPBUF[7]=BUF[4];
			Max7221Display(&DISPBUF[0]);			//送顯示	
			delay(20);								//延時
		}		
	}		
}

/*-----------------------------------------------
調用方式:void start_bit(void)
函數說明:開始位
-----------------------------------------------*/
void start_bit(void)
{
    SCL=1;_nop_();
    SDA=1;_nop_();
    SDA=0;_nop_();
    SCL=0;_nop_();
}
/*-----------------------------------------------
調用方式:void stop_bit(void)
函數說明:停止位
-----------------------------------------------*/
void stop_bit(void)
{
    SDA=0;_nop_();
    SCL=1;_nop_();
    SDA=1;_nop_();
}
/*-----------------------------------------------
調用方式:void mast_ack(void)
函數說明:主答函數
-----------------------------------------------*/
void mast_ack(void)
{
    SCL=0;_nop_();
    SDA=0;_nop_();
    SCL=1;_nop_();
    SCL=0;_nop_();
    SDA=1;_nop_();
}

/*-----------------------------------------------
調用方式:write_8bit(uchar ch)
函數說明:寫一個字節(8位)數據
-----------------------------------------------*/
bit write_8bit(uchar ch)
{
    uchar i=8;
    bit fan_w;
    SCL=0;_nop_();
    while (i--)
    {
        SDA=(bit)(ch&0x80);_nop_();
        ch<<=1;
        SCL=1;_nop_();
        SCL=0;_nop_();
    }
    SDA=1;_nop_();
    SCL=1;_nop_();
    fan_w=SDA;
    SCL=0;_nop_();
    return(fan_w);
}
/*----------------------------------------------
調用方式:uchar read24c16(uint address,uchar *shu)
函數說明:讀24c16指定地址數據(字節讀)
-----------------------------------------------*/
uchar read24c16(uint address,uchar *shu)
{
    uchar data rdata;
    uchar i=8;
    EA=0;//避免與串口通訊等中斷沖突
    start_bit();
    if (write_8bit(0xA0)!=0){
        stop_bit();EA=1;return(0);
    }
    if (write_8bit(address)!=0){
        stop_bit();EA=1;return(0);
    }
    start_bit();
    if (write_8bit(0xA1)!=0){
        stop_bit();EA=1;return(0);
    }
    while (i--)
    {
        rdata<<=1;
        SCL=1;_nop_();
        if (SDA) rdata|=0x01;
        SCL=0;_nop_();
    }
    stop_bit();
    EA=1;
    *shu=rdata;
    return (1);
}
/*-----------------------------------------------
調用方式:void write24c16(uint address,uchar ddata)
函數說明:寫數據到24c16的指定地址(字節寫)
-----------------------------------------------*/
uchar write24c16(uint address,uchar ddata)
{
    EA=0;  //避免與串口通訊等中斷沖突
    start_bit();
    if (write_8bit(0xA0)!=0){
        stop_bit();EA=1;return(0);
    }
    if (write_8bit(address)!=0){
        stop_bit();EA=1;return(0);
    }
    if (write_8bit(ddata)!=0){
        stop_bit();EA=1;return(0);
    }
    stop_bit();
    EA=1;
    return(1);
}
/*-----------------------------------------------
調用方式:void page_wr(uint firstw_ad,uint counter,uint data *firstr_ad)
函數說明:頁面寫函數,firstw_ad為寫入字節單元的首地址,
          *firstr-ad為被寫入數據所在首地址指針
          counter為寫入數據字節數
-----------------------------------------------*/
uchar page_wr(uint firstw_ad,uint counter,uchar *firstr_ad)
{
    uchar data *ufirstr_ad;
    ufirstr_ad=firstr_ad;
    start_bit();
    if (write_8bit(0xA0)!=0){
        stop_bit();return(0);
    }
    if (write_8bit(firstw_ad)!=0){
        stop_bit();return(0);
    }
    while (counter--)
    {
        if (write_8bit(*ufirstr_ad)!=0){
            stop_bit();return(0);
        }
        ufirstr_ad++;
    }
    stop_bit();
    return(1);
}
/*-----------------------------------------------
調用方式:void page_rd(uint firstrd_ad,uint count,uint firstwr_ad)
函數說明:頁面讀函數,firstrd-ad為所讀字節首地址,count為讀字節數
           *ufirstwr-ad為讀出數據存儲首地址指針
-----------------------------------------------*/
uchar page_rd(uint firstrd_ad,uint count,uchar *firstwr_ad)
{
    uchar j=8;
    uchar data *ufirstwr_ad;
    ufirstwr_ad=firstwr_ad;
    start_bit();
    if (write_8bit(0xA0)!=0){
        stop_bit();return(0);
    }
    if (write_8bit(firstrd_ad)!=0){
        stop_bit();return(0);
    }
    start_bit();
    if (write_8bit(0xA1)!=0){
        stop_bit();return(0);
    }
    while (count--)
    {
        uchar i=8;
        while (i--)
        {
            (*ufirstwr_ad)<<=1;
            SCL=1;_nop_();
            if (SDA) (*ufirstwr_ad)|=0x01;
            SCL=0; _nop_();
        }
        ufirstwr_ad++;
        mast_ack();
    }
    while (j--)
    {
        (*ufirstwr_ad)<<=1;
        SCL=0;_nop_();_nop_();SCL=1;
        if (SDA) (*ufirstwr_ad)|=0x01;
    }
    stop_bit();
    return(1);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人福利电影精品一区二区在线观看| 成人激情黄色小说| 国产欧美一区二区精品秋霞影院| 欧美96一区二区免费视频| 欧美精品粉嫩高潮一区二区| 性做久久久久久| 666欧美在线视频| 毛片av一区二区| 91精品国产综合久久久久久漫画 | 欧美日韩一区 二区 三区 久久精品| 欧美哺乳videos| 一区二区欧美在线观看| 亚洲国产精品99久久久久久久久| 成人免费视频在线观看| 免费三级欧美电影| 亚洲在线中文字幕| 精品久久久久av影院| 国产精品久久久久久久第一福利| 欧美一区二区三区男人的天堂| 欧美三级日韩在线| 欧美手机在线视频| 亚洲超丰满肉感bbw| 亚洲人成在线播放网站岛国| 成人黄色a**站在线观看| 激情久久五月天| 精品写真视频在线观看| 911精品产国品一二三产区| 色噜噜久久综合| 亚洲国产精品久久不卡毛片| 日韩视频在线观看一区二区| 91精品国产综合久久久蜜臀图片| 欧美一级二级在线观看| 日韩午夜电影av| 久久精品在线免费观看| 国产精品丝袜一区| 91色婷婷久久久久合中文| 亚洲成av人片在线观看无码| 视频一区视频二区中文| 日韩电影在线一区| 亚洲三级久久久| 久久久一区二区| 国产精品人成在线观看免费 | 亚洲aⅴ怡春院| 日本亚洲三级在线| 国产福利91精品一区二区三区| 国产亚洲欧洲997久久综合| 国产精品污网站| 亚洲v精品v日韩v欧美v专区| 久久国产精品色婷婷| 亚洲综合免费观看高清完整版| 天堂在线亚洲视频| 国产综合色视频| 色偷偷久久人人79超碰人人澡 | 日韩精品福利网| 国产精品资源在线| 欧美自拍丝袜亚洲| 精品久久久久久久久久久院品网| 亚洲欧洲三级电影| 免费成人美女在线观看| 国v精品久久久网| 欧美日本在线视频| 亚洲国产精品二十页| 香蕉av福利精品导航| 国产剧情一区二区| 欧美喷潮久久久xxxxx| 久久你懂得1024| 亚洲chinese男男1069| 成人小视频在线| 欧美v日韩v国产v| 亚洲综合在线免费观看| 国产传媒一区在线| 欧美精品第1页| 亚洲另类色综合网站| 韩国三级中文字幕hd久久精品| 色综合久久久久久久久久久| 日韩欧美一二三区| 日本欧美大码aⅴ在线播放| 色哟哟欧美精品| 日韩免费性生活视频播放| 亚洲曰韩产成在线| 91网站在线播放| 国产欧美一二三区| 精品一区二区影视| 欧美高清视频一二三区| 国产精品女主播在线观看| 国内一区二区视频| 欧美α欧美αv大片| 喷水一区二区三区| 在线不卡中文字幕| 天天色图综合网| 一本色道久久综合亚洲精品按摩| 久久免费看少妇高潮| 亚洲成人先锋电影| 欧美人妖巨大在线| 亚洲电影视频在线| 91麻豆精品国产自产在线| 亚洲高清免费观看| 欧美丰满美乳xxx高潮www| 亚洲尤物在线视频观看| 欧美日韩国产免费| 日本不卡123| 欧美一区二区三区四区视频| 蜜桃视频在线观看一区二区| 日韩一区二区三区精品视频| 青青草国产精品亚洲专区无| 欧美一区二区三区免费在线看| 日本亚洲电影天堂| 日韩欧美视频在线| 狠狠久久亚洲欧美| 国产欧美日韩在线观看| 成人午夜在线视频| 一区二区三区精品视频| 高清视频一区二区| 亚洲天堂av老司机| 欧美日韩精品一区二区天天拍小说| 性感美女极品91精品| 欧美一区二区成人6969| 国产精品1024久久| 亚洲欧美国产77777| 欧美日韩一区在线| 激情综合五月天| 国产精品久久久久久久午夜片| 色狠狠av一区二区三区| 无码av免费一区二区三区试看| 欧美区视频在线观看| 国产在线精品一区二区夜色| 中文字幕制服丝袜成人av| 欧美日韩中文字幕一区二区| 久久99在线观看| 一区二区中文字幕在线| 欧美一区二区三区在线| 波多野结衣亚洲一区| 亚洲精品欧美二区三区中文字幕| 色先锋久久av资源部| 国产成人欧美日韩在线电影 | 色综合久久久久久久| 人人精品人人爱| 国产精品蜜臀在线观看| 欧美日韩美女一区二区| 粉嫩高潮美女一区二区三区| 午夜婷婷国产麻豆精品| 欧美国产日韩一二三区| 欧美日韩电影在线| 成人黄色在线视频| 日本强好片久久久久久aaa| 中文字幕亚洲区| 精品美女被调教视频大全网站| 色哟哟国产精品免费观看| 国内精品免费**视频| 天堂精品中文字幕在线| 亚洲欧美另类小说视频| 久久久99免费| 欧美精品vⅰdeose4hd| 国产成人在线色| 国产美女视频91| 日本不卡高清视频| 一区二区高清视频在线观看| 亚洲国产精品激情在线观看| 欧美变态tickle挠乳网站| 欧美日韩精品高清| 色域天天综合网| 97精品久久久午夜一区二区三区| 国产一区在线不卡| 美女爽到高潮91| 日韩激情av在线| 亚洲成人三级小说| 一区av在线播放| 一区二区三区在线免费| 亚洲欧美日韩系列| 国产精品久久毛片av大全日韩| 欧美一区二区视频在线观看2020| 欧美中文字幕不卡| 麻豆精品在线看| 国产精一品亚洲二区在线视频| 久草在线在线精品观看| 久久精品国产亚洲高清剧情介绍| 免费在线欧美视频| 毛片基地黄久久久久久天堂| 蜜臀精品一区二区三区在线观看 | 亚洲国产成人午夜在线一区| 国产亚洲成aⅴ人片在线观看 | 国产一区二区三区最好精华液| 蜜臀av亚洲一区中文字幕| 久久国产综合精品| 久久99精品一区二区三区| 国产一二三精品| 国产一区二区三区免费观看| 国产馆精品极品| 不卡影院免费观看| 91极品视觉盛宴| 69堂精品视频| 日本一区二区视频在线| 亚洲色图色小说| 午夜成人在线视频| 裸体健美xxxx欧美裸体表演| 国产在线日韩欧美| 国产精品一二一区| 激情av综合网| 欧美日韩一区二区电影| 亚洲精品在线观|