国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

查看: 17591|回復(fù): 30
打印 上一主題 下一主題

51 模擬spi的程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2009-7-10 10:01:29 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
關(guān)鍵詞: spi , 程序 , 模擬
file:///C:/DOCUME%7E1/wang/LOCALS%7E1/Temp/moz-screenshot.jpg#include "upsd.h"        
#define uchar unsigned char
#define uint unsigned int

#define WREN 0x06        // 寫(xiě)使能鎖存指令
#define RDSR 0x05        // 讀狀態(tài)寄存器指令
#define WRSR 0x01        // 寫(xiě)狀態(tài)寄存器指令
#define READ 0x03        // 讀存儲(chǔ)器陣列指令
#define WRITE 0x02        // 寫(xiě)存儲(chǔ)器陣列指令
sbit _CS = P1^0;            // SPI總線的片選信號(hào)線
sbit SCK = P1^1;            // SPI總線的鐘信號(hào)線
sbit SI = P1^2;            // SPI總線的串行數(shù)據(jù)輸入線
sbit SO = P1^3;            // SPI總線的串行數(shù)據(jù)輸出線
#define BUFFSIZE 16
uchar readbuff[BUFFSIZE],writebuff[BUFFSIZE];    // 讀寫(xiě)緩沖區(qū)
/*從SPI總線上讀入一個(gè)字節(jié)*/
uchar read(void)
{
    uchar data i,inData;
    for(i=0; i<8; i++)        // 移8次
    {   
        SCK = 0;        // 拉低時(shí)鐘線
        inData <<= 1;   
        inData |= SO;    // 從SPI總線的數(shù)據(jù)輸出線SO上讀入一位
        SCK = 1;        // 拉高時(shí)鐘線
    }
    return(inData);
}
/*輸出一個(gè)字節(jié)到SPI總線上*/
void write(uchar outData)
{
    uchar data i;
    for(i=0; i<8; i++)        // 移8次
    {
        SCK = 0;   
        outData <<= 1;
        SI = CY;            // 移出一位,送出至SPI總線的數(shù)據(jù)輸入線SI上
        SCK = 1;
    }
}/*讀SPI器件的狀態(tài)*/
uchar readSR(void)
{
    uchar data SR_Data;
    _CS = 0;                // 選中器件
    write(RDSR);            // 發(fā)送讀狀態(tài)寄存器指令
    SR_Data = read();        // 得狀態(tài)值
    _CS = 1;                // 取消對(duì)器件的選定
    return(SR_Data);        // 送回狀態(tài)值
}
/*寫(xiě)SPI器件的狀態(tài)寄存器*/
void writeSR(uchar SR_Data) /*可以改變SPI器件看門(mén)狗時(shí)間,設(shè)定受保護(hù)陣列范圍*/
{
    _CS = 0;
    write(WREN);         // 發(fā)送使能鎖存指令
    _CS = 1;
    _CS = 0;
    write(WRSR);         // 發(fā)送寫(xiě)狀態(tài)寄存器指令
    write(SR_Data);        // 寫(xiě)入狀態(tài)值
    _CS = 1;     
}
/*將一串?dāng)?shù)據(jù)寫(xiě)入指定的EEPROM陣列地址*/
void writeEEPROM(uint addr,len)
{
    uchar data i,com;
    _CS = 0;
    write(WREN);         //發(fā)送使能鎖存指令
    _CS = 1;
    _CS = 0;
    com = (addr>>8) & 0x08 | WRITE;    DPL = addr;
    write(com);            // 發(fā)送讀命令和目標(biāo)地址的最高位A8
    write(DPL);            // 發(fā)送地址的低8位
    for(i=0; i);// 寫(xiě)字符串到X5043
    _CS=1;
   
}
/*從指定的EEPROM陣列地址讀出一串?dāng)?shù)據(jù)*/
void readEEPROM(uint addr,len)
{
    uchar data i,com;   
    _CS = 0;
    com = (addr>>8) & 0x08 | READ;    DPL = addr;
    write(com);        // 發(fā)送讀命令和目標(biāo)地址的最高位A8
    write(DPL);        // 發(fā)送地址的低8位
    for(i=0; i=read();// 讀入字符串
    _CS = 1;
}
//**************************************************************************************************
xdata uchar    CONTROL_B _at_ 0x803;
xdata uchar    DATAOUT_B _at_ 0x805;
xdata uchar    DIRECTION_B    _at_ 0x807;
uchar position;        // LED的位碼存儲(chǔ)單元
uchar a[8];            // 8字節(jié)長(zhǎng)顯示緩沖區(qū)
uchar *disp_ptr;        // 顯示緩沖區(qū)的指針
uchar code led_code[11] = {0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff};   
//數(shù)字碼表0-9,LED無(wú)顯示時(shí)對(duì)應(yīng)碼值為0xff
/********LED顯示的初始化********/
void led_init(void)            
{
    CONTROL_B = 0;            
    DATAOUT_B = 0;            
    DIRECTION_B = 0xff;        
    position = 0x80;        
    disp_ptr = &a;            
}
/*1位LED顯示,并更新位碼和顯示緩沖指針*/   
void display(void)            
{   
    P4 = 0xff;               
    DATAOUT_B = position;            
    position = position>>1;            
    if(position == 0) position = 0x80;
    P4 = led_code[*disp_ptr++];        
    if(position == 0x80) disp_ptr = &a;        
}
/*將一個(gè)無(wú)符號(hào)型整數(shù)的每位數(shù)據(jù)分別裝載到顯示緩沖區(qū)*/
void loadbuff(uint sum)
{
    a[0] = sum/10000;    a[1] = (sum%10000)/1000;
    a[2] = (sum%1000)/100;    a[3] = (sum%100)/10;
    a[4] = sum%10;    a[5] = 10; a[6] = 10;a[7] = 10;
}
//***************************************************************************************
#define TIMER0_COUNT 0xf8CD
            // TH0=0xf8,TL0=0xcd,在11.0592MHz的晶振頻率下,可實(shí)現(xiàn)2ms的計(jì)數(shù)
bit timer0int;        // 2ms定時(shí)的標(biāo)志位
/**********初始化定時(shí)器0**********/
void timer0_init(void)        
{
    TMOD &= 0xf0;
    TMOD |= 0x01;            
    TL0 = (TIMER0_COUNT & 0x00ff);   
    TH0 = (TIMER0_COUNT >> 8);   
    PT0 = 0;            
    ET0 = 1;               
    TR0 = 1;            
    timer0int = 0;            
}
/*定時(shí)器0的中斷服務(wù)程序,每次中斷置中斷標(biāo)志位*/
void timer0isr(void) interrupt 1                        
{   
    TL0 = TL0 + (TIMER0_COUNT & 0x00FF);   
    TH0 = TH0 + (TIMER0_COUNT >> 8);   
     timer0int = 1;            
}
//***************************************************
bit okflag;            // 外部脈沖計(jì)數(shù)加一標(biāo)志
void int0_init(void)
{
    IT0 = 1;            // 邊沿觸發(fā)
     EX0 = 1;
    EA  = 1;            // 允許所有中斷源
    okflag = 0;
}   
void int0isr(void) interrupt 0     
{
     okflag = 1;
}   
//***********************************************************************
main()
{   
    uchar i = 0;uint sum;   
    WDKEY = 0x55;    // 關(guān)看門(mén)狗定時(shí)器
    writeSR(0x10);    // 初始化X5043的狀態(tài)寄存器
    while((readSR()&0x01) == 1);    // 等待X5043的非易失性寫(xiě)完成
    readEEPROM(0x00,2);        // 讀入0x00和x01兩個(gè)單元的內(nèi)容
    if((readbuff[0] == 0x55) && (readbuff[1] == 0xaa))
    {    // 如果分別為0x55和0xaa,說(shuō)明已經(jīng)初始化過(guò)該芯片
        readEEPROM(0x02,2);        // 讀出0x02和0x03兩個(gè)單元的內(nèi)容
        sum = ((uint)readbuff[0]<<8)+readbuff[1];
            // 根據(jù)0x02和0x03兩個(gè)單元的內(nèi)容初始化計(jì)數(shù)值
    }
    else
    {        // 否則對(duì)芯片進(jìn)行初始化
        sum=0;    // 初始化計(jì)數(shù)值為0
        writebuff[0]=0x55;writebuff[1]=0xaa;        //設(shè)定初始化標(biāo)記為0x55,0xaa
        writebuff[2]=0;writebuff[3]=0;        // 初始化0x02和0x03兩個(gè)單元的內(nèi)容
        writeEEPROM(0x00,4);         // 寫(xiě)入初始化的設(shè)定字符串
    }
    loadbuff(sum);   
    led_init();   
    timer0_init();   
    int0_init();
    for(;;)
    {
        if(timer0int)
        {
            timer0int=0;
            display();        // 每2ms顯示一位LED
            if(okflag)            // 如果脈沖計(jì)數(shù)值加一
            {
                if((readSR()&0x01)!=1)    // X5043可寫(xiě)
                {
                    okflag=0;         // 清除okflag標(biāo)志
                    sum++;            // 計(jì)數(shù)加一   
                    writebuff[0]=sum>>8;    writebuff[1]=sum;   
                    writeEEPROM(0x02,2);        // 發(fā)送新的計(jì)數(shù)值
                    loadbuff(sum);        // 裝載顯示緩沖
                }
            }   
        }
    }
}
沙發(fā)
 樓主| 發(fā)表于 2009-7-10 10:02:22 | 只看該作者
源碼 rar文件。

C51-SPI.rar

2.53 KB, 下載積分: 積分 -1

板凳
發(fā)表于 2009-7-10 10:22:18 | 只看該作者
頂老王
地板
發(fā)表于 2009-7-10 11:06:00 | 只看該作者
路過(guò)~,頂一下。
地下室
發(fā)表于 2009-7-10 12:26:13 | 只看該作者
頂上,樓主辛苦
6
 樓主| 發(fā)表于 2009-7-10 15:19:32 | 只看該作者
這個(gè)是俺搜出來(lái)的,寫(xiě)的最規(guī)范的。非原創(chuàng)。
7
發(fā)表于 2009-7-10 21:55:02 | 只看該作者
8
發(fā)表于 2009-7-12 17:21:17 | 只看該作者
頑強(qiáng)地路過(guò),并頂之
9
發(fā)表于 2010-7-2 17:55:03 | 只看該作者
好咚咚
10
 樓主| 發(fā)表于 2010-7-2 19:14:09 | 只看該作者
我靠,挖墳啊。
不過(guò),這個(gè)問(wèn)題,很多人多次問(wèn)過(guò)。
11
發(fā)表于 2010-7-11 11:51:04 | 只看該作者
謝謝啦
12
 樓主| 發(fā)表于 2010-7-12 09:30:19 | 只看該作者
13
發(fā)表于 2010-7-12 10:19:56 | 只看該作者
謝謝,受用了
14
發(fā)表于 2010-7-20 14:42:38 | 只看該作者
頂起來(lái)!!
15
發(fā)表于 2010-8-17 10:34:23 | 只看該作者
看看,學(xué)習(xí)下!
16
發(fā)表于 2010-9-6 16:49:27 | 只看該作者
頂起
17
發(fā)表于 2010-9-22 17:29:17 | 只看該作者
學(xué)習(xí)一下。
18
發(fā)表于 2010-9-26 15:49:19 | 只看該作者
不錯(cuò)!頂
19
發(fā)表于 2010-10-11 20:45:10 | 只看該作者
thanks
20
發(fā)表于 2010-10-14 15:16:26 | 只看該作者
模擬的SPI讓我頭疼,顯示接口的SPI操作不關(guān)定時(shí)器中斷就不行,不然會(huì)顯示亂碼,沒(méi)辦法!

本版積分規(guī)則

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日本二级黄色片| 热久久视久久精品18国产| 日本高清在线播放| 台湾黄色毛片| 青青草狠狠干| 奇米影视777狠狠狠888不卡| 一本久道久久综合多人| 日韩欧美不卡片| 亚洲综合中文| 日韩专区亚洲精品欧美专区| 午夜精品在线观看| 一级大片视频| 欧美激情一二区| 青青青激情视频在线最新| 亚洲一区二区在线播放| 亚洲第一永久色| 一级高清理论片| 欧美一区二区手机在线观看视频| 天天天天天操| 一级a美女毛片| 亚洲精品乱码蜜桃久久久| 四虎tv| 欧美日韩在线高清| 日本高清天码一区在线播放| 亚洲黄色激情网| 日本福利一区二区| 日韩欧美网| 亚洲第一福利网站| 亚洲六区| 亚洲91精品麻豆国产系列在线| 欧美日韩国产最新一区二区| 亚洲美女毛片| 欧美天天性| 日b免费视频| 人妖videosex人妖xxx| 日本三级网络| 亚洲综合精品香蕉久久网97| 欧美成人怡春院在线激情| 亚洲第一页乱| 日韩成人黄色| 色综合久久综合|