[QL200]软件模拟93LC46B读写程序[PIC16F877A+汇编]
93C46-93c06-93c56-93c66-93c86的驱动程序(C51)
93C46/93c06/93c56/93c66/93c86的驱动程序(C51)/*————————————————————〖说明〗SPI总线驱动程序包括的普通封装标准模式,特殊封装标准模式默认的晶振。
〖文件〗﹫2003/5/12—————————————————————*//*通用93c06-93c86系列使用说明93c06=93c4693c56=93c6693c76=93c86dipx 可以自行定义*/#include ““#include ““/*-----------------------------------------------------SPI 93cXX系列时序函数调用(普通封装)调用方式:自行定义﹫2001/05/12函数说明:私有函数,封装各接口定义-----------------------------------------------------*/#define di_93 dip3#define sk_93 dip2#define cs_93 dip1#define do_93 dip4#define gnd_93 dip5#define org_93 dip6sbit cs_93=P1 ;sbit sk_93=P1;sbit di_93=P1;sbit do_93=P1;sbit org_93=P0;/*-----------------------------------------------------SPI93cXX系列时序函数调用(普通封装)调用方式:void high46(void) ---高8位函数调用void low46(void) ---低8位函数调用﹫2001/05/12函数说明:私有函数,SPI专用93c46普通封装驱动程序-----------------------------------------------------*/void high46(void){di_93=1;sk_93=1; _nop_();sk_93=0;_nop_();}void low46(void){di_93=0;sk_93=1;_nop_();sk_93=0;_nop_();}void wd46(unsigned char dd) {unsigned char i;for (i=0;i=0x80) high46(); else low46();dd=dd=0x80) high46a(); else low46a();dd=dd>1;address=address|0x80; address=address|0x80;high46();wd46(address);dat1=rd46();dat0=rd46();cs_93=0;dat=dat1*256 dat0;return(dat);}bit write93c46_word(unsigned char address,unsigned int dat) {unsigned char e,temp=address;e=0;while (e>=1;//??address|=0x40;wd46(address);wd46(dat/256);wd46(dat%6);cs_93=0;_nop_();cs_93=1;time=0;do_93=1;while (1){if (do_93==1) break;if (time>20) break;}cs_93=0;if (read93c46_word(temp)==dat)return(0);}e ;}return(1);}/*-----------------------------------------------------SPI93c57系列函数调用(举例)调用方式:bit write93c57_word(unsigned int address,unsigned int dat) ﹫2001/05/12函数说明:私有函数,SPI专用-----------------------------------------------------*/void ewen57(void){_nop_();cs_93=1;dip7=0;high46();low46();wd46(0x60);cs_93=0;unsigned int read93c57_word(unsigned int address){unsigned int dat;unsigned char dat0,dat1;gnd_93=0;cs_93=sk_93=0;org_93=1;cs_93=1;address=address>>1;high46();high46();wd46(address);dat1=rd46();dat0=rd46();cs_93=0;dat=dat1*256 dat0;return(dat);}bit write93c57_word(unsigned int address,unsigned int dat) {unsigned char e;unsigned int temp=address;e=0;while (e>=1;address|=0x80;wd46(address);wd46(dat/256);wd46(dat%6);cs_93=0;_nop_();cs_93=1;time=0;do_93=1;while (1){if (do_93==1) break;if (time>20) break;}cs_93=0;if (read93c57_word(temp)==dat) {return(0);}e ;}return(1);}/*-----------------------------------------------------SPI93c56系列函数调用(举例)调用方式:bit write93c56_word(unsigned int address,unsigned int dat) ﹫2001/05/12函数说明:私有函数,SPI专用-----------------------------------------------------*/void ewen56(void){_nop_();cs_93=1;high46();low46();low46();wd46(0xc0);cs_93=0;}unsigned int read93c56_word(unsigned char address){unsigned int dat;unsigned char dat0,dat1;gnd_93=0;cs_93=sk_93=0;org_93=1;cs_93=1;address=address>>1;high46();high46();low46();wd46(address);dat1=rd46();dat0=rd46();cs_93=0;dat=dat1*256 dat0;return(dat);}bit write93c56_word(unsigned char address,unsigned int dat) {unsigned char e;unsigned int temp=address;e=0;while (e>=1;wd46(address);wd46(dat/256);wd46(dat%6);cs_93=0;_nop_();cs_93=1;TH0=0;time=0;do_93=1;while (1){if (do_93==1) break;if (time) break;}cs_93=0;if (read93c56_word(temp)==dat) {return(0);}e ;}return(1);}/*-----------------------------------------------------SPI93c76与SPI93c86系列函数调用(举例)调用方式:bit write93c76_word(unsigned int address,unsigned int dat) ﹫2001/05/12函数说明:私有函数,SPI专用-----------------------------------------------------*/void ewen76(void){_nop_();cs_93=1;dip7=1;high46();low46();low46();high46();high46();wd46(0xff);cs_93=0;}unsigned int read93c76_word(unsigned int address){unsigned char dat0,dat1;gnd_93=0;cs_93=sk_93=0;org_93=1;cs_93=1;address>>=1;high46();high46();low46();if((address&0x200)==0x200) high46();else low46();if ((address&0x100)==0x100) high46();else low46();wd46(address);dat1=rd46();dat0=rd46();cs_93=0;return(dat1*256|dat0);}bit write93c76_word(unsigned int address,unsigned int dat) {unsigned char e;unsigned int temp=address;e=0;address>>=1;while (e10) break;}cs_93=0;e ;}return(1);}/*----------------------------------------------------- 主函数调用(举例)调用方式:main() ﹫2001/05/12函数说明:私有函数,SPI专用-----------------------------------------------------*/ main(){ bit b;unsigned int i;unsigned int j[32],k;for(i=0;i<32;i )j[i]=read93c56_word(i);for(i=0;i<32;i )write93c56_word(i,0x0909);i=0;b=write93c56_word(i,0x0909); j[i]=read93c56_word(i);i=1;b=write93c56_word(i,0x1111); j[i]=read93c56_word(i);i=2;b=write93c56_word(i,0x2222); j[i]=read93c56_word(i);}。
HDLTEK ht49 mcu控制ht93lc46的读写 说明书
HT49 MCU 控制 HT93LC46 的讀寫
文件編碼:HA0044T
簡介
HT93LC46 EEPROM 是 Holtek 製造的 1K 位元系列的 EEPROM(電子可擦除式唯讀記憶體), 一般它用於微控制器的固定資料的儲存。在本文中,我們將以 Holtek 公司八位元微控制器 HT49 系列爲例,介紹該晶片常用的操作功能代碼。用戶只需把代碼加到程式中,並且在使 用 HT93LC46 之前將引腳 CS/SK/DI/DO 連接即可。
功能說明
在本文中將用到一個插入文件 HT93LC46S.ASM 和一彙編原始檔案 OP16_93LC46S.ASM。在 HT-IDE3000 開發環境下,在使用所提供的介面函數前按下述的操作步驟: 步驟 1:把 OP16_93LC46S.ASM 加到專案下(用[Project/Edit]指令)。 步驟 2:根據你的電路,修改 HT93LC46S.INC 文件連接 CS/SK/DI/DO 引腳。 步驟 3:包括 HT93LC46.ASM 在內的原始檔案呼叫介面函數。 註:在使用這些函數前要適當地設置輸入/輸出口的模式。
mov a, 04bh
mov data2, a
mov a, 0c3h
mov data3, a
call ht93lc46_wral
;ht93lc46 寫全部空間
nop
mov a,3fh
;ORG 腳接 VCC,64x16
mov temp,a
read_2:
clr data2
clr data3
mov a, temp
data3 db ?
porta equ
[70h]
sk
PIC16F877 EEPROM读写实验
PIC16F877 EEPROM每一个单元的读/写所用时间典型值为:4ms,最大值为8ms。
在烧写每个EEPROM 单元过程中,需要CPU插入等待时间,既可利用中断功能,也可利用软件查询方式来解决。
在此我们利用了软件查询方式,循环检测WR烧写控制位兼烧写完成标志位。
程序如下:;实战《16F877内部EEPROM读/写实验》;本实战的目的是让大家熟悉PIC16F87X内部EEPROM的读/写方法;项目实现的功能:对于地址为00H-3FH的64个EEPROM数据存储单元,分;别将数据0-63依次烧写进去,然后再循环读出,显示在LED数码管上;程序清单如下:;************************************INCLUDE"P16F877.INC"STATUS EQU 3H ;定义状态寄存器地址RP0 EQU 5H ;定义页选位RP0的位地址RP1 EQU 6H ;定义页选位RP1的位地址Z EQU 2H ;定义0状态位的位地址PORTC EQU 7H ;定义RC口数据寄存器地址PORTD EQU 8HTRISC EQU 87H ;定义RC口方向控制寄存器地址TRISD EQU 88HEECON1 EQU 18CH ;定义写控制寄存器1的地址EECON2 EQU 18DH ;定义写控制寄存器2的地址EEDATA EQU 10CH ;定义读/写数据寄存器地址EEADR EQU 10DH ;定义读/写地址寄存器地址RD EQU 0 ;定义读启动控制位位地址WR EQU 1 ;定义写启动控制位位地址WREN EQU 2 ;定义写使能控制位位地址EEPGD EQU 7 ;定义访问目标选择控制位位址F EQU 1 ;定义目标寄存器为RAM的指示符W EQU 0 ;定义目标寄存器为W的指示符ADDR EQU 70H ;定义地址变量DATA1 EQU 71H ;定义数据变量;*************************************ORG 0000H ;NOP ;放置一条ICD必须的空操作指令GOTO MAIN ;ORG 0008H ;MAINBCF STATUS,RP1 ;选体1为当前体BSF STATUS,RP0 ;MOVLW 00H ;设定RC全部为输出MOVWF TRISC ;BSF STATUS,RP1 ;体3为当前体CLRF ADDR ;地址变量清0CLRF DATA1 ;数据变量清0WRITEBSF STATUS,RP1 ;选定体3BTFSC EECON1,WR ;上一次写操作是否完成GOTO $-1 ;否!返回继续检测BCF STATUS,RP0 ;选定体2MOVF ADDR,W ;取地址MOVWF EEADR ;送地址寄存器MOVF DATA1,W ;取数据MOVWF EEDATA ;送数据寄存器BSF STATUS,RP0 ;选定体3BCF EECON1,EEPGD ;选定EEPROM为访问对向BSF EECON1,WREN ;开放写操作使能控制MOVLW 55H ;MOVWF EECON2 ;送55H到寄存器EECON2(读写内部EEPROM,这句是固定的) MOVLW 0AAH ;MOVWF EECON2 ;送AAH到寄存器EECON2(读写内部EEPROM,这句是固定的) BSF EECON1,WR ;启动写操作BCF EECON1,WREN ;禁止写操作发生INCF DATA1,F ;数据递增INCF ADDR,F ;地址递增MOVF ADDR,W ;XORLW D'64' ;将当前地址与64比较BTFSS STATUS,Z ;检测=64否GOTO WRITE ;否!继续写后面单元READ1DECF ADDR,F ;地址递减BCF STATUS,RP0 ;选体2为当前体BSF STATUS,RP1 ;MOVF ADDR,W ;取地址MOVWF EEADR ;送地址寄存器BSF STATUS,RP0 ;选体3为当前体BCF EECON1,EEPGD ;选定EEPROM为访问对象BSF EECON1,RD ;启动读操作BCF STATUS,RP0 ;体2为当前体MOVF EEDATA,W ;取数据BCF STATUS,RP1 ;体0为当前体MOVWF PORTC ;送显LEDCALL DELAY ;调用廷时子程序MOVF ADDR,F ;检测当前地址BTFSS STATUS,Z ;是否为0?是!跳一步GOTO READ1 ;否!返回继续读出和显示READ2INCF ADDR,F ;地址递增BCF STATUS,RP0 ;选体2为当前体BSF STATUS,RP1 ;MOVF ADDR,W ;取地址MOVWF EEADR ;送地址寄存器BSF STATUS,RP0 ;选体3为当前体BCF EECON1,EEPGD ;选定EEPROM为访问对象BSF EECON1,RD ;启动读操作BCF STATUS,RP0 ;体2为当前体MOVF EEDATA,W ;取数据BCF STATUS,RP1 ;体0为当前体CALL LED_SHOW ;送数码管显示CALL DELAY ;调用廷时子程序MOVF ADDR,W ;检测当前地址与64比较XORLW D'64' ;BTFSS STATUS,Z ;是否等于64GOTO READ2 ;否!返回继续读出和显示GOTO READ1 ;返回大循环起点;******************************************DELAYMOVLW 0 ;MOVWF 72H ;将外层循环参数值256送外层循环寄存器DELAY1MOVLW 0 ;将内层循环参数值256送内层循环寄存器MOVWF 73H ;DECFSZ 73H,1 ;递减廷时程序GOTO $-1 ;DECFSZ 72H,1 ;GOTO DELAY1 ;RETURN;==========================================================; 2位LED共阳数码管显示模块; 入口: 待显示的数据在W中;----------------------------------------------------------LCD1 EQU 20H ;定义显示缓存单元LCD2 EQU 21HW_TEMP EQU 22H ;保护单元STATUS_TEMP EQU 23HCOUNT0 EQU 24HCOUNT1 EQU 25HCOUNT2 EQU 26HLED_SHOW; MOVLW 7FH ;;;;;;;MOVWF LCD1 ;现场保护,将W的内容暂存于LCD1MOVWF W_TEMP ;现场保护[W-->W_TEMP]SWAPF STATUS,W ;用SWAPF才不会影响标志位[W与STATUS高低4位交换] MOVWF STATUS_TEMP ;将W和STATUS存入各保护寄存器[STATUS-->STATUS_TEMP]BCF STATUS,RP1 ;选体1为当前体BSF STATUS,RP0 ;MOVLW 00HMOVWF TRISD ;设RD为输出口BCF STATUS,RP0 ;恢复体0; MOVWF LCD1 ;W-->LCD1MOVF LCD1,W ;LCD1-->WANDLW B'11110000' ;0FH与W相"与"后送WMOVWF LCD2 ;W-->FSWAPF LCD2 ;F高低4位互换MOVF LCD2,WCALL CONVERT ;绎码MOVWF PORTCMOVLW 02HMOVWF PORTD ;开LCD十位CALL DELAY2 ;延时MOVLW 0HMOVWF PORTD ;关LCD个位MOVF LCD1,W ;F-->WANDLW B'00001111' ;0FH与W相"与"后送WCALL CONVERT ;绎码MOVWF PORTCMOVLW 01HMOVWF PORTD ;开LCD个位CALL DELAY2 ;延时MOVLW 0HMOVWF PORTD ;关LCD个位SWAPF STATUS_TEMP,W ;恢复中断前STATUS,W的值MOVWF STATUSSWAPF W_TEMP,F ;W_TEMP高低4位互换SWAPF W_TEMP,W ;(用SWAPF才不会影响STATUS的值)RETURN ;子程序返回;==========================================================;-------------------- 共阳顺序7段数码管段码 --------------- CONVERT ;取数码管段码ADDWF PCL,1 ;地址偏移量加当前PC值TABLE RETLW 0C0H ;0RETLW 0F9H ;1 RETLW 0A4H ;2RETLW 0B0H ;3RETLW 99H ;4RETLW 92H ;5RETLW 82H ;6RETLW 0F8H ;7RETLW 80H ;8RETLW 90H ;9RETLW 88H ;ARETLW 83H ;bRETLW 0C6H ;cRETLW 0A1H ;dRETLW 86H ;ERETLW 8EH ;F; RETLW 7FH ;. 小数点RETLW 00H ;结束符;---------------------------------------------------------- ;--------------------------- 廷时子程序 ----------------- DELAY2MOVLW .2 ;设置延时常数 [.2--即为2] MOVWF COUNT0L1MOVLW .50 ;MOVWF COUNT1L2MOVLW .100 ;MOVWF COUNT2L3DECFSZ COUNT2,1 ;递减循环GOTO L3 ;DECFSZ COUNT1,1 ;GOTO L2 ;DECFSZ COUNT0,1 ;GOTO L1 ;RETLW 0;========================================================== END。
93C46可擦除芯片的使用程序
/*93C46芯片的基本使用程序*/#include<reg52.h>#include<intrins.h>sbit spi_d=P1^1;sbit spi_cs=P1^2;sbit spi_clk=P1^4;sbit spi_q=P1^5;unsigned int dt=0;unsigned char adr,j,rdt,temp,dta;#define EWEN 0x98#define ERAL 0x90#define EWDS 0x80int ef=0;void init_93c(){}/*该函数实现对93c46芯片的读出数据操作(主要的操作就是送出地址然后读取数据)*/ unsigned char read_93c(unsigned char adr){unsigned char j,rdt;init_93c();spi_cs=1;dt=adr;dt=dt<<6;dt|=0xc000;for(j=10;j>0;j--){spi_d=dt&0x8000;spi_clk=1;_nop_();spi_clk=0;dt<<=1;}for(j=0;j<8;j++){spi_clk=1;_nop_();_nop_();rdt<<=1;if(spi_q)rdt++;spi_clk=0;}spi_cs=0;return(rdt);}/*写允许、写禁止、全擦除的通用设置函数*/ void com_93c(unsigned char cmd){unsigned char j,temp;unsigned int k;temp=cmd;init_93c();spi_cs=1;for(j=10;j>0;j++){spi_d=cmd&0x80;spi_clk=1;_nop_();spi_clk=0;cmd<<=1;}spi_cs=0;if(temp==ERAL){spi_clk=1;_nop_();spi_clk=0;spi_cs=1;_nop_();for(k=0;k<0xffff;k++){spi_clk=1;_nop_();spi_clk=0;if(spi_q) break;/*检测到输出ready信号就跳出*/ }spi_cs=0;if(k!=0)/*如果k不为0,说明擦除成功*/ef=0;elseef=1;/*k=0说明整个循环下来都没有等到检测到ready信号*/ }}/*该函数实现对93c46芯片实现写入数据的功能*/void wtite_93(unsigned char adr,dta){unsigned char j;unsigned int dt,k;com_93c(EWEN);spi_cs=1;dt=adr;dt=dt<<6;dt|=0xa000;for(j=10;j>0;j--){spi_d=dt&0x8000;spi_clk=1;_nop_();spi_clk=0;dt<<=1;}dt=dta*256;for(j=8;j>0;j--){spi_d=dt&0x8000;spi_clk=1;_nop_();spi_clk=0;dt<<=1;}spi_cs=0;spi_clk=1;_nop_();spi_clk=0;spi_cs=1;_nop_();for(k=0;k<0xffff;k++) {spi_clk=1;_nop_();spi_clk=0;if(spi_q) break;}spi_cs=0;if(k!=0)ef=0;elseef=1;com_93c(EWDS);}/*全擦除函数*/void erase_93c(void) {com_93c(EWEN);com_93c(ERAL);com_93c(EWDS); }void main(){com_93c(EWEN); wtite_93(adr,dta); erase_93c();read_93c(adr);}。
QL200开发版单片机资料
第一章:QL200单片机综合实验仪系统简介 (2)第二章:MPLAB IDE集成开发环境2.1 MPLAB的安装 (3)2.2 MPLAB的简单应用 (3)2.2.1 创建简单的项目 (3)2.2.2 程序调试 (6)第三章:在线调试器MCD2的使用3.1 认识MCD2 (9)3.2 MCD2的连接 (10)3.3 MCD2使用中常见问题 (13)第四章:QL200烧写模块QL_PROG4.1 QL_PROG硬件介绍 (14)4.2 QL_PROG软件介绍 (15)4.3 QL_PROG支持的芯片列表 (21)第五章:QL200系统各功能模块详细介绍5.1 单片机引脚资源及系统时钟选择 (23)5.2 电源模块................................................................................... (26)5.3 12864LCD及1602LCD模块 (27)5.4 PORTA、PORTB和PORTC口的LED模块 (28)5.5 4*4键盘矩阵模块 (29)5.6 PORTA0~PORTA3和PORTB0~PORTB3引脚的按键模块 (30)5.7 A/D转换模块 (31)5.8 IIC协议24CXX EEPROM模块 (32)5.9 SPI协议93CXX EEPROM模块 (33)5.10 DS1302时钟模块 (34)5.11 六位数码管模块 (35)5.12 遥控接收解码模块 (36)5.13 DS18B20模块 (37)5.14 发声模块 (38)5.15 RS232通信模块 (39)5.16 10位D/A模块 (40)5.17 扩展PORTD口的LED (41)第六章:QL200系统使用实战 (42)第1章QL200单片机综合实验仪系统简介QL200 PIC DEVELOPMENT BOARD(以下简称QL200)是深圳乾龙盛电子科技有限公司(PIC单片机学习网)综合多年开发经验,经过数月精心设计开发出的多功能PIC单片机开发平台。
QL200 PIC单片机综合开发实验系统
QL200 PIC单片机综合开发实验系统提供3个月包换,12个月免费维修的售后服务,同时我们也为大家提供免费的技术支持.QL200是一款具有实验仪、编程器、仿真接凇 CSP下载线四种功能合一的PIC单片机综合学习开发系统,系统自带控制CPU,配合拥有自主知识版权的编程软件,可以支持90%以上PIC单片机的实验和开发。
您只需一套QL200单片机开发系统和一台电脑而不需要购买编程器等其它任何设备就可轻松学习和开发PIC各系列单片机。
QL200既适合初学者学习单片机的需求,它的开发系统的编程功能,板载丰富的硬件资源及灵活的扩展与可随意的资源分配,对用户目标板ICSP下载功能,同样也适合开发工程师开发产品的需求。
所以说QL200不仅是一款单片机学习实验板,同时它也是一款集多种资源于一体的单片机开发板。
资源RS232串口通信--通过它可实现单片机与电脑的通信(预设连接硬件USAR T 口,通过拨码开关关断预设接口,然后可通过扩展线连接单片机任意IO口)24路独立LED--可连接单片机RA、RB、RC任意口用于指示IO口输出的高低电平(可用拨码开关控制任意一个口线与LED的连与断)4*4矩阵键盘--可实验密锁等项目(预设连接RC接口,通过拨码开关关设接口,然后可通过扩连接单片机任意IO口)8路独立按键--方便各种按键输入实验,可跳线设置端口硬件上拉。
(预设连接RB0-3,RA0-3,通过开关关断预设口后可扩展连接单片机任意口)2路A/D转换输入--(预设连接RA0,RA1,通过开关关断预设口后可扩展连接单片机任意A/D输入口)各系列PIC实验芯片插--包括8PIN、14PIN、18PIN、20PIN、28PIN40PIN、PIC10系列专用PIC16F57专用插座DS1302时钟--自带记忆电池,(预设连接RB0、RB4、RB5口,通过开关关断预设口后可扩展连接单片机任意口)仿真调试连接接口--可直接连接ICD1/ICD2/MCD1/MCD2对板载芯片及资源进行在线仿真IIC(I2C)通信--可直接用硬件IIC或软件IIC实验读写24CXX系列芯片(预设连接硬件IIC口通过开关关断预设口后扩展连接单片机任意口SPI通信--可直接用硬件SPI或软件模拟SPI实现单片机读写93CXX的EEPROM,可通过跳线选择是8位或者16位读写方式(预设连接硬件SPI 口,通过开关关断预设口后可扩展连接单片机任意口)10位D/A转换--芯片为TLC5615,可直接实现数字到模拟的转换,板载模拟输出接口(预设连接RC5、RC2、RC3口,通过开关关断预设口后可扩展连接单片机任意口)注:TLC5615芯片是选购件DS18B20数字温度传器--1线总线通信,测量度范围宽、精度高、反灵敏(预设连接RA0口通过开关关断预设口后扩展连接单片机任意口注:DS18B20芯片是选件红外线遥控接收--可实验红外线遥控解码,适合于各种红外线遥控器(预设连接RA1口,通过开关关断预设口后可扩展连接单片机任意口)蜂鸣器发音/PWM输出实验--可实验普通发音,可实验唱歌,可实验PWM口输出发音((预设硬件PWM口,通过开关关断预设口后可扩展连接单片机任意口)时钟选择--可跳线切换种振荡方式,可根据产开发需要更换不同频率晶振。
S7-200芯片数据读写工具使用使用说明
S7-200芯片数据读写工具安装使用说明一、驱动的安装:1、将接收到的压缩包解压后,打开“USB口编程器驱动”文件夹(先不插编程器),鼠标双击运行里面的“SETUP”文件。
2、在弹出的窗口中点“INSTALL”按钮。
3、等待出现“驱动预安装成功”对话窗口后,点确定。
然后关闭安装窗口。
4、插入USB口24系列编程器硬件。
5、在弹出的发现新硬件窗口中选择自动安装即可,直到提示安装完成。
6、驱动安装完成后,依次按下面路径可以看到我的电脑—右键—属性—硬件—设备管理器—USB-IO。
说明驱动正常安装,编程器可以正常使用。
二、24芯片的位置方向:编程器IC座的脚位说明,如下图:上图中的红色标注文字在实际编程器中不存在,是为了说明脚位顺序而添加在图片上的。
三、读写应用程序的使用:将光盘中“USB口24系列编程器软件”文件夹复制到硬盘中,然后在该文件夹内的“USB口24系列编程器”文件上点鼠标右键,依次选择“发送到----桌面快捷方式”,这时您就可以使用桌面的图标启动编程器软件进行读写操作了。
下面介绍一下应用软件中的各部分功能用法:芯片选择:用于选择您想操作的芯片型号,直接鼠标点选相应的待操作的存储器芯片型号,及插在IC紧缩座上的芯片。
状态指示:底部左侧的文字用于显示当前是否已经插入编程器,但不检测是否插入芯片。
代码编辑区:中间的白色矩形区域是用于显示打开的文件内容或从存储器芯片中读出的数据内容,为十六进制代码。
打开按钮:打开存储器数据文件并显示在中间的编辑区内,准备写入芯片。
一般为BIN扩展名,也有特例的。
保存按钮:将编辑区内的内容保存到文件中,以备后用。
多数用于将芯片中的数据读出后保存起来。
读取按钮:将芯片中的内容读出并显示在编辑器内,以备编辑或保存成文件,注意实际芯片与界面选择的芯片要对应。
写入按钮:将编辑区内的内容写入芯片中,注意实际芯片与界面选择的芯片要对应。
写入完成会有提示。
如果编辑区中的内容长度小于所选择的芯片,只写入编辑区内容的长度为止,芯片从0地址开始写。
PIC16F877A AD采集并用12864显示
#include <pic.h>__CONFIG(0x3B31);#define uchar unsigned char#define uint unsigned int#define rs RA1#define rw RA2#define ce RA3#define psb RA4#define lcd PORTBuint i;uint S;uint adval;float advalf;const uchar table1[]={"检测电压"};uchar table2[5];const uchar table3[]={"伏特"};const uchar table4[]={"I LOVE YOU"};void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void init(){TRISA=0x01;TRISB=0;TRISD=0;PORTA=0;PORTD=0;ADCON0=0x41;//选择时钟周期;选择信道;打开AD但不启动ADCON1=0x8e;//右对齐;数字量delay(10);}void write_cmd(uchar cmd)//写指令{rs=0;rw=0;ce=0;lcd=cmd;delay(5);ce=1;delay(5);ce=0;}void write_dat(uchar dat)//写数据{rs=1;rw=0;ce=0;lcd=dat;delay(5);ce=1;delay(5);ce=0;}void lcd_pos(uchar X,uchar Y){uchar pos;if(X==0){X=0X80;}else if(X==1){X=0X90;}else if(X==2){X=0X88;}else if(X==3){X=0X98;}pos=X+Y;write_cmd(pos);}void lcd_init(){psb=1;write_cmd(0x30);delay(5);write_cmd(0x0C);delay(5);write_cmd(0x01);delay(5);}uint get_ad()//获取AD值{uint adval;//存放10位AD的值float advalf;ADGO=1;//启动ADwhile(ADGO);//等待AD转换adval=ADRESH;//00000000 00000011读取ADRESH中的值adval=adval<<8|ADRESL;//00000011 11111111将ADRESH与ADRESL整合advalf=adval/1023.0*5.0;//==2.3843转化为电压数值adval=advalf*1000;//用来舍去得到数值的多余位数return (adval);}void display(){S=get_ad();table2[0]=S/1000+0x30;table2[1]='.';table2[2]=S/100%10+0x30;table2[3]=S/10%10+0x30;table2[4]=S%10+0x30;lcd_pos(1,3);for(i=0;i<5;i++){write_dat(table2[i]);}}void main(){uchar i;init();lcd_init();lcd_pos(0,0);i=0;while(table1[i]!='\0'){write_dat(table1[i]);i++;}lcd_pos(2,4);i=0;while(table3[i]!='\0'){write_dat(table3[i]);i++;}lcd_pos(3,3);i=0;while(table4[i]!='\0'){write_dat(table4[i]);i++;}while(1){display();}}/*void interrupt time0(){ADIF=0;get_AD();}*/。
93c46读写程序
“93c46读写程序”#include <reg52.h>sbit CS=P2^7;sbit SK=P2^6;sbit DI=P2^5;sbit DO=P2^4;/*extern unsigned char ReadChar(unsigned char address);extern void WriteChar(unsigned char address,unsigned char InData);extern void ReadString(unsigned char data *RamAddress,unsigned char RomAddress, unsigned char Number);extern void WriteString(unsigned char data *RamAddress,unsigned char RomAddress, unsigned char Number);*/// Write enable must precede all programming modes.void Ewen(void) {unsigned char temp,InData;CS=0;SK=0;CS=1;InData=0x98; // 10011XXXXfor(temp=9;temp!=0;temp--) { // 9DI=InData&0x80;SK=1; SK=0;InData<<=1;}CS=0;}// Disables all programming instructions.void Ewds(void) {unsigned char temp,InData;CS=0;SK=0;CS=1;InData=0x80; // 10000XXXXfor(temp=9;temp!=0;temp--) { // 9DI=InData&0x80;SK=1; SK=0;InData<<=1;}CS=0;}// Reads data stored in memory, at specified address.unsigned int Read(unsigned char address) {unsigned char temp;unsigned int result;Ewen();SK=0; DI=1; // 110 A5-A0CS=0; CS=1;SK=1; SK=0; // 1address=address&0x3f|0x80;for(temp=8;temp!=0;temp--) { // 8DI=address&0x80;SK=1; SK=0;address<<=1;}DO=1;for(temp=16;temp!=0;temp--) { // 16SK=1;result=(result<<1)|DO;SK=0;}CS=0;Ewds();return(result);}// Writes memory location An - A0.void Write(unsigned char address,unsigned int InData) {unsigned char temp;Ewen();SK=0; DI=1; // 101 A5-A0CS=0; CS=1;SK=1; SK=0; // 1address=address&0x3f|0x40;for(temp=8;temp!=0;temp--) { // 8DI=address&0x80;SK=1; SK=0;address<<=1;}for(temp=16;temp!=0;temp--) { // 16DI=InData&0x8000;SK=1; SK=0;InData<<=1;}CS=0; DO=1;CS=1; SK=1;while(DO==0) { // busy testSK=0; SK=1;}SK=0; CS=0;Ewds();}/*// Erase memory location An - A0.void Erase(unsigned char address) {unsigned char temp;Ewen();SK=0; DI=1; // 111 A5-A0CS=0; CS=1;SK=1; SK=0; // 1address|=0xc0;for(temp=8;temp!=0;temp--) { // 8DI=address&0x80;SK=1; SK=0;address<<=1;}CS=0; DO=1;CS=1; SK=1;while(DO==0) {SK=0; SK=1;}SK=0; CS=0;Ewds();}// Erases all memory locations. Valid only at VCC = 4.5V to 5.5V. void Eral(void) {unsigned char temp,InData;Ewen();CS=0;SK=0;CS=1;InData=0x90; // 10010XXXXfor(temp=9;temp!=0;temp--) { // 9DI=InData&0x80;SK=1; SK=0;InData<<=1;}CS=0; DO=1;CS=1; SK=1;while(DO==0) {SK=0; SK=1;}SK=0; CS=0;Ewds();}// Writes all memory locations. Valid only at VCC = 4.5V to 5.5V. void Wral(unsigned int InData) {unsigned char temp,address;Ewen();CS=0;SK=0;CS=1;address=0x88; // 10001XXXXfor(temp=9;temp!=0;temp--) { // 9DI=address&0x80;SK=1; SK=0;address<<=1;}for(temp=16;temp!=0;temp--) { // 16DI=InData&0x8000;SK=1; SK=0;InData<<=1;}CS=0; DO=1;CS=1; SK=1;while(DO==0) {SK=0; SK=1;}SK=0; CS=0;Ewds();}*/unsigned char ReadChar(unsigned char address) {unsigned char temp=address>>1;if(address&0x01) return((unsigned char)(Read(temp)>>8));else return((unsigned char)(Read(temp)));}void WriteChar(unsigned char address,unsigned char InData) {unsigned char temp=address>>1;if(address&0x01) Write(temp,(unsigned int)(Read(temp)&0x00ff|(InData<<8)));else Write(temp,(unsigned int)(Read(temp)&0xff00|InData));}void ReadString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number) {while(Number!=0) {*RamAddress=ReadChar(RomAddress);RamAddress++;RomAddress++;Number--;}}void WriteString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number) {unsigned int temp;if(Number==0) return;if(RomAddress&0x01) {WriteChar(RomAddress,*RamAddress);RamAddress++;RomAddress++;Number--;}if(Number==0) return;while(Number>>1) {temp=*RamAddress;RamAddress++;temp=temp|(*RamAddress)<<8;RamAddress++;Write(RomAddress>>1,temp);RomAddress++;RomAddress++;Number--;Number--;}if(Number) WriteChar(RomAddress,*RamAddress);。
93c46单片机c51读写程序
93c46读写程序://已验证可行/*------------------------------------------------------------------------------HELLO.CCopyright 1995-1999 Keil Software, Inc.------------------------------------------------------------------------------*/#include <REG52.H> /* special function registerdeclarations *//* for the intended 8051 derivative */#include <stdio.h> /* prototype declarations for I/Ofunctions */#ifdef MONITOR51 /* Debugging with Monitor-51needs */char code reserve [3] _at_ 0x23; /* space for serial interruptif */#endif /* Stop Exection with SerialIntr. *//* is enabled */#define uchar unsigned char#define uint unsigned intunsigned char codenum[10]={0x18,0x7b,0x2c,0x29,0x4b,0x89,0x88,0x3b,0x08,0x09};// 显示段码值0~9unsigned char code xuanze[4]={0x7f,0xbf,0xdf,0xef};sbit dp0= P2^7;sbit dp1= P2^6;sbit dp2= P2^5;sbit dp3= P2^4;sbit CS=P1^2;sbit SK=P1^4;sbit DI=P1^1;sbit DO=P1^5;char dpt;unsigned char dpbuf[4]={0,0,0,0};void delay(void){unsigned int x,y;for (x=0;x<200;x++)for (y=0;y<200;y++);}void shift1(uchar num,uchar sdata) {unsigned char i;for(i=0;i<num;i++){SK=0;sdata<<=1;DI=CY;SK=1;}}void shift2(uchar num,uchar sdata) {unsigned char i;sdata<<=1;for(i=0;i<num;i++){SK=0;sdata<<=1;DI=CY;SK=1;}void write_en(void){unsigned char sb_op=0x80,add=0xc0;CS=0;CS=1;shift1(3,sb_op);shift1(7,add);CS=0;CS=1;}void erase_all(void){unsigned char sb_op=0x80,add=0x80;CS=0;CS=1;shift1(3,sb_op);shift1(7,add);CS=0;CS=1;while(DO==0);}uchar read(uchar rd_add){unsigned char i,sb_op=0xc0,rd_data=0x00;CS=0;CS=1;shift1(3,sb_op);shift2(7,rd_add);for(i=0;i<8;i++){ rd_data<<=1;SK=0;SK=1;CY=DO;if(CY==1)rd_data|=0x01;else rd_data&=0xfe;}//SK=0;CS=0;CS=1;return(rd_data);void write(uchar wr_add,uchar wr_data) {unsigned char sb_op=0xa0;CS=0;CS=1;shift1(3,sb_op);shift2(7,wr_add);shift1(8,wr_data);CS=0;CS=1;while(DO==0);}void erase(uchar er_add){unsigned char sb_op=0xe0;CS=0;CS=1;shift1(3,sb_op);shift2(7,er_add);CS=0;CS=1;while(DO==0);}void wr_all(uchar wr_data){unsigned char sb_op=0x80,wr_add=0x40;CS=0;CS=1;shift1(3,sb_op);shift1(7,wr_add);shift1(8,wr_data);CS=0;CS=1;while(DO==0);}void ew_disable(void){unsigned char sb_op=0x80,add=0x00;CS=0;CS=1;shift1(3,sb_op);shift1(7,add);CS=0;delay();}void main (void) {int x,i;unsigned char j;unsigned char k;#ifndef MONITOR51SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr*/TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */TH1 = 221; /* TH1: reload value for 1200 baud @16MHz */TR1 = 1; /* TR1: timer 1 run */TI = 1; /* TI: set TI to send first char ofUART */#endifTMOD=0x01;TH0=0xee;TL0=0;TR0=1;ET0=1;EA=1;write_en();for(k=0;k<10;k++){write(k,k+11);j=read(k);dpbuf[0]=0;dpbuf[1]=k;dpbuf[2]=1;dpbuf[3]=j%10;delay();}while(1);}void tmr0(void) interrupt 1 //5ms {TH0=0xee;TL0=0;if(dpt<3) dpt++;else dpt=0; //动态显示计数器 P0 = num[dpbuf[dpt]];if(dpt==0){ dp1 = dp2 = dp3 = 1;dp0 = 0;}else if(dpt==1){ dp0 = dp2 = dp3 = 1;dp1 = 0;}else if(dpt==2){ dp0 = dp1 = dp3 = 1;dp2 = 0;}//if(dpt==3)else{ dp0 = dp1 = dp2 = 1;dp3 = 0;} }。
用汇编语言实现存储器的读写
用汇编语言实现存储器的读写汇编语言是一种底层的编程语言,用于编写计算机的底层程序。
它的主要特点是直接操作计算机的硬件,因此可以用它来实现存储器的读写操作。
下面是一个使用汇编语言实现存储器读写的示例:首先,假设我们要实现一个简单的存储器,它有256个字节的容量,并且可以通过一个地址总线和一个数据总线进行读写操作。
我们使用8位寄存器来表示地址,使用8位寄存器来表示数据。
1.通过设置地址总线:```assemblyMOVAL,0x10;将地址0x10存储到AL寄存器中OUT0x01,AL;将AL寄存器的值通过地址总线写入存储器```这段代码将地址0x10存储到AL寄存器中,并通过OUT指令将AL寄存器的值送到地址总线。
2.通过设置数据总线和读取数据:```assemblyMOVAL,0xFF;将数据0xFF存储到AL寄存器中OUT0x02,AL;将AL寄存器的值通过数据总线写入存储器INAL,0x02;通过数据总线读取存储器中的数据,并存储到AL寄存器中```这段代码将数据0xFF存储到AL寄存器中,并通过OUT指令将AL寄存器的值送到数据总线写入存储器。
接着,通过IN指令从数据总线读取存储器中的数据,并将结果存储到AL寄存器中。
3.封装为子程序:我们可以将上述的代码封装为两个子程序,分别用于写入和读取存储器中的数据:```assemblyWRITE_MEMPROCMOVAL,[ADDR];将要写入的地址存储到AL寄存器中OUT0x01,AL;将AL寄存器的值通过地址总线写入存储器MOVAL,[DATA];将要写入的数据存储到AL寄存器中OUT0x02,AL;将AL寄存器的值通过数据总线写入存储器RETWRITE_MEMENDPREAD_MEMPROCMOVAL,[ADDR];将要读取的地址存储到AL寄存器中OUT0x01,AL;将AL寄存器的值通过地址总线写入存储器INAL,0x02;通过数据总线读取存储器中的数据,并存储到AL寄存器中MOV[DATA],AL;将读取到的数据存储到一个变量中RETREAD_MEMENDP```这里,WRITE_MEM子程序负责将地址和数据写入存储器,READ_MEM子程序负责将地址写入存储器并读取其中的数据。
PIC16F877A单片机中文文献
PIC16F877A单片机是microchip公司的产品,它采用14位的RISC指令系统,内部集成了A/D转换器、EEPROM、模拟比较器、带比较和捕捉功能的定时器/计数器、PWM输出、异步串行通信电路等。
1.程序存储器程序存储器和堆栈PIC16F877A单片机内部具有8K×14位的Flash程序存储器,程序存储器具有13位宽度的程序计数器地址范围:0000H-1FFFH。
由程序计数器提供13条地址线进行单元选择,每个单元宽14位,即PIC16F877A的指令字节宽度为14位,能够存放一条PIC单片机系统指令。
在系统上电或其他复位情况下,程序计数器均从0000H地址单元开始工作。
如果遇到调用子程序或系统发生事件中断时,将把当前程序断点处的地址送入8级×14位的堆栈区域进行保护。
堆栈是一个独立的存储区域,在调用的子程序或中断服务程序执行完后,再恢复断点地址。
通过14位程序总线,取出对应程序之灵的机器码,送入指令存储器,将组成的操作码和操作数进行有效分离。
如果操作数为地址,则进入地址复用器;如果操作数为数据,则进入数据复用器。
而操作码将在指令译码和控制单元中转化为相应的功能操作。
PIC的多数指令均是顺序执行,即使条件跳转也是隔行间接跳转。
具有大范围转移功能的指令只有两条:无条件GOTO语句和调用子程序CALL语句。
但它们受到2KB范围的约束。
所以必须将整个程序存储器以2KB为单位进行分页。
PIC16F877A单片机的上电复位地址是0000H,中端口地址是0004H,中断产生时PC指针会自动指向该地址。
在进行中断应用时,特别是涉及多个中断同时打开时,必须要逐个对中断标志进行判断。
编程时,在0000H-0003H单元内要放置一条GOTO跳转指令,跳转到主程序,以避开0004H存储器单元。
2.数据存储器数据存储器PIC单片机的数据存储器与传统的MCS-51单片机一样,在配置结构上可分为通用寄存器和特殊功能寄存器两大类。
QL200 使用入门
QL200 PIC单片机实验仪使用入门1.MPLAB IDE v7.60 安装从光盘上,先安装MPLAB IDE v7.60,然后安装C编译器PICC简化版(文件目录:Lang_Tool_Demos\Hi-tech_PicC\ picclite-setup)。
安装完毕后,PICC语言工具自动嵌入MPLAB IDE中。
2.实验仪接线(1)供电电源接线。
实验仪采用外部直流电源供电方式。
首先,将跳线器J2设置成如图1所示;然后,将电源适配器(DC 9V)输出插头插入实验仪外部电源插座J1,适配器应插在AC220V电源插座上,如图2所示。
跳线器J2下方的SUPPLY自锁开关,用于控制电路板是否上电。
图1(2)连接调试器ICD2 LE。
将调试器ICD2 LE的输出端与实验仪CON38端口相连接,如图2所示,ICD2 LE输入端通过USB电缆连接编程计算机。
(3)实验仪上跳线器的设置。
实验仪上带有1片PIC16F877A单片机,调试前需对J5~J8跳线器做相应设置,如图3所示。
PIC16F877A的时钟选择为晶体振荡器,跳线器J9-J10的正确位置如图4所示。
图3 图43.简单程序的调试(1)打开MPLAB IDE,利用project wizard建立一个名为111的新项目。
建立过程中,device选择为PIC16F877A;Toolsuite选择为HI-Tech universal toolsuite;将测试程序led1.c加入项目中。
(2)调试程序。
首先在debug\select tool菜单中选中MPLAB ICD2,然后利用debug\MPLAB ICD2 setup wizard向导,选择通讯口为:USB,电源选项为:target has own power supply。
接下来需要设定单片机的配置位,通过configure\configuration bits菜单,打开如图5所示配置窗口,按照图中所示修改设定值。
PIC单片机的EEPROM读写程序
PIC单片机的EEPROM读写程序PIC16C74B单片机与AT24C64通讯;该程序实现的功能是:;将I2C_A,I2C_B.....I2C_K内容写入EEPROM中;同时在EEPROM中读出数据从新写入各个寄存器;=======================================LIST P=16C74B#include<p16c74.inc>ERRORLEVEL -302I2C_A EQU 0X20I2C_B EQU 0X21I2C_C EQU 0X22I2C_D EQU 0X23I2C_E EQU 0X24I2C_F EQU 0X25I2C_G EQU 0X26REG1 EQU 0X2BREG2 EQU 0X2CCOUNT EQU 0X71 ;I2CBCOUNT EQU 0X72 ;I2CTXBUF EQU 0X73 ;I2CRXBUF EQU 0X74 ;I2CBUSCON EQU 0X75 ;I2CBUSSTA EQU 0X76 ;I2CI2CBUF EQU 0X77 ;I2CSLA VEADDR EQU 0XA0 ;I2CDA TAADDRH EQU 0X01 ;I2CDA TAADDRL EQU 0X00 ;I2C;---------------------------------------;BUSCON;---------------------------------------SLA VE_RW EQU 7LAST_BYTE_RX EQU 6SLA VE_ACTIVE EQU 5TIME_OUT EQU 4;---------------------------------------;BUSSTA;---------------------------------------BUS_BUSY EQU 7TX_PROGRESS EQU 6RX_PROGRESS EQU 5TX_SUCCESS EQU 4RX_SUCCESS EQU 3FATAL_ERROR EQU 2 ;SLA VE EEPROM ABORT EQU 1ACK_ERROR EQU 0;---------------------------------------R_NOT_W EQU 0TRUE EQU 1FALSE EQU 0SDA EQU 0X04 ;I2CSCL EQU 0X03 ;I2C;=======================================ORG 0X00GOTO STARTORG 0X20START BCF STATUS,RP1BCF STATUS,RP0CLRF RACLRF RBCLRF RCCLRF RDCLRF REBSF STATUS,RP0CLRF TRISACLRF TRISBCLRF TRISCCLRF TRISDCLRF TRISEMOVLW 0X02MOVWF I2C_AMOVLW 0X04MOVWF I2C_BMOVLW 0X03MOVWF I2C_CMOVLW 0X03MOVWF I2C_DMOVLW 0X05MOVWF I2C_EMOVLW 0X06MOVWF I2C_FMOVLW 0X04MOVWF I2C_G;======================================= START1CALL I2CBUS_INITCALL REGTOI2CBUFCALL I2CWRITECALL CLRI2CBUFCALL D10CALL I2CREADCALL I2CBUFTOREGGOTO START1;======================================= ;CLRI2CBUF;---------------------------------------CLRI2CBUFBCF STA TUS,RP0MOVLW I2CBUFMOVWF FSRMOVLW 0X08MOVWF COUNTCLRLOOP CLRF INDFINCF FSR,FDECFSZ COUNT,FGOTO CLRLOOPRETURN;---------------------------------------;将各个REGSTER数据写入 I2CBUF 缓冲区;---------------------------------------REGTOI2CBUFBCF STA TUS,RP0MOVLW I2CBUFMOVWF FSRMOVF I2C_A,WMOVWF INDFINCF FSR,FMOVF I2C_B,WMOVWF INDFINCF FSR,FMOVF I2C_C,WMOVWF INDFINCF FSR,FMOVF I2C_D,WMOVWF INDFINCF FSR,FMOVF I2C_E,WMOVWF INDFINCF FSR,FMOVF I2C_F,WMOVWF INDFINCF FSR,FMOVF I2C_G,WMOVWF INDFRETURN;---------------------------------------;将 I2CBUF 缓冲区数据写入各个REGSTER;---------------------------------------I2CBUFTOREGBCF STA TUS,RP0MOVLW I2CBUFMOVWF FSRMOVF INDF,WMOVWF I2C_AINCF FSR,FMOVF INDF,WMOVWF I2C_BINCF FSR,FMOVF INDF,WMOVWF I2C_CINCF FSR,FMOVF INDF,WMOVWF I2C_DINCF FSR,FMOVF INDF,WMOVWF I2C_EINCF FSR,FMOVF INDF,WMOVWF I2C_FINCF FSR,FMOVF INDF,WMOVWF I2C_GRETURN;=======================================;将I2CBUF缓冲区内的数据写入EEPROM;=======================================I2CWRITECALL I2CSTARTBTFSS BUSSTA,BUS_BUSYGOTO TX_FAILBCF BUSCON,SLA VE_RWCALL TX_SLA VE_ADDRBTFSS BUSSTA,TX_SUCCESS ;SUCESSFULL? GOTO TX_FAILCALL TX_DA TA_ADDRBTFSS BUSSTA,TX_SUCCESSGOTO TX_FAILMOVLW I2CBUFMOVWF FSRMOVLW 07MOVWF COUNTT_BYTE_LOOPMOVF INDF,WMOVWF TXBUFCALL I2CTXBBTFSS BUSSTA,TX_SUCCESSGOTO TX_FAILINCF FSR,FDECFSZ COUNT,FGOTO T_BYTE_LOOPGOTO TX_PASSTX_FAIL CALL I2CSTOPBCF BUSSTA,TX_PROGRESSBCF BUSSTA,TX_SUCCESSRETLW FALSETX_PASSCALL I2CSTOPBCF BUSSTA,TX_PROGRESSRETLW TRUE;---------------------------------------;从 EEPROM 中读出数据到 I2CBUF 寄存器;---------------------------------------I2CREAD BCF STATUS,RP0BCF BUSSTA,RX_SUCCESSCALL I2CSTARTBTFSS BUSSTA,BUS_BUSYGOTO RX_FAILBCF BUSCON,SLA VE_RWCALL TX_SLA VE_ADDRBTFSS BUSSTA,TX_SUCCESS GOTO RX_FAILCALL TX_DA TA_ADDRBTFSS BUSSTA,TX_SUCCESSGOTO RX_FAILCALL I2CSTARTBSF BUSCON,SLA VE_RWCALL TX_SLA VE_ADDRBTFSS BUSSTA,TX_SUCCESSGOTO RX_FAILBCF BUSSTA,LAST_BYTE_RXMOVLW I2CBUFMOVWF FSRMOVLW 07MOVWF COUNTR_BYTE_LOOPMOVLW 0X01XORWF COUNT,WBTFSC STATUS,ZBSF BUSSTA,LAST_BYTE_RXCALL I2CRXBBTFSS BUSSTA,RX_SUCCESSGOTO RX_FAILMOVF RXBUF,WMOVWF INDFINCF FSR,FDECFSZ COUNT,FGOTO R_BYTE_LOOPGOTO RX_PASSRX_FAIL CALL I2CSTOPBCF BUSSTA,RX_PROGRESSBCF BUSSTA,RX_SUCCESSRETLW FALSERX_PASS CALL I2CSTOPBCF STA TUS,RP0BCF BUSSTA,TX_PROGRESSBCF BUSSTA,RX_PROGRESSBSF BUSSTA,RX_SUCCESSRETLW TRUE;======================================= ; I2C 初始化;=======================================I2CBUS_INITBCF STA TUS,RP0MOVF RC,WANDLW 0X18MOVWF RCCLRF BUSSTACLRF BUSCONRETURN;======================================= ; 传送设备地址;入口: BUSCON;出口: BUSSTA;======================================= TX_SLA VE_ADDRBCF STA TUS,RP0BCF BUSSTA,ACK_ERRORMOVLW SLA VEADDRMOVWF TXBUFBTFSC BUSCON,SLA VE_RWBSF TXBUF,R_NOT_WCALL I2CTXBBTFSC BUSSTA,TX_SUCCESSGOTO TXADDR_SUCCESSCLRWDTBTFSS BUSSTA,ACK_ERRORCALL I2CSTOPGOTO TXADDR_ENDTXADDR_SUCCESSCLRWDTTXADDR_ENDRETURN;======================================= ;TX_DATA_ADDR 发送写/读的地址;======================================= TX_DATA_ADDRBCF STA TUS,RP0MOVLW DATAADDRHMOVWF TXBUFCALL I2CTXBBCF STA TUS,RP0BTFSS BUSSTA,TX_SUCCESSGOTO TX_DATA_ADDR_ERRORMOVLW DATAADDRLMOVWF TXBUFCALL I2CTXBBCF STA TUS,RP0BTFSS BUSSTA,TX_SUCCESSGOTO TX_DATA_ADDR_ERRORGOTO TX_DATA_ENDTX_DATA_ADDR_ERRORBCF BUSSTA,TX_PROGRESSBCF BUSSTA,TX_SUCCESSBSF BUSSTA,ACK_ERRORTX_DATA_ENDRETURN;=======================================;向 EEPROM 输出一个8位数据,并检测EEPROM的ACK信号;入口: TXBUF 寄存器; BUSSTA 寄存器;出口: EEPROM 存储器; BUSSTA 寄存器;======================================I2CTXB BCF STATUS,RP0BSF BUSSTA,TX_PROGRESSBCF BUSSTA,TX_SUCCESSMOVLW 0X08MOVWF BCOUNTTXLOOP CLRWDTBSF STATUS,RP0BCF TRISC,SCLNOPBCF TRISC,SDABCF STA TUS,RP0RLF TXBUF,FBSF STATUS,RP0BTFSC STATUS,CBSF TRISC,SDANOPBSF TRISC,SCLNOPNOPBCF STA TUS,RP0DECFSZ BCOUNT,FGOTO TXLOOP;---------------------------------------;检测是EEPROM否有ACK信号产生,产生为正常;检测方法:; 1. 将RC口的SCL.SDA分别设置为输出和输入状态; 2. 延时2个指令周期,将SCL设置为高电平; 3. 延时2个指令周期,检测RC口SDA的状态; 4. 如果为高电平,设置错误状态,返回; 5. 如果为低电平,延时2个指令周期后,将RC口SCL设置为低电平,继续执行;---------------------------------------BSF STATUS,RP0BCF TRISC,SCLBSF TRISC,SDANOPNOPBSF TRISC,SCLNOPBCF STA TUS,RP0BTFSC RC,SDAGOTO TX_ERRBSF STATUS,RP0BCF TRISC,SCLBCF STA TUS,RP0BCF BUSSTA,TX_PROGRESSBSF BUSSTA,TX_SUCCESSBCF BUSSTA,ACK_ERRORGOTO TX_ENDTX_ERR BCF BUSSTA,TX_PROGRESSBCF BUSSTA,TX_SUCCESSBSF BUSSTA,ACK_ERRORTX_END RETURN;=======================================;从EEPROM中读出 8 位的数据,并发送发送ACK信号;入口: EEPROM 存储器; BUSCON 寄存器;出口: RXBUF 寄存器; BUSSTA 寄存器;=======================================I2CRXB BCF STA TUS,RP0BSF BUSSTA,RX_PROGRESSBCF BUSSTA,RX_SUCCESSMOVLW 0X08MOVWF BCOUNTRXLOOP CLRWDTBSF STATUS,RP0BCF TRISC,SCL ;定义TRISC<SCL>为输出BSF TRISC,SDA ;定义TRISC<SDA>为输入NOPNOPBSF TRISC,SCL ;TRISC<SCL>输出高电平NOPBCF STA TUS,RP0BCF STA TUS,CBTFSC RC,SDA ;原指令为BTFSC TRISC,SDA BSF STATUS,CRLF RXBUF,FDECFSZ BCOUNT,FGOTO RXLOOP;---------------------------------------;发送ACK信号到EEPROM;判断接收的是否为最后一个字节;LAST_BYTE_RX为1,是 SDA发送一个高电平,结束;LAST_BYTE_RX为0,不是 SDA发送一个低电平ACK,继续接收;---------------------------------------BSF STATUS,RP0BCF TRISC,SCLBCF TRISC,SDABTFSC BUSCON,LAST_BYTE_RX ;检测是否是最后一个字节 BSF TRISC,SDA ;是最后一个字节NOP ;发送ACK信号BSF TRISC,SCLNOPNOPNOPNOPBCF TRISC,SCLBCF STA TUS,RP0BCF BUSSTA,RX_PROGRESSBSF BUSSTA,RX_SUCCESSRETURN;=======================================;I2C 开始信号;输入: 无;输出: BUFSSTA<BUS_BUSY>;=======================================I2CSTARTBSF STATUS,RP0BSF TRISC,SDA ;1USNOP ;1USBSF TRISC,SCL ;1USNOPNOPBCF TRISC,SDANOPNOPBCF STATUS,RP0BSF BUSSTA,BUS_BUSYRETURN;=======================================;I2C 结束信号;输入: 无;输出: BUSSTA<BUS_BUSY>;=======================================I2CSTOPBSF STATUS,RP0BCF TRISC,SCLBCF TRISC,SDABSF TRISC,SCLNOPNOPBSF TRISC,SDANOPBCF STATUS,RP0BCF BUSSTA,BUS_BUSYRETURN;=======================================; D10 @; clock in 4Mhz; delay 10ms;=======================================D10 MOVLW 0X0DMOVWF REG1LOOP2 MOVLW 0XFFMOVWF REG2LOOP1 DECFSZ REG2,fGOTO LOOP1DECFSZ REG1,fGOTO LOOP2RETURN;=======================================I2CERR CLRWDTNOPNOPNOPRETURNEND硬件I2C的主模式,只能在具有MSSP模块的单片机里实现,如PIC16F87X,而PIC16C7X 的SSP只能启用I2C从模式。
如何利用PIC16F877A单片机读写AT24C系列储存器
如何利用PIC16F877A单片机读写AT24C系列储存器
AT24C系列在增强型PIC实验板上编程的硬件原理图如下图所示,U7为实验板上24C02芯片,SDA与单片机的RB5口相连,SCL与单片机RB4相连,七段数码管D5、D7、D8组成了显示单元,字形码的数据通过RC口送入,各数码管的显示片选信号分别不同的RA口进行控制。
在MPLab IDE软件中新建工程,加入源程序代码,同时进行芯片型号的选择和配置位的设置,我们实验所用的芯片型号为PIC16F877A。
编写的程序代码如下,其中程序流程图如下图所示。
软件代码
编好程序后将编译好的HEX码通过ICD2仿真烧写器烧入单片机芯片,上电运行,主程序中在O×01地址写入了“O×55”,在O×02地址写入了“O×aa”,然后在while循环中读出O×02地址的值,也就是我们之前写入的“O×55”,读出后显示在数码管上,我们可以看到数码管显示“170”,即“O×aa”相应的十进制数。
PIC单片机的读-修改-写问题及解决方案
PIC单片机的读/修改/写问题及解决方案何谓读-修改-写,导致的问题及其解决之道:只要PICmicro 的命令,所处理的FILE (暂存器,内存,和I/O 的统称),其最终的值,和命令处理前的值有关,那么,这种命令便是所谓的读-修改-写命令。
因为这类命令的操作,可以再细分为三个小步骤,即是读(READ),修改(MODIFY),接著才是写(WRITE)。
如:ADDWF,DECF,IORWF,XORWF,BSF,BCF,EE 等等皆是。
在使用这类命令的时候,如果所处理的FILE 是I/O, 就必须要特别小心。
因为,假设任务电压为5V;而您在PORTB 的8 支脚,没有串接电阻,分别接了8 颗二极管(也许是LED)到地。
如果,您在先前下了BSF PORTB,0 这条命令,使得PORTB 第0 脚上的LED 亮了。
当您再运行了BSF PORTB,1 这条命令后,虽然PORTB 第1 脚上的LED 亮了,但是,PORTB 第0 脚上的LED 却会熄掉。
原因是因为,运行BSF PORTB,1 时,会先将整个PORTB 的值往回读,而它读到的PORTB 第0 脚,却是相当於低电位(被二极管拉为0.7V)。
当它再把整个PORTB 的值写出去的时候,PORTB 第0 脚就被写成低电位,自然灯就熄了。
解决之道是:串电阻,或者不要直接对I/O 作读-修改-写命令。
另外还有一类要注意的状况是:如当您将BSF PORTB,0 和BSF PORTB,1 两条命令连在一起,没有空运行时,纵使您没有上一段所述线路设计不良之状况,有时候您也会发现PORTB, 0 的高电位也会不见了。
导致这个现象的原因是:因为也许您这两支脚的外面接了长导线,有相当大的电容、电感性会阻止电位的变化;而且,PIC 命令运行是在最后1/4 周期时写出,而在第一个1/4 周期时读入,PORTB,0 还来不及升至高电位,便被下一个命令读回去了。
[QL200]PIC16F877AAD转换程序+PICC
QL200,AD转换程序,PIC16F877A,PICC//软件思路:选择RAO做为模拟输入通道;// 连续转换4次再求平均值做为转换结果// 最后结构只取低8位// 结果送数码管的低3位显示//硬件要求:拨码开关S14第2位置ON,第1位置OFF// 拨码开关S6全部置ON,S5第4-6位置ON,第1-3位置OFF// 为不影响结果,其他拨码开关置OFF。
#include<pic.h> //包含单片机内部资源预定义__CONFIG(0x1832);//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡 const char TABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0X82,0XF8,0X80,0X90};//定义常数0-9的数据表格void DELAY(); //delay函数申明void init(); //I/O口初始化函数申明void display(int x); //显示函数申明//------------------------------------------------//主程序开始void main(){int result=0x00; //定义转换结果寄存器while(1) //死循环{int i; //定义循环次数控制寄存器result=0x00; //转换结果清0for(i=5;i>0;i--) //求5次转换结果的平均值{init(); //调用初始化函数ADGO=0X1; //开启转换过程while(ADGO); //等待转换完成result=result+ADRESL; //累计转换结果}result=result/5; //求5次结果的平均值display(result); //调用显示函数}}//-----------------------------------------------//初始化函数void init(){PORTA=0XFF;PORTD=0XFF; //熄灭所有显示TRISA=0X1; //设置RA0为输入,其他为输出TRISD=0X00; //设置D口全为输出ADCON1=0X8E; //转换结果左对齐,RA0做模拟输入口,其它做普通I/O ADCON0=0X41; //系统时钟Fosc/8,选择RA0通道,允许ADC工作DELAY(); //保证采样延时}//-----------------------------------------------//显示函数void display(int x){int bai,shi,ge,temp; //定义4个临时变量temp=x; //暂存AD转换的结果bai=temp/0x64; //求显示的百位shi=(temp%0x64)/0xa; //求显示的十位ge=(temp%0x64)%0xa; //求显示的个位PORTD=TABLE[bai]; //查表得百位显示的代码PORTA=0x37; //RA3输出低电平,点亮百位显示DELAY(); //延时一定时间,保证显示亮度PORTD=TABLE[shi]; //查表得十位显示的代码PORTA=0x2F; //RA4输出低电平,点亮十位显示DELAY(); //延时一定时间,保证亮度PORTD=TABLE[ge]; //求个位显示的代码PORTA=0x1F; //RA5输出低电平,点亮个位显示DELAY(); //延时一定时间,保证亮度}//----------------------------------------------//延时程序void DELAY() //延时程序{int i; //定义整形变量for(i=0x100;i--;); //延时}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[QL200]软件模拟93LC46B读写程序[PIC16F877A+汇编];功能说明:;1.做一个灯的左移,将左移的8个码建于TABLE中.;2.从TABLE中取出数据并以16位的方式存入93C46中,地址00H-03H.;3.将93C46的00H-03H地址中的数据码取出并存入877A的RAM(30H)-(37H),并输出至877A的RC口. ;当断电再复电,数据码不会消失.;4.本电路所使用93C46为ATMEL或MICROCHIP的,或不是该厂的,则烧写时间会有差异;必须调整本程序的DELAY时间;本实战的目的是让大家进上步熟悉SPI通信的时序,熟悉93C46的读写,会用软件模拟SPI通信;硬件接法:;1.93C46的CS接877A的RB1口;CLK接877A的RB2口;DI接877A的RB4口;DO接877A的RB5口;93C46的ORG端接VCC,使93C46工作于16位方式;2.在实验过程中不要按动同样接在RB口的按键,和打开B口的LED,以免影响通信时序.;3.实验板上拔码开关S11要置ON,其它拔码开关都关闭。
;************************************LIST P=16F877A, R=DECinclude "P16F877A.inc";***********************************__CONFIG_DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_W DT_OFF&_HS_OSC;芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡;************************************ 定义查表偏移量READ EQU 0 ;读93C46WRITE EQU 1 ;写入93C46EWEN EQU 2 ;93C46写入使能EWDS EQU 3 ;93C46写入禁止;*************************************定义引脚位地址CS EQU 1CLK EQU 2DI EQU 4DO EQU 5;*********************ADR46 EQU 20HF1 EQU 23HF2 EQU 24HF3 EQU 25HF4 EQU 26HF5 EQU 27HF6 EQU 28HF7 EQU 29H;**********************ORG 000HNOP ;放置一条ICD必需的空操作指令GOTO MAINORG 0008H;****************************************************** TABLEADDWF PCL ,1 ;查表,PORTC一个灯左移RETLW 01HRETLW 02HRETLW 04HRETLW 08HRETLW 10HRETLW 20HRETLW 40HRETLW 80H;******************************************************* TO9346MOVWF F1 ;将W的值送F1暂存BSF PORTB ,CS ;写入起始位1BSF PORTB ,DIBSF PORTB ,CLKCALL DELAYBCF PORTB ,CLKCALL DELAYMOVFW F1ADDWF PCL ,1GOTO SREAD ;读GOTO SWRITE ;写GOTO SEWEN ;写使能GOTO SEWDS ;写禁止;*****************************************************MAINMOVLW 00HMOVWF PORTC ;LED先全部熄灭MOVLW 20HMOVWF PORTB ;除DO外,其它通信口全送0 BSF STATUS,RP0 ;定义RA口,RC口全部为输出MOVLW 20HMOVWF TRISB ;RB口5脚为入,其它全为出CLRWMOVWF TRISC ;RC口全为输出.MOVWF OPTION_REG ;开启RB口内部弱上拉BCF STATUS,RP0;*************************************LOOPCLRF 21H ;取码指针CLRF ADR46 ;93C46的地址00H MOVLW 04HMOVWF 22H ;4组8个码STARTMOVLW EWEN ;写入使能CALL TO9346MOVFW 21H ;载入取码指针CALL TABLE ;至TABLE 取码MOVWF F5 ;存入"写入寄存器" INCF 21H ,1 ;取下一个码MOVFW 21HCALL TABLE ;至TABLE 取码MOVWF F4MOVLW WRITECALL TO9346 ;写入数据MOVLW EWDSCALL TO9346 ;写禁止INCF 21H ,1 ;取下一个码INCF ADR46 ,1 ;取下一个地址CALL DELAY1DECFSZ 22H ,1 ;直到写完四个地址GOTO STARTMOVLW 30H ;存入877A的RAM首地址MOVWF FSRCLRF ADR46 ;93C46的地址00MOVLW 04HMOVWF 22H ;读93C46的四个地址,8个码;*****************A1MOVLW READCALL TO9346 ;读地址中的数据MOVFW F5MOVWF INDF ;读出的数据存入877A的RAM INCF FSR ,1MOVFW F4MOVWF INDFINCF ADR46 ,1 ;读下一个地址INCF FSR ,1DECFSZ 22H ,1 ;直到读完四个地址GOTO A1A2MOVLW 08HMOVWF 22HMOVLW 30H ;RAM 30h-37H 共8个码MOVWF FSROUTPUTMOVFW INDFMOVWF PORTC ;输出结果到PORTCCALL DELAY1INCF FSR ,1DECFSZ 22H ,1GOTO OUTPUTGOTO A2;***************************SREADMOVLW 80HADDWF ADR46 ,0 ;6位地址加上两位操作码,10XXXXXX 读指令CALL SDT46 ;写入操作码与地址CALL RDT46 ;读高位数据MOVWF F5 ;存入F5CALL RDT46 ;读低位地址MOVWF F4 ;存入F4GOTO EX9346;**************************SWRITEMOVLW 40HADDWF ADR46 ,0 ;6位地址加上两位操作码01XXXXXX 写指令CALL SDT46 ;写入操作码及地址MOVFW F5 ;载入数据CALL SDT46 ;写入数据MOVFW F4 ;载入数据CALL SDT46 ;写入数据GOTO EX9346;******************************SEWENMOVLW 30H ;写入操作码0011XXXX 写使能指令CALL SDT46GOTO EX9346;******************************SEWDSCLRW ;写入0000XXXX写禁止指令CALL SDT46;******************************EX9346BCF PORTB ,CS ;结束时清CS为0RETURN;******************************SDT46:MOVWF F2 ;将要写的数据送F2 MOVLW 08H ;写入8位数据MOVWF F3SD1:RLF F2 ,1BSF PORTB ,DIBTFSS STATUS ,CBCF PORTB ,DIBSF PORTB ,CLKCALL DELAYBCF PORTB ,CLKCALL DELAYDECFSZ F3 ,1GOTO SD1RETURN;******************************RDT46MOVLW 08H ;读出8位数据MOVWF F3RD1BSF PORTB ,CLKCALL DELAYBCF PORTB ,CLKCALL DELAYBSF STATUS ,CBTFSS PORTB ,DOBCF STATUS ,CRLF F2 ,1DECFSZ F3 ,1GOTO RD1MOVFW F2 ;读得的数据送W RETURN;******************************** DELAYMOVLW 1FH ;CLK时序廷时MOVWF F7DECFSZ F7 ,1GOTO $-1RETURN;******************************* DELAY1 ;廷时MOVLW .20MOVWF F4D1MOVLW .40MOVWF F5D2MOVLW .248MOVWF F6DECFSZ F6 ,1GOTO $-1DECFSZ F5 ,1GOTO D2DECFSZ F4 ,1GOTO D1RETURN;******************************************** end ;源程序结束。