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

蟲蟲首頁| 資源下載| 資源專輯| 精品軟件
登錄| 注冊

電能表設(shè)計(jì)

  • PIC單片機設計電子密碼鎖

    介紹用PIC16F84單片機制作的電子密碼鎖。PIC16F84單片機共18個引腳,13個可用I/O接口。芯片內有1K×14的FLASHROM程序存儲器,36×8的靜態RAM的通用寄存器,64×8的EEPROM的數據存儲器,8級深度的硬堆棧。 用PIC單片機設計的電子密碼鎖微芯公司生產的PIC8位COMS單片機,采用類RISC指令集和哈弗總線結構,以及先進的流水線時序,與傳統51單片機相比其在速度和性能方面更具優越性和先進性。PIC單片機的另一個優點是片上硬件資源豐富,集成常見的EPROM、DAC、PWM以及看門狗電路。這使得硬件電路的設計更加簡單,節約設計成本,提高整機性能。因此PIC單片機已成為產品開發,尤其是產品設計和研制階段的首選控制器。本文介紹用PIC16F84單片機制作的電子密碼鎖。PIC16F84單片機共18個引腳,13個可用I/O接口。芯片內有1K×14的FLASHROM程序存儲器,36×8的靜態RAM的通用寄存器,64×8的EEPROM的數據存儲器,8級深度的硬堆棧。硬件設計  電路原理見圖1。Xx8位數據線接4x4鍵盤矩陣電路,面板布局見表1,A、B、C、D為備用功能鍵。RA0、RA7輸出4組編碼二進制數據,經74LS139譯碼后輸出逐行掃描信號,送RB4-RB7列信號輸入端。余下半個139譯碼器動揚聲器。RB2接中功率三極管基極,驅動繼電器動作。有效密碼長度為4位,根據實際情況,可通過修改源程序增加密碼位數。產品初始密碼為3345,這是一隨機數,無特殊意義,目的是為防止被套解。用戶可按*號鍵修改密碼,按#號鍵結束。輸入密碼并按#號確認之后,腳輸出RB2腳輸出高電平,繼電器閉合,執行一次開鎖動作。  若用戶輸入的密碼正確,揚聲器發出一聲稍長的“滴”提示聲,若輸入的密碼與上次修改的不符,則發出短促的“滴”聲。連續3次輸入密碼錯誤之后,程序鎖死,揚聲器報警。直到CPU被復位或從新上電。軟件設計  軟件流程圖見圖3。CPU上電或復位之后將最近一次修改并保存到EEPROM的密碼讀出,最為參照密匙。然后等待用戶輸入開鎖密碼。若5分鐘以內沒有接受到用戶的任何輸入,CPU自動轉入掉電模式,用戶輸入任意值可喚醒CPU。每次修改密碼之后,CPU將新的密碼存入內部4個連續的EEPROM單元,掉電后該數據任有效。每執行一次開鎖指令,CPU將當前輸入密碼與該值比較,看是否真確,并給出相應的提示和控制。布     局  所有元件均使用SMD表貼封裝,縮小體積,便于產品安裝,60X60雙面PCB板,頂層是一體化輸入鍵盤,底層是元件層。成型后的產品體積小巧,能很方便的嵌入防盜鐵門、保險箱柜。

    標簽: PIC 單片機設計 電子密碼鎖

    上傳時間: 2013-10-31

    上傳用戶:uuuuuuu

  • 用單片機AT89C51改造普通雙桶洗衣機

    用單片機AT89C51改造普通雙桶洗衣機:AT89C2051作為AT89C51的簡化版雖然去掉了P0、P2等端口,使I/O口減少了,但是卻增加了一個電壓比較器,因此其功能在某些方面反而有所增強,如能用來處理模擬量、進行簡單的模數轉換等。本文利用這一功能設計了一個數字電容表,可測量容量小于2微法的電容器的容量,采用3位半數字顯示,最大顯示值為1999,讀數單位統一采用毫微法(nf),量程分四檔,讀數分別乘以相應的倍率。電路工作原理  本數字電容表以電容器的充電規律作為測量依據,測試原理見圖1。電源電路圖。 壓E+經電阻R給被測電容CX充電,CX兩端原電壓隨充電時間的增加而上升。當充電時間t等于RC時間常數τ時,CX兩端電壓約為電源電壓的63.2%,即0.632E+。數字電容表就是以該電壓作為測試基準電壓,測量電容器充電達到該電壓的時間,便能知道電容器的容量。例如,設電阻R的阻值為1千歐,CX兩端電壓上升到0.632E+所需的時間為1毫秒,那么由公式τ=RC可知CX的容量為1微法。  測量電路如圖2所示。A為AT89C2051內部構造的電壓比較器,AT89C2051 圖2 的P1.0和P1.1口除了作I/O口外,還有一個功能是作為電壓比較器的輸入端,P1.0為同相輸入端,P1.1為反相輸入端,電壓比較器的比較結果存入P3.6口對應的寄存器,P3.6口在AT89C2051外部無引腳。電壓比較器的基準電壓設定為0.632E+,在CX兩端電壓從0升到0.632E+的過程中,P3.6口輸出為0,當電池電壓CX兩端電壓一旦超過0.632E+時,P3.6口輸出變為1。以P3.6口的輸出電平為依據,用AT89C2051內部的定時器T0對充電時間進行計數,再將計數結果顯示出來即得出測量結果。整機電路見圖3。電路由單片機電路、電容充電測量電路和數碼顯示電路等 圖3 部分組成。AT89C2051內部的電壓比較器和電阻R2-R7等組成測量電路,其中R2-R5為量程電阻,由波段開關S1選擇使用,電壓比較器的基準電壓由5V電源電壓經R6、RP1、R7分壓后得到,調節RP1可調整基準電壓。當P1.2口在程序的控制下輸出高電平時,電容CX即開始充電。量程電阻R2-R5每檔以10倍遞減,故每檔顯示讀數以10倍遞增。由于單片機內部P1.2口的上拉電阻經實測約為200K,其輸出電平不能作為充電電壓用,故用R5兼作其上拉電阻,由于其它三個充電電阻和R5是串聯關系,因此R2、R3、R4應由標準值減去1K,分別為999K、99K、9K。由于999K和1M相對誤差較小,所以R2還是取1M。數碼管DS1-DS4、電阻R8-R14等組成數碼顯示電路。本機采用動態掃描顯示的方式,用軟件對字形碼譯碼。P3.0-P3.5、P3.7口作數碼顯示七段筆劃字形碼的輸出,P1.3-P1.6口作四個數碼管的動態掃描位驅動碼輸出。這里采用了共陰數碼管,由于AT89C2051的P1.3-P1.6口有25mA的下拉電流能力,所以不用三極管就能驅動數碼管。R8-R14為P3.0-P3.5、P3.7口的上拉電阻,用以驅動數碼管的各字段,當P3的某一端口輸出低電平時其對應的字段筆劃不點亮,而當其輸出高電平時,則對應的上拉電阻即能點亮相應的字段筆劃。

    標簽: 89C C51 AT 89

    上傳時間: 2013-12-31

    上傳用戶:ming529

  • PCB可測性設計布線規則之建議―從源頭改善可測率

    P C B 可測性設計布線規則之建議― ― 從源頭改善可測率PCB 設計除需考慮功能性與安全性等要求外,亦需考慮可生產與可測試。這里提供可測性設計建議供設計布線工程師參考。1. 每一個銅箔電路支點,至少需要一個可測試點。如無對應的測試點,將可導致與之相關的開短路不可檢出,并且與之相連的零件會因無測試點而不可測。2. 雙面治具會增加制作成本,且上針板的測試針定位準確度差。所以Layout 時應通過Via Hole 盡可能將測試點放置于同一面。這樣就只要做單面治具即可。3. 測試選點優先級:A.測墊(Test Pad) B.通孔(Through Hole) C.零件腳(Component Lead) D.貫穿孔(Via Hole)(未Mask)。而對于零件腳,應以AI 零件腳及其它較細較短腳為優先,較粗或較長的引腳接觸性誤判多。4. PCB 厚度至少要62mil(1.35mm),厚度少于此值之PCB 容易板彎變形,影響測點精準度,制作治具需特殊處理。5. 避免將測點置于SMT 之PAD 上,因SMT 零件會偏移,故不可靠,且易傷及零件。6. 避免使用過長零件腳(>170mil(4.3mm))或過大的孔(直徑>1.5mm)為測點。7. 對于電池(Battery)最好預留Jumper,在ICT 測試時能有效隔離電池的影響。8. 定位孔要求:(a) 定位孔(Tooling Hole)直徑最好為125mil(3.175mm)及其以上。(b) 每一片PCB 須有2 個定位孔和一個防呆孔(也可說成定位孔,用以預防將PCB反放而導致機器壓破板),且孔內不能沾錫。(c) 選擇以對角線,距離最遠之2 孔為定位孔。(d) 各定位孔(含防呆孔)不應設計成中心對稱,即PCB 旋轉180 度角后仍能放入PCB,這樣,作業員易于反放而致機器壓破板)9. 測試點要求:(e) 兩測點或測點與預鉆孔之中心距不得小于50mil(1.27mm),否則有一測點無法植針。以大于100mil(2.54mm)為佳,其次是75mil(1.905mm)。(f) 測點應離其附近零件(位于同一面者)至少100mil,如為高于3mm 零件,則應至少間距120mil,方便治具制作。(g) 測點應平均分布于PCB 表面,避免局部密度過高,影響治具測試時測試針壓力平衡。(h) 測點直徑最好能不小于35mil(0.9mm),如在上針板,則最好不小于40mil(1.00mm),圓形、正方形均可。小于0.030”(30mil)之測點需額外加工,以導正目標。(i) 測點的Pad 及Via 不應有防焊漆(Solder Mask)。(j) 測點應離板邊或折邊至少100mil。(k) 錫點被實踐證實是最好的測試探針接觸點。因為錫的氧化物較輕且容易刺穿。以錫點作測試點,因接觸不良導致誤判的機會極少且可延長探針使用壽命。錫點尤其以PCB 光板制作時的噴錫點最佳。PCB 裸銅測點,高溫后已氧化,且其硬度高,所以探針接觸電阻變化而致測試誤判率很高。如果裸銅測點在SMT 時加上錫膏再經回流焊固化為錫點,雖可大幅改善,但因助焊劑或吃錫不完全的緣故,仍會出現較多的接觸誤判。

    標簽: PCB 可測性設計 布線規則

    上傳時間: 2014-01-14

    上傳用戶:cylnpy

  • 驅動程序與應用程序的接口

    有兩種方式可以讓設備和應用程序之間聯系:1. 通過為設備創建的一個符號鏈;2. 通過輸出到一個接口WDM驅動程序建議使用輸出到一個接口而不推薦使用創建符號鏈的方法。這個接口保證PDO的安全,也保證安全地創建一個惟一的、獨立于語言的訪問設備的方法。一個應用程序使用Win32APIs來調用設備。在某個Win32 APIs和設備對象的分發函數之間存在一個映射關系。獲得對設備對象訪問的第一步就是打開一個設備對象的句柄。 用符號鏈打開一個設備的句柄為了打開一個設備,應用程序需要使用CreateFile。如果該設備有一個符號鏈出口,應用程序可以用下面這個例子的形式打開句柄:hDevice = CreateFile("\\\\.\\OMNIPORT3",  GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ,  NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ,NULL);文件路徑名的前綴“\\.\”告訴系統本調用希望打開一個設備。這個設備必須有一個符號鏈,以便應用程序能夠打開它。有關細節查看有關Kdevice和CreateLink的內容。在上述調用中第一個參數中前綴后的部分就是這個符號鏈的名字。注意:CreatFile中的第一個參數不是Windows 98/2000中驅動程序(.sys文件)的路徑。是到設備對象的符號鏈。如果使用DriverWizard產生驅動程序,它通常使用類KunitizedName來構成設備的符號鏈。這意味著符號鏈名有一個附加的數字,通常是0。例如:如果鏈接名稱的主干是L“TestDevice”那么在CreateFile中的串就該是“\\\\.\\TestDevice0”。如果應用程序需要被覆蓋的I/O,第六個參數(Flags)必須或上FILE_FLAG_OVERLAPPED。 使用一個輸出接口打開句柄用這種方式打開一個句柄會稍微麻煩一些。DriverWorks庫提供兩個助手類來使獲得對該接口的訪問容易一些,這兩個類是CDeviceInterface, 和 CdeviceInterfaceClass。CdeviceInterfaceClass類封裝了一個設備信息集,該信息集包含了特殊類中的所有設備接口信息。應用程序能有用CdeviceInterfaceClass類的一個實例來獲得一個或更多的CdeviceInterface類的實例。CdeviceInterface類是一個單一設備接口的抽象。它的成員函數DevicePath()返回一個路徑名的指針,該指針可以在CreateFile中使用來打開設備。下面用一個小例子來顯示這些類最基本的使用方法:extern GUID TestGuid;HANDLE OpenByInterface(  GUID* pClassGuid,  DWORD instance,  PDWORD pError){  CDeviceInterfaceClass DevClass(pClassGuid, pError);  if (*pError != ERROR_SUCCESS)    return INVALID_HANDLE_VALUE;  CDeviceInterface DevInterface(&DevClass, instance, pError);  if (*pError != ERROR_SUCCESS)    return INVALID_HANDLE_VALUE;  cout << "The device path is "    << DevInterface.DevicePath()    << endl;   HANDLE hDev;  hDev = CreateFile(   DevInterface.DevicePath(),    GENERIC_READ | GENERIC_WRITE,    FILE_SHARE_READ | FILE_SHARE_WRITE,    NULL,    OPEN_EXISTING,    FILE_ATTRIBUTE_NORMAL,    NULL  );  if (hDev == INVALID_HANDLE_VALUE)    *pError = GetLastError();  return hDev;} 在設備中執行I/O操作一旦應用程序獲得一個有效的設備句柄,它就能使用Win32 APIs來產生到設備對象的IRPs。下面的表顯示了這種對應關系。Win32 API  DRIVER_FUNCTION_xxxIRP_MJ_xxx  KDevice subclass member function CreateFile  CREATE  Create ReadFile  READ  Read WriteFile  WRITE  Write DeviceIoControl  DEVICE_CONTROL  DeviceControl CloseHandle  CLOSECLEANUP  CloseCleanUp 需要解釋一下設備類成員的Close和CleanUp:CreateFile使內核為設備創建一個新的文件對象。這使得多個句柄可以映射同一個文件對象。當這個文件對象的最后一個用戶級句柄被撤銷后,I/O管理器調用CleanUp。當沒有任何用戶級和核心級的對文件對象的訪問的時候,I/O管理器調用Close。如果被打開的設備不支持指定的功能,則調用相應的Win32將引起錯誤(無效功能)。以前為Windows95編寫的VxD的應用程序代碼中可能會在打開設備的時候使用FILE_FLAG_DELETE_ON_CLOSE屬性。在Windows NT/2000中,建議不要使用這個屬性,因為它將導致沒有特權的用戶企圖打開這個設備,這是不可能成功的。I/O管理器將ReadFile和WriteFile的buff參數轉換成IRP域的方法依賴于設備對象的屬性。當設備設置DO_DIRECT_IO標志,I/O管理器將buff鎖住在存儲器中,并且創建了一個存儲在IRP中的MDL域。一個設備可以通過調用Kirp::Mdl來存取MDL。當設備設置DO_BUFFERED_IO標志,設備對象分別通過KIrp::BufferedReadDest或 KIrp::BufferedWriteSource為讀或寫操作獲得buff地址。當設備不設置DO_BUFFERED_IO標志也不設置DO_DIRECT_IO,內核設置IRP 的UserBuffer域來對應ReadFile或WriteFile中的buff參數。然而,存儲區并沒有被鎖住而且地址只對調用進程有效。驅動程序可以使用KIrp::UserBuffer來存取IRP域。對于DeviceIoControl調用,buffer參數的轉換依賴于特殊的I/O控制代碼,它不在設備對象的特性中。宏CTL_CODE(在winioctl.h中定義)用來構造控制代碼。這個宏的其中一個參數指明緩沖方法是METHOD_BUFFERED, METHOD_IN_DIRECT, METHOD_OUT_DIRECT, 或METHOD_NEITHER。下面的表顯示了這些方法和與之對應的能獲得輸入緩沖與輸出緩沖的KIrp中的成員函數:Method  Input Buffer Parameter  Output Buffer Parameter METHOD_BUFFERED  KIrp::IoctlBuffer KIrp::IoctlBuffer METHOD_IN_DIRECT  KIrp::IoctlBuffer KIrp::Mdl METHOD_OUT_DIRECT  KIrp::IoctlBuffer KIrp::Mdl METHOD_NEITHER  KIrp::IoctlType3InputBuffer KIrp::UserBuffer 如果控制代碼指明METHOD_BUFFERED,系統分配一個單一的緩沖來作為輸入與輸出。驅動程序必須在向輸出緩沖放數據之前拷貝輸入數據。驅動程序通過調用KIrp::IoctlBuffer獲得緩沖地址。在完成時,I/O管理器從系統緩沖拷貝數據到提供給Ring 3級調用者使用的緩沖中。驅動程序必須在結束前存儲拷貝到IRP的Information成員中的數據個數。如果控制代碼不指明METHOD_IN_DIRECT或METHOD_OUT_DIRECT,則DeviceIoControl的參數呈現不同的含義。參數InputBuffer被拷貝到一個系統緩沖,這個緩沖驅動程序可以通過調用KIrp::IoctlBuffer。參數OutputBuffer被映射到KMemory對象,驅動程序對這個對象的訪問通過調用KIrp::Mdl來實現。對于METHOD_OUT_DIRECT,調用者必須有對緩沖的寫訪問權限。注意,對METHOD_NEITHER,內核只提供虛擬地址;它不會做映射來配置緩沖。虛擬地址只對調用進程有效。這里是一個用METHOD_BUFFERED的例子:首先,使用宏CTL_CODE來定義一個IOCTL代碼:#define IOCTL_MYDEV_GET_FIRMWARE_REV \CTL_CODE (FILE_DEVICE_UNKNOWN,0,METHOD_BUFFERED,FILE_ANY_ACCESS)現在使用一個DeviceIoControl調用:BOOLEAN b;CHAR FirmwareRev[60];ULONG FirmwareRevSize;b = DeviceIoControl(hDevice, IOCTL_MYDEV_GET_VERSION_STRING,  NULL, // no input  注意,這里放的是包含有執行操作命令的字符串指針  0, FirmwareRev,      //這里是output串指針,存放從驅動程序中返回的字符串。sizeof(FirmwareRev),& FirmwareRevSize,  NULL // not overlapped I/O );如果輸出緩沖足夠大,設備拷貝串到里面并將拷貝的資結束設置到FirmwareRevSize中。在驅動程序中,代碼看起來如下所示:const char* FIRMWARE_REV = "FW 16.33 v5";NTSTATUS MyDevice::DeviceControl( KIrp I ){  ULONG fwLength=0;  switch ( I.IoctlCode() )  {    case IOCTL_MYDEV_GET_FIRMWARE_REV:      fwLength = strlen(FIRMWARE_REV)+1;      if (I.IoctlOutputBufferSize() >= fwLength)      {        strcpy((PCHAR)I.IoctlBuffer(),FIRMWARE_REV);        I.Information() = fwLength;         return I.Complete(STATUS_SUCCESS);      }      else      {              }    case . . .   } }

    標簽: 驅動程序 應用程序 接口

    上傳時間: 2013-10-17

    上傳用戶:gai928943

  • mcs-51指令集

    MCS-51系列單片機指令A表MCS-51系列單片機指令d表MCS-51系列單片機指令c表MCS-51系列單片機指令i表MCS-51系列單片機指令j表MCS-51系列單片機指令l表MCS-51系列單片機指令m表MCS-51系列單片機指令n表MCS-51系列單片機指令i表MCS-51系列單片機指令s表MCS-51系列單片機指令x表

    標簽: mcs 51 指令集

    上傳時間: 2014-03-27

    上傳用戶:chengxin

  • 微型計算機課程設計論文—通用微機發聲程序的匯編設計

    微型計算機課程設計論文—通用微機發聲程序的匯編設計 本文講述了在微型計算機中利用可編程時間間隔定時器的通用發聲程序設計,重點講述了程序的發聲原理,節拍的產生,按節拍改變的動畫程序原理,并以設計一個簡單的樂曲評分程序為引子,分析程序設計的細節。關鍵字:微機 8253 通用發聲程序 動畫技術 直接寫屏 1. 可編程時間間隔定時器8253在通用個人計算機中,有一個可編程時間間隔定時器8253,它能夠根據程序提供的計數值和工作方式,產生各種形狀和各種頻率的計數/定時脈沖,提供給系統各個部件使用。本設計是利用計算機控制發聲的原理,編寫演奏樂曲的程序。    在8253/54定時器內部有3個獨立工作的計數器:計數器0,計數器1和計數器2,每個計數器都分配有一個斷口地址,分別為40H,41H和42H.8253/54內部還有一個公用的控制寄存器,端地址為43H.端口地址輸入到8253/54的CS,AL,A0端,分別對3個計數器和控制器尋址.     對8353/54編程時,先要設定控制字,以選擇計數器,確定工作方式和計數值的格式.每計數器由三個引腳與外部聯系,見教材第320頁圖9-1.CLK為時鐘輸入端,GATE為門控信號輸入端,OUT為計數/定時信號輸入端.每個計數器中包含一個16位計數寄存器,這個計數器時以倒計數的方式計數的,也就是說,從計數初值逐次減1,直到減為0為止.     8253/54的三個計數器是分別編程的,在對任一個計數器編程時,必須首先講控制字節寫入控制寄存器.控制字的作用是告訴8253/54選擇哪個計數器工作,要求輸出什么樣的脈沖波形.另外,對8253/54的初始化工作還包括,向選定的計數器輸入一個計數初值,因為這個計數值可以是8為的,也可以是16為的,而8253/5的數據總線是8位的,所以要用兩條輸出指令來寫入初值.下面給出8253/54初始化程序段的一個例子,將計數器2設定為方式3,(關于計數器的工作方式參閱教材第325—330頁)計數初值為65536.    MOV   AL,10110110B ;選擇計數器2,按方式3工作,計數值是二進制格式    OUT   43H,AL      ; j將控制字送入控制寄存器    MOV   AL,0        ;計數初值為0    OUT   42H,AL      ;將計數初值的低字節送入計數器2    OUT   42H,AL      ;將計數初值的高字節送入計數器2    在IBM PC中8253/54的三個時鐘端CLK0,CLK1和CLK2的輸入頻率都是1.1931817MHZ. PC機上的大多數I/O都是由主板上的8255(或8255A)可編程序外圍接口芯片(PPI)管理的.關于8255A的結構和工作原理及應用舉例參閱教材第340—373頁.教材第364頁的”PC/XT機中的揚聲器接口電路”一節介紹了揚聲器的驅動原理,并給出了通用發聲程序.本設計正是基于這個原理,通過編程,控制加到揚聲器上的信號的頻率,奏出樂曲的.2.發聲程序的設計下面是能產生頻率為f的通用發聲程序:MOV      AL, 10110110B   ;8253控制字:通道2,先寫低字節,后寫高字節        ;方式3,二進制計數OUT      43H, AL                  ;寫入控制字MOV      DX, 0012H               ;被除數高位MOV      AX, 35DEH              ;被除數低位 DIV      ID      ;求計數初值n,結果在AX中OUT      42H, AL     ;送出低8位MOV      AL, AHOUT      42H,AL     ;送出高8位IN      AL, 61H     ;讀入8255A端口B的內容MOV      AH, AL                  ;保護B口的原狀態OR  AL, 03H     ;使B口后兩位置1,其余位保留OUT 61H,AL     ;接通揚聲器,使它發聲

    標簽: 微型計算機 發聲程序 論文 微機

    上傳時間: 2013-10-17

    上傳用戶:sunjet

  • 用C51寫的普通拼音輸入法源程序代碼

    用C51寫的普通拼音輸入法源程序代碼:原作使用了一個二維數組用以查表,我認為這樣比較的浪費空間,而且每個字表的索引地址要手工輸入,效率不高。所以我用結構體將其改寫了一下。就是大家現在看到的這個。  因為代碼比較的大,共有6,000多漢字,這樣就得要12,000 byte來存放GB內碼,所以也是沒辦法的.編譯結果約為3000h,因為大部分是索引表,代碼優化幾乎無效。    在Keil C里仿真芯片選用的是華邦的W77E58,它有32k ROM, 256B on-chip RAM, 1K on-chip SRAM (用DPTR1指針尋址,相當于有1K的片上xdata)。條件有限,沒有上片試驗,仿真而已。  打算將其移植到AVR上,但CodeAVRC與IAR EC++在結構體、指針的定義使用上似乎與C51不太一樣,現在還未搞定。還希望在這方面有經驗的網友能給予指導。 #include<stdio.h> char * py_ime(char *); void main(void){ while(1)    {     char input_string[]="yI";     xdata char chinese_string[255];     sprintf(chinese_string,"%s",py_ime(input_string));    }}

    標簽: C51 拼音輸入法 代碼 源程序

    上傳時間: 2013-10-30

    上傳用戶:cainaifa

  • 匯編+保護模式+教程

    九.輸入/輸出保護為了支持多任務,80386不僅要有效地實現任務隔離,而且還要有效地控制各任務的輸入/輸出,避免輸入/輸出沖突。本文將介紹輸入輸出保護。 這里下載本文源代碼。 <一>輸入/輸出保護80386采用I/O特權級IPOL和I/O許可位圖的方法來控制輸入/輸出,實現輸入/輸出保護。 1.I/O敏感指令輸入輸出特權級(I/O Privilege Level)規定了可以執行所有與I/O相關的指令和訪問I/O空間中所有地址的最外層特權級。IOPL的值在如下圖所示的標志寄存器中。 標  志寄存器 BIT31—BIT18 BIT17 BIT16 BIT15 BIT14 BIT13—BIT12 BIT11 BIT10 BIT9 BIT8 BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 00000000000000 VM RF 0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF I/O許可位圖規定了I/O空間中的哪些地址可以由在任何特權級執行的程序所訪問。I/O許可位圖在任務狀態段TSS中。 I/O敏感指令 指令 功能 保護方式下的執行條件 CLI 清除EFLAGS中的IF位 CPL<=IOPL STI 設置EFLAGS中的IF位 CPL<=IOPL IN 從I/O地址讀出數據 CPL<=IOPL或I/O位圖許可 INS 從I/O地址讀出字符串 CPL<=IOPL或I/O位圖許可 OUT 向I/O地址寫數據 CPL<=IOPL或I/O位圖許可 OUTS 向I/O地址寫字符串 CPL<=IOPL或I/O位圖許可 上表所列指令稱為I/O敏感指令,由于這些指令與I/O有關,并且只有在滿足所列條件時才可以執行,所以把它們稱為I/O敏感指令。從表中可見,當前特權級不在I/O特權級外層時,可以正常執行所列的全部I/O敏感指令;當特權級在I/O特權級外層時,執行CLI和STI指令將引起通用保護異常,而其它四條指令是否能夠被執行要根據訪問的I/O地址及I/O許可位圖情況而定(在下面論述),如果條件不滿足而執行,那么將引起出錯碼為0的通用保護異常。 由于每個任務使用各自的EFLAGS值和擁有自己的TSS,所以每個任務可以有不同的IOPL,并且可以定義不同的I/O許可位圖。注意,這些I/O敏感指令在實模式下總是可執行的。 2.I/O許可位圖如果只用IOPL限制I/O指令的執行是很不方便的,不能滿足實際要求需要。因為這樣做會使得在特權級3執行的應用程序要么可訪問所有I/O地址,要么不可訪問所有I/O地址。實際需要與此剛好相反,只允許任務甲的應用程序訪問部分I/O地址,只允許任務乙的應用程序訪問另一部分I/O地址,以避免任務甲和任務乙在訪問I/O地址時發生沖突,從而避免任務甲和任務乙使用使用獨享設備時發生沖突。 因此,在IOPL的基礎上又采用了I/O許可位圖。I/O許可位圖由二進制位串組成。位串中的每一位依次對應一個I/O地址,位串的第0位對應I/O地址0,位串的第n位對應I/O地址n。如果位串中的第位為0,那么對應的I/O地址m可以由在任何特權級執行的程序訪問;否則對應的I/O地址m只能由在IOPL特權級或更內層特權級執行的程序訪問。如果在I/O外層特權級執行的程序訪問位串中位值為1的位所對應的I/O地址,那么將引起通用保護異常。 I/O地址空間按字節進行編址。一條I/O指令最多可涉及四個I/O地址。在需要根據I/O位圖決定是否可訪問I/O地址的情況下,當一條I/O指令涉及多個I/O地址時,只有這多個I/O地址所對應的I/O許可位圖中的位都為0時,該I/O指令才能被正常執行,如果對應位中任一位為1,就會引起通用保護異常。 80386支持的I/O地址空間大小是64K,所以構成I/O許可位圖的二進制位串最大長度是64K個位,即位圖的有效部分最大為8K字節。一個任務實際需要使用的I/O許可位圖大小通常要遠小于這個數目。 當前任務使用的I/O許可位圖存儲在當前任務TSS中低端的64K字節內。I/O許可位圖總以字節為單位存儲,所以位串所含的位數總被認為是8的倍數。從前文中所述的TSS格式可見,TSS內偏移66H的字確定I/O許可位圖的開始偏移。由于I/O許可位圖最長可達8K字節,所以開始偏移應小于56K,但必須大于等于104,因為TSS中前104字節為TSS的固定格式,用于保存任務的狀態。 1.I/O訪問許可檢查細節保護模式下處理器在執行I/O指令時進行許可檢查的細節如下所示。 (1)若CPL<=IOPL,則直接轉步驟(8);(2)取得I/O位圖開始偏移;(3)計算I/O地址對應位所在字節在I/O許可位圖內的偏移;(4)計算位偏移以形成屏蔽碼值,即計算I/O地址對應位在字節中的第幾位;(5)把字節偏移加上位圖開始偏移,再加1,所得值與TSS界限比較,若越界,則產生出錯碼為0的通用保護故障;(6)若不越界,則從位圖中讀對應字節及下一個字節;(7)把讀出的兩個字節與屏蔽碼進行與運算,若結果不為0表示檢查未通過,則產生出錯碼為0的通用保護故障;(8)進行I/O訪問。設某一任務的TSS段如下: TSSSEG                  SEGMENT PARA USE16                        TSS     <>             ;TSS低端固定格式部分                        DB      8 DUP(0)       ;對應I/O端口00H—3FH                        DB      10000000B      ;對應I/O端口40H—47H                        DB      01100000B      ;對用I/O端口48H—4FH                        DB      8182 DUP(0ffH) ;對應I/O端口50H—0FFFFH                        DB      0FFH           ;位圖結束字節TSSLen                  =       $TSSSEG                  ENDS 再假設IOPL=1,CPL=3。那么如下I/O指令有些能正常執行,有些會引起通用保護異常:                         in      al,21h  ;(1)正常執行                        in      al,47h  ;(2)引起異常                        out     20h,al  ;(3)正常實行                        out     4eh,al  ;(4)引起異常                        in      al,20h  ;(5)正常執行                        out     20h,eax ;(6)正常執行                        out     4ch,ax  ;(7)引起異常                        in      ax,46h  ;(8)引起異常                        in      eax,42h ;(9)正常執行 由上述I/O許可檢查的細節可見,不論是否必要,當進行許可位檢查時,80386總是從I/O許可位圖中讀取兩個字節。目的是為了盡快地執行I/O許可檢查。一方面,常常要讀取I/O許可位圖的兩個字節。例如,上面的第(8)條指令要對I/O位圖中的兩個位進行檢查,其低位是某個字節的最高位,高位是下一個字節的最低位。可見即使只要檢查兩個位,也可能需要讀取兩個字節。另一方面,最多檢查四個連續的位,即最多也只需讀取兩個字節。所以每次要讀取兩個字節。這也是在判別是否越界時再加1的原因。為此,為了避免在讀取I/O許可位圖的最高字節時產生越界,必須在I/O許可位圖的最后填加一個全1的字節,即0FFH。此全1的字節應填加在最后一個位圖字節之后,TSS界限范圍之前,即讓填加的全1字節在TSS界限之內。 I/O許可位圖開始偏移加8K所得的值與TSS界限值二者中較小的值決定I/O許可位圖的末端。當TSS的界限大于I/O許可位圖開始偏移加8K時,I/O許可位圖的有效部分就有8K字節,I/O許可檢查全部根據全部根據該位圖進行。當TSS的界限不大于I/O許可位圖開始偏移加8K時,I/O許可位圖有效部分就不到8K字節,于是對較小I/O地址訪問的許可檢查根據位圖進行,而對較大I/O地址訪問的許可檢查總被認為不可訪問而引起通用保護故障。因為這時會發生字節越界而引起通用保護異常,所以在這種情況下,可認為不足的I/O許可位圖的高端部分全為1。利用這個特點,可大大節約TSS中I/O許可位圖占用的存儲單元,也就大大減小了TSS段的長度。 <二>重要標志保護輸入輸出的保護與存儲在標志寄存器EFLAGS中的IOPL密切相關,顯然不能允許隨便地改變IOPL,否則就不能有效地實現輸入輸出保護。類似地,對EFLAGS中的IF位也必須加以保護,否則CLI和STI作為敏感指令對待是無意義的。此外,EFLAGS中的VM位決定著處理器是否按虛擬8086方式工作。 80386對EFLAGS中的這三個字段的處理比較特殊,只有在較高特權級執行的程序才能執行IRET、POPF、CLI和STI等指令改變它們。下表列出了不同特權級下對這三個字段的處理情況。 不同特權級對標志寄存器特殊字段的處理 特權級 VM標志字段 IOPL標志字段 IF標志字段 CPL=0 可變(初POPF指令外) 可變 可變 0  不變 不變 可變 CPL>IOPL 不變 不變 不變 從表中可見,只有在特權級0執行的程序才可以修改IOPL位及VM位;只能由相對于IOPL同級或更內層特權級執行的程序才可以修改IF位。與CLI和STI指令不同,在特權級不滿足上述條件的情況下,當執行POPF指令和IRET指令時,如果試圖修改這些字段中的任何一個字段,并不引起異常,但試圖要修改的字段也未被修改,也不給出任何特別的信息。此外,指令POPF總不能改變VM位,而PUSHF指令所壓入的標志中的VM位總為0。 <三>演示輸入輸出保護的實例(實例九)下面給出一個用于演示輸入輸出保護的實例。演示內容包括:I/O許可位圖的作用、I/O敏感指令引起的異常和特權指令引起的異常;使用段間調用指令CALL通過任務門調用任務,實現任務嵌套。 1.演示步驟實例演示的內容比較豐富,具體演示步驟如下:(1)在實模式下做必要準備后,切換到保護模式;(2)進入保護模式的臨時代碼段后,把演示任務的TSS段描述符裝入TR,并設置演示任務的堆棧;(3)進入演示代碼段,演示代碼段的特權級是0;(4)通過任務門調用測試任務1。測試任務1能夠順利進行;(5)通過任務門調用測試任務2。測試任務2演示由于違反I/O許可位圖規定而導致通用保護異常;(6)通過任務門調用測試任務3。測試任務3演示I/O敏感指令如何引起通用保護異常;(7)通過任務門調用測試任務4。測試任務4演示特權指令如何引起通用保護異常;(8)從演示代碼轉臨時代碼,準備返回實模式;(9)返回實模式,并作結束處理。

    標簽: 匯編 保護模式 教程

    上傳時間: 2013-12-11

    上傳用戶:nunnzhy

  • 單片機在工業無線網絡中的具體應用

     如同今天的許多通用單片機(MCU)已經把USB、CAN和以太網作為標準外設集成在芯片內部一樣,越來越多的無線網絡芯片和無線網絡解決方案也在向集成SoC 方向發展,比如第一代產品,Nordic公司nRF905,Chipcon公司cc1010 他們集成了8051兼容的單片機.這些無線單片機適合一般的點對點和點對多點的私有網絡應用,如單一產品的遙控器和抄表裝置等。無線通訊技術給智能裝置的互連互通提供了便捷的途徑,工業無線網絡作為面向工業和家庭自動化的網絡技術也正在向著智能,標準和節能方向發展。  目前在工業控制和消費電子領域使用的無線網絡技術有ZigBee、無線局域網(Wi-Fi)、藍牙(Blutooth)、GPRS通用分組無線業務、 ISM、IrDA等, 未來還能有3G、超寬頻(UWB)、無線USB、Wimax等。 當然還有大量的私有和專用無線網絡在工業控制和消費電子裝置中使用,其中ZigBee、GPRS是在目前在國內工業控制中討論和使用比較多的兩種,藍牙和無線局域網是在消費電子產品如手機、耳機、打印機、照相機和家庭中小企業網絡中廣泛使用的無線協議(個別工業產品也有應用,如無線視頻監控和汽車音響系統),當然私有無線網絡技術和產品在工業也有很多的應用。  ZigBee是一個低功耗、短距離和低速的無線網絡技術,工作在2.4GHz國際免執照的頻率,在IEEE標準上它和無線局域網、藍牙同屬802家族中的無線個人區域網絡, ZigBee是有兩部分組成,物理和鏈路層符合IEEE802.15.4, 網絡和應用層符合ZigBee聯盟的規范。ZigBee聯盟是在2002年成立的非盈利組織,有包括TI、霍尼威爾、華為在內兩百多家成員, ZigBee聯盟致力推廣兼容802.15.4和ZigBee協議的平臺, 制定網絡層和應用架構的公共規范,希望在樓宇自動化、居家控制、家用電器、工業自動控制和電腦外設等多方面普及ZigBee標準。  GPRS是在現有的GSM 網絡發展出來的分組數據承載業務,它工作在標準的GSM頻率,由于是一個分組交換系統,它適合工業上的突發,少量的數據傳輸,還因為GSM網絡覆蓋廣泛,永遠在線的特點,GPRS特點適合工業控制中的遠程監控和測量系統。在工業控制應用中GPRS 芯片一般是以無線數傳模塊形式出現的,它通過RS232全雙工接口和單片機連接,軟件上這些模塊都內置了GPRS,PPP和TCP/IP協議,單片機側通過AT指令集向模塊發出測試,連接和數據收發指令,GPRS模塊通過中國移動cmnet進入互聯網和其他終端或者服務器通訊。目前市場常見的模塊有西門子G24TC45、TC35i,飛思卡爾G24,索愛GR47/48, 還有Wavecom 的集成了ARM9核的GPRS SoC模塊WMP50/100。GPRS模塊有區分自帶TCP/IP協議和不帶協議兩種,一般來講,如果是單片機側有嵌入式操作系統和TCP/IP協議支持的話或者應用的要求只是收發短信和語音功能的話,可以選擇不帶協議的模塊。  先進的SoC技術正在無線應用領域發揮重要的作用。德州儀器收購了Chipcon公司以后發布的CC2430 是市場上首款SoC的ZigBee單片機, 見圖1,它把協議棧z-stack集成在芯片內部的閃存里面, 具有穩定可靠的CC2420收發器,增強性的8051內核,8KRAM,外設有I/O 口,ADC,SPI,UART 和AES128 安全協處理器,三個版本分別是32/64/128K的閃存,以128K為例,扣除基本z-stack協議還有3/4的空間留給應用代碼,即使完整的ZigBee協議,還有近1/2的空間留給應用代碼,這樣的無線單片機除了處理通訊協議外,還可以完成一些監控和顯示任務。這樣無線單片機都支持通過SPI或者UART與通用單片機或者嵌入式CPU結合。 2008年4月發表CC2480新一代單片ZibBee認證處理器就展示出和TI MSP430 通用的低功耗單片機結合的例子。圖1 CC2430應用電路  工業控制領域的另一個芯片巨頭——飛思卡爾的單片ZigBee處理器MC1321X的方案也非常類似,集成了HC08單片機核心, 16/32/64K 閃存,外設有GPIO, I2C和ADC, 軟件是Beestack 協議,只是最多4K RAM 對于更多的任務顯得小了些。但是憑借32位單片機Coldfire和系統軟件方面經驗和優勢, 飛思卡爾在滿足用戶應用的彈性需求方面作的更有特色,它率先能夠提供從低-中-高各個層面的解決方案,見圖2。

    標簽: 單片機 工業無線網絡

    上傳時間: 2013-11-02

    上傳用戶:momofiona

  • c8051f040/c8051f041/c8051f042/

    C8051F040/1/2/3/4/5/6/7混合信號ISP FLASH 微控制器數 據 手 冊 C8051F04x 系列器件是完全集成的混合信號片上系統型MCU,具有64 個數字I/O 引腳(C8051F040/2/4/6)或32 個數字I/O 引腳(C8051F041/3/5/7),片內集成了一個CAN2.0B 控制器。下面列出了一些主要特性;有關某一產品的具體特性參見表1.1。􀁹 高速、流水線結構的8051 兼容的CIP-51 內核(可達25MIPS)􀁹 控制器局域網(CAN2.0B)控制器,具有32 個消息對象,每個消息對象有其自己的標識􀁹 全速、非侵入式的在系統調試接口(片內)􀁹 真正12 位(C8051F040/1)或10 位(C8051F042/3/4/5/6/7)、100 ksps 的ADC,帶PGA 和8 通道模擬多路開關􀁹 允許高電壓差分放大器輸入到12/10 位ADC(60V 峰-峰值),增益可編程􀁹 真正8 位500 ksps 的ADC,帶PGA 和8 通道模擬多路開關(C8051F040/1/2/3)􀁹 兩個12 位DAC,具有可編程數據更新方式(C8051F040/1/2/3)􀁹 64KB(C8051F040/1/2/3/4/5)或32KB(C8051F046/7)可在系統編程的FLASH 存儲器􀁹 4352(4K+256)字節的片內RAM􀁹 可尋址64KB 地址空間的外部數據存儲器接口􀁹 硬件實現的SPI、SMBus/ I2C 和兩個UART 串行接口􀁹 5 個通用的16 位定時器􀁹 具有6 個捕捉/比較模塊的可編程計數器/定時器陣列􀁹 片內看門狗定時器、VDD 監視器和溫度傳感器具有片內VDD 監視器、看門狗定時器和時鐘振蕩器的C8051F04x 系列器件是真正能獨立工作的片上系統。所有模擬和數字外設均可由用戶固件使能/禁止和配置。FLASH 存儲器還具有在系統重新編程能力,可用于非易失性數據存儲,并允許現場更新8051 固件。片內JTAG 調試電路允許使用安裝在最終應用系統上的產品MCU 進行非侵入式(不占用片內資源)、全速、在系統調試。該調試系統支持觀察和修改存儲器和寄存器,支持斷點、觀察點、單步及運行和停機命令。在使用JTAG 調試時,所有的模擬和數字外設都可全功能運行。每個MCU 都可在工業溫度范圍(-45℃到+85℃)工作,工作電壓為2.7 ~ 3.6V。端口I/O、/RST和JTAG 引腳都容許5V 的輸入信號電壓。C8051F040/2/4/6 為100 腳TQFP 封裝(見圖1.1 和圖1.3的框圖)。C8051F041/3/5/7 為64 腳TQFP 封裝(見圖1.2 和圖1.4 的框圖)。

    標簽: 8051 040 041 042

    上傳時間: 2013-10-24

    上傳用戶:hwl453472107

主站蜘蛛池模板: 黄大仙区| 迭部县| 南开区| 萨迦县| 砚山县| 兴城市| 海兴县| 渑池县| 玛纳斯县| 旬阳县| 五台县| 嵊州市| 扶风县| 长武县| 什邡市| 徐州市| 海兴县| 鄄城县| 左贡县| 深水埗区| 济宁市| 江山市| 宜兰市| 颍上县| 藁城市| 磐安县| 湾仔区| 海林市| 清水县| 建平县| 调兵山市| 县级市| 衡东县| 新邵县| 临安市| 原平市| 共和县| 彭州市| 湘潭市| 保亭| 随州市|