vs2008编写c++程序步骤

vs2008编写c++程序步骤
vs2008编写c++程序步骤

1. 打开vs2008后会出现如下界面(图1),你会看到左边的”解决方案资源管理器”(后面要用到),如果没有,可以从视图里打开(图1-1).

图1

图1-1

2.从“文件”中新建“项目”(图2).单击“项目”后会出现图2-1.在“项目类型”中选择“win32",在"模板"中选择"win32控制台应用程序"。然后,在"名称"中输入程序夹名称,并在“位置”中输入储存位置。点击“确定”,出现图2-2,点击“下一步”,选择随后窗口里的“空项目”(其他项不做修改),点击“完成”。

图2

图2-1

图2-2

3.做完上一步骤后,”解决方案资源管理器”会发生改变(图3),右击其中的“源文件”,选择“添加”“新建项”(图3-1)。随后会出现图3-2,按图中选择各项,并在“名称”中输入程序名,最后点击“添加”。

图3

图3-1

图3-2

4. 如图所示,输入代码(注意:vs2008中没有.h这种东西,要改为“#include”并使用标准名字空间“using namespace std;”,另外,有些头文件要稍作修改比如math.h改为cmath)。

5. 调试。调试如图步骤。

6. 点击后会出现如图, 点击“是”, 程序运行。

24C02读写程序

HT49 MCU系列单片机读写HT24系列的EEPROM应用范例HT49 MCU系列单片机读写HT24系列的EEPROM应用范例文件编码:HA0017s 简介: HT24系列的EEPROM是通过I2C协议控制其读写的。HT49系列单片机的接口部分是简单I/O 口,可以用来很方便地采用I2C协议控制周边器件。 HT24系列的EEPROM总共8个管脚,三个为芯片地址脚A0、A1、A2,在单片机对它进行操作时,从SDA输入A0、A1、A2数据和芯片外部A0、A1、A2所接地址需一一对应。一个为芯片写保护脚WP,WP脚接低电平时,芯片可进行读写操作;WP脚接高时,芯片只可进行读,不可进行写。另外两个管脚为电源脚VCC,VSS。 用单片机对HT24系列的EEPROM进行控制时,HT24系列的EEPROM的外部管脚VCC、VSS、WP、A0、A1、A2根据需要,对应接上,SDA、SCL接到单片机控制脚上。 引脚名称I/O 功能描述 A0~A2 I 地址输入 VSS I 电源负极输入 SDA I/O 串行数据输入/输出 SCL I 串行数据传送时钟信号输入 WP I 写保护 VCC I 电源正极输入 HT24系列的EEPROM根据型号不同,EEPROM的容量大小不同,当EEPROM的空间大于1页(256bytes)时,即大于2048bits,则HT49 MCU需要控制A0、A1、A2来确定写HT24系列的EEPROM的第几页,HT24系列的EEPROM空间大小如下表所示: 型号引脚A0、A1及A2使用方法容量大小 HT24LC02 A0、A1、A2引脚作为器件地址输入,从SDA输入A0、A1、 A2数据和芯片引脚A0、A1、A2所接状态需一一对应 2K(256×8) HT24LC04 A1、A2引脚作为器件地址输入,从SDA输入A1、A2数据 和芯片引脚A1、A2所接状态需一一对应,A0引脚浮空 4K(512×8, 2pages) HT24LC08 A2引脚器件地址输入,从SDA输入A2数据和芯片引脚A2 所接状态需一一对应,其余引脚浮空 8K(1024×8, 4pages) HT24LC16 A0、A1、A2全部浮空,不必接16K(2048×8,8pages)

24c02读写程序教学资料

24c02读写程序

E2PROM芯片24C02的读写程序 一、实验目的: 给24C02的内部RAM写入一组数据,数据从24C02内部RAM的01h开始存放。然后再把这组数据读出来,检验写入和读出是否正确。 在这里我们给24C02中写入0、1、2的段码,然后把它读出来,送到数码管显示。 二、理论知识准备: 上面两个实验主要学习的是利用单片机的串口进行通讯,本实验要介绍的是基于I2C总线的串行通讯方法,下面我们先介绍一下I2C总线的相关理论知识。 (一)、I2C总线概念 I2C总线是一种双向二线制总线,它的结构简单,可靠性和抗干扰性能好。目前很多公司都推出了基于I2C总线的外围器件,例如我们学习板上的24C02芯片,就是一个带有I2C总线接口的E2PROM存储器,具有掉电记忆的功能,方便进行数据的长期保存。 (二)、I2C总线结构 I2C总线结构很简单,只有两条线,包括一条数据线(SDA)和一条串行时钟线(SCL)。具有I2C接口的器件可以通过这两根线接到总线上,进行相互之间的信息传递。连接到总线的器件具有不同的地址,CPU根据不同的地址进行识别,从而实现对硬件系统简单灵活的控制。 一个典型的I2C总线应用系统的组成结构如下图所示(假设图中的微控制器、LCD驱动、E2PROM、ADC各器件都是具有I2C总线接口的器件):

我们知道单片机串行通讯的发送和接收一般都各用一条线TXD和RXD,而I2C总线的数据线既可以发送也可以接受,工作方式可以通过软件设置。所以,I2C总线结构的硬件结构非常简洁。 当某器件向总线上发送信息时,它就是发送器,而当其从总线上接收信息时,又成为接收器。 (三)、I2C总线上的数据传送 下面我们看看I2C总线是如何进行数据传送的。我们知道,在一根数据线上传送数据时必须一位一位的进行,所以我们首先研究位传送。 1、位传输 I2C总线每传送一位数据必须有一个时钟脉冲。被传送的数据在时钟SCL的高电平期间保持稳定,只有在SCL低电平期间才能够改变,示意图如下图所示,在标准模式下,高低电平宽度必须不小于4.7us。 那么是不是所有I2C总线中的信号都必须符合上述的有效性呢?只有两个例外,就是开始和停止信号。 开始信号:当SCL为高电平时,SDA发生从高到低的跳变,就定义为开始信号。 停止信号:当SCL为高电平时,SDA发生从低到高的跳变,就定义为结束信号。 开始和结束信号的时序图如下图所示:

实现存储器EEPROM AT24C02的数据读写操作 采用IIC总线读写 C程序

/*************************************************************** 功能:11:32 2008-6-27 作者:SG 时间:2004-03-15 版本:V1.0 ***************************************************************/ #include "INTRINS.H" #include "reg52.h" #define WriteDeviceAddress 0xa0 //写驱动地址指令 #define ReadDeviceAddress 0xa1 //读驱动地址指令 sbit AT24C02_SCL = 0xa4; sbit AT24C02_SDA = 0xa5; /*------------------------------------------------------------- 功能:发起始信号 ------------------------------------------------------------*/ void Start_Cond() { AT24C02_SCL = 0; _nop_(); AT24C02_SDA = 1; _nop_(); AT24C02_SCL = 1; _nop_(); AT24C02_SDA = 0; _nop_(); } /*------------------------------------------------------------- 功能:发停止信号 ------------------------------------------------------------*/ void Stop_Cond() { AT24C02_SCL = 0; _nop_(); AT24C02_SDA = 0; _nop_(); AT24C02_SCL = 1; _nop_(); AT24C02_SDA = 1; _nop_();

51单片机实验程序

3 3 3 用查表方式编写y=x1 +x2 +x3 。(x 为0~9 的整数) #include void main() { int code a[10]={0,1,8,27,64,125,216,343,512,729}; //将0~9 对应的每位数字的三次方的值存入code中,code为程序存储器,当所存的值在0~255 或-128~+127 之间的话就用char ,而现在的值明显超过这个范围,用int 较合适。int 的范围是0~65535 或-32768~32767 。 int y,x1,x2,x3; //此处定义根据习惯,也可写成char x1,x2,x3 但是变量y 一定要用int 来定义。 x1=2; x2=4; x3=9; //x1,x2,x3 三个的值是自定的,只要是0~9 当中的数值皆可,也可重复。 y=a[x1]+a[x2]+a[x3]; while(1); //单片机的程序不能停,这步就相当于无限循环的指令,循环的内容为空白。 } //结果的查询在Keilvision 软件内部,在仿真界面点击右下角(一般初始位置是右下角)的watch 的框架内双击“double-click or F2 to add”文字输入y 后按回车,右侧会显示其16 进制数值如0x34,鼠标右键该十六进制,选择第一行的decimal,可查看对应的10 进制数。 1、有10 个8 位二进制数据,要求对这些数据进行奇偶校验,凡是满足偶校验的 数据(1 的个数为偶数)都要存到内RAM50H 开始的数据区中。试编写有关程序。 #include void main() { int a[10]={0,1,5,20,24,54,64,88,101,105}; // 将所要处理的值存入RAM 中,这些可以根据个人随意设定,但建议不要超过0~255 的范围。 char i; // 定义一个变量 char *q=0x50; // 定义一个指针*q 指向内部0x50 这个地址。 for(i=9;i>=0;i--) //9~0 循环,共十次,也可以用for(i=0;i<10;i++) { ACC=a[i]; //将a[i] 的值赋给累加器ACC if (P==0) //PSW0 位上的奇偶校验位,如果累加器ACC 内数值1 的个数为偶数那么P 为0,若为奇数,P 为1。这里的P 是大写的。 { *q=a[i]; q++; // 每赋一个值,指针挪一个位置指向下一个。 } } while(1); //同实验一,程序不能停。 }

51单片机考试常见试题简答 题

简答题部分 1、什么叫堆栈? 答:堆栈是在片内RAM中专门开辟出来的一个区域,数据的存取是以"后进先出"的结构方式处理的。实质上,堆栈就是一个按照"后进先出"原则组织的一段内存区域。 2、进位和溢出? 答:两数运算的结果若没有超出字长的表示范围,则由此产生的进位是自然进位;若两数的运算结果超出了字长的表示范围(即结果不合理),则称为溢出。 3、在单片机中,片内ROM的配置有几种形式?各有什么特点? 答:单片机片内程序存储器的配置形式主要有以下几种形式:(1)掩膜(Msak)ROM型单片机:内部具有工厂掩膜编程的ROM,ROM中的程序只能由单片机制造厂家用掩膜工艺固 化,用户不能修改ROM中的程序。掩膜ROM单片机适合于 大批量生产的产品。用户可委托芯片生产厂家采用掩膜方法 将程序制作在芯片的ROM。 (2)EPROM型单片机:内部具有紫外线可擦除电可编程的只读存储器,用户可以自行将程序写入到芯片内部的EPROM 中,也可以将EPROM中的信息全部擦除。擦去信息的芯片 还可以再次写入新的程序,允许反复改写。 (3)无ROM型单片机:内部没有程序存储器,它必须连接程序存储器才能组成完整的应用系统。 无ROM型单片机价格低廉,用户可根据程序的大小来选择外接 程序存储器的容量。这种单片机扩展灵活,但系统结构较复 杂。 (4)E2ROM型单片机:内部具有电可擦除叫可编程的程序存储器,使用更为方便。该类型目前比较常用 (5) OTP(One Time Programmable)ROM单片机:内部具有一次可编程的程序存储器,用户可以在编程器上将程序写入片 内程序存储器中,程序写入后不能再改写。这种芯片的价 格也较低。 4、什么是单片机的机器周期、状态周期、振荡周期和指令周期?它们之间是什么关系? 答:某条指令的执行周期由若干个机器周期(简称M周期)构成,一个机器周期包含6个状态周期(又称时钟周期,简称S周期),而一个状态周期又包含两个振荡周期(P1和P2,简称P周期)。也就是说,指令执行周期有长有短,但一个机器周期恒等于6个状态周期或12个振荡周

24c02读写程序大全

24c02读写程序大全 2C总线的应用(24C02子程序) // 对24C02的读、写 // extern void DelayMs(unsigned int); // extern void Read24c02(unsigned char *RamAddress,unsigned char Ro mAddress,unsigned char bytes); // extern void Write24c02(unsigned char *RamAddress,unsigned char Ro mAddress,unsigned char bytes); /***************************************************************************/ #define WriteDeviceAddress 0xa0 #define ReadDviceAddress 0xa1 #include #include #include /***************************************************************************/ sbit SCL=P2^7; sbit SDA=P2^6; bit DOG; /***************************************************************************/ void DelayMs(unsigned int number) { unsigned char temp; for(;number!=0;number--,DOG=!DOG) { for(temp=112;temp!=0;temp--) { } } } /***************************************************************************/ void Start() { SDA=1; SCL=1; SDA=0; SCL=0; } /***************************************************************************/ void Stop() { SCL=0; SDA=0;

单片机如何运行程序

单片机如何运行程序 知道了单片机通过I/O口与外设打交道,也知道了单片机的程序与数据如何保存,到底单片机是如何运行程序的?原来单片机和其他微机一样,也拥有一个中央处理器(CPU),它是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU 负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。它在单片机中的核心地位见图2.10所示。它通过单片机的内部总线,将单片机内部的各个部分:程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等联系在一起,内部总线有三种:数据总线,专门用来传送数据信息,地址总线专门用来传送地址信息,选中各操作单元,控制总线专门用来传送CPU各种控制命令,以便CPU统一指挥协调工作。完成程序所要执行的各种功能。CPU执行程序一般包括两个主要过程:第一,就是从程序存储器中取出指令,指令的地址由PC指针提供,在前面我们已经知道,PC指针在CPU取指后会自动加一,所以PC指针总是指向下一个将要取出的指令代码或操作数。这样,就能保证程序源源不断往下执行。第二,就是执指过程,取出的指令代码首先被送到CPU中控制器中的指令寄存器,再通过指令译码器译码变成各种电信号,从而实现指令的各种功能。 4.怎样保证CPU工作? 现在我们知道了单片机怎样取指、执指,即怎样运行程序了。那么怎样才能保证CPU有序的工作?这就必须提到单片机的两个非常重要的外围电路:单片机的时钟电路和复位电路。在单片机上面有两个引脚,分别是它的第18、19脚,其功能如下。

Pin19:时钟XTAL1脚,片内振荡电路的输入端。 Pin18:时钟XTAL2脚,片内振荡电路的输出端。 89S51的时钟有两种方式,一种是片内时钟振荡方式,但需在18和19脚外接石英晶体和振荡电容,振荡电容的值一般取10p~30p。另外一种是外部时钟方式,即将XTAL1接地,外部时钟信号从XTAL2脚输入。如图2.11 当时钟电路起振后,产生一定频率的时钟信号,单片机的CPU在时钟信号的控制下,就能一步一步完成自己的工作。通常我们必须了解以下几种周期。 【振荡周期】:单片机外接石英晶体振荡器的周期。如外接石英晶体的频率若为12MHz,这其振荡周期就是1/12微秒。 【状态周期】:单片机完成一个最基本的动作所需的时间周期。如扫描一次定时器T0引脚状态所需要的时间。一个状态周期=2个振荡周期。 【机器周期】:单片机完成一次完整的具有一定功能的动作所需的时间周期。如一次完整的读操作或写操作对应的时间。一个机器周期=6个状态周期。 【指令周期】:执行完某条指令所需要的时间周期,一般需要1~4个机器周期,如MUL AB指令是四机器周期指令。一个指令周期=1~4个机器周期。 单片机工作时,除了需要时钟支持外,还必须有一个初始状态,即单片机的复位状态。在单片机外部引脚第9脚,就是专门给单片机提供复位脉冲的。 Pin9:RESET/Vpd复位信号复用脚,当89S51通电,时钟电路开始工作,在RESET 引脚上出现24个时钟周期以上的高电平,系统即初始复位。

ATMEGA16读写iic(TWI)(24c02) C语言程序

ATMEGA16读写iic(24c02) C语言程序测试通过 #include #include "I2C.h" #include "1602.h" #include "delay.h" /*通过AVR往I IC写数据,并通过串口把数据读出显示出来*/ //=============================================================== void UART_init(void) //UART初始化 { DDRD = 0x02; PORTD = 0x00; UCSRA = 0x02; /*无倍速*/ UCSRB = 0x18; /*允许接收和发送*/ UC SRC = 0x06; /*8位数据,1位停止位,无校验*/ UBRRH = 0x00; UBRRL = 12; /*9600*/ } //=============================================================== void USART_TXD(float data) //发送采用查询方式 { while( !(UCSRA & BIT(UDRE)) ); UDR=data; while( !(UCSRA & BIT(TXC )) ); UCSRA|=BIT(TXC); } void main(void) { unsigned char i; //LCD_init(); uart_init();//TART初始化 SEI(); //全局中断使能

while(1) {/* I2C_Write('n',0x00); I2C_Write('c',0x01); I2C_Write('e',0x02); I2C_Write('p',0x03); I2C_Write('u',0x04); */ i=I2C_Read(0x00); //LCD_write_char(0,0,i); USART_TXD(i); i=I2C_Read(0x01); //LCD_write_data(i); USART_TXD(i); i=I2C_Read(0x02); //LCD_write_data(i); USART_TXD(i); i=I2C_Read(0x03); //LCD_write_data(i); USART_TXD(i); i=I2C_Read(0x04); //LCD_write_data(i); USART_TXD(i); } } /*上面上主函数部分*/ #include #include "delay.h" //I2C 状态定义 //MT 主方式传输 MR 主方式接受#define START 0x08 #define RE_START 0x10 #define MT_SLA_ACK 0x18 #define MT_SLA_NOACK 0x20 #define MT_DATA_ACK 0x28 #define MT_DATA_NOACK 0x30 #define MR_SLA_ACK 0x40 #define MR_SLA_NOACK 0x48 #define MR_DATA_ACK 0x50 #define MR_DATA_NOACK 0x58

应广单片机读写24C02程序代码

应广单片机读写24C02程序代码 #include "extern.h" #include "main.h" //*************************************************** //*************************************************** //??ò?I2C?ó?ú I2C_SDA equ pb.2 I2C_SCL equ pb.0 I2C_SDA_DIR equ pbc.2 I2C_SCL_DIR equ pbc.0 I2C_LONG_DLY equ 50 I2C_SHORT_DLY equ 20 I2C_SDA_HIGH equ set1 I2C_SDA I2C_SDA_LOW equ set0 I2C_SDA I2C_SCL_HIGH equ set1 I2C_SCL I2C_SCL_LOW equ set0 I2C_SCL I2C_SDA_OUTPUT equ set1 I2C_SDA_DIR I2C_SDA_INPUT equ set0 I2C_SDA_DIR I2C_SCL_OUTPUT equ set1 I2C_SCL_DIR I2C_SCL_INPUT equ set0 I2C_SCL_DIR //??ò?I2C??á? uchar i2c_rw_addr; //?áD?μ??? uchar i2c_rw_byte; //?áD?êy?Y uchar i2c_rw_cmd; //?áD?μ????tμ??? uchar i2c_rw_temp; //?áD??y?ì?D????á? uchar i2c_rw_cnt; //?áD??y?ì?D????á? //---------------------------- //?úéúSTARTD?o? //---------------------------- i2c_start: I2C_SDA_OUTPUT

ATMEL 24c02使用详解(汇编及C程序都有)

ATMEL 24c02使用详解 原文地址: https://www.360docs.net/doc/8e6593431.html,/Blog/cns!2FEAB5F0F11F7A67!296.entry ATMEL 24c02使用详解 I2C总线是一种用于IC器件之间连接的二线制总线。它通过SDA(串行数据线)及SCL (串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个 器件:不管是单片机、存储器、LCD驱动器还是键盘接口。 1.I2C总线的基本结构采用I2C总线标准的单片机或IC器件,其内部不仅有I2C 接口电路,而且将内部各单元电路按功能划分为若干相对独立的模块,通过软 件寻址实现片选,减少了器件片选线的连接。CPU不仅能通过指令将某个功能单元电路挂*或摘离总线,还可对该单元的工作状况进行检测,从而实现对硬件系统的 既简单又灵活的扩展与控制。I2C总线接口电路结构如图1所示。 2.双向传输的接口特性传统的单片机串行接口的发送和接收一般都各用一条线,如MCS51系列的TXD和RXD,而I2C总线则根据器件的功能通过软件程序使其可工作 于发送或接收方式。当某个器件向总线上发送信息时,它就是发送器(也叫主器件),而当其从总线上接收信息时,又成为接收器(也叫从器件)。主器件用于启动总 线上传送数据并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。I2C总线的控制完全由挂接在总线上的主器件送出的地址和数据决定。在总 线上,既没有中心机,也没有优先机。 总线上主和从(即发送和接收)的关系不是一成不变的,而是取决于此时数据传送的方向。SDA和SCL均为双向I/O线,通过上拉电阻接正电源。当总线空闲时,两 根线都是高电平。连接总线的器件的输出级必须是集电极或漏极开路,以具有线“与”功能。I2C总线的数据传送速率在标准工作方式下为100kbit/s,在快速方式 下,最高传送速率可达400kbit/s。 3.I2C总线上的时钟信号在I2C总线上传送信息时的时钟同步信号是由挂接在SCL 时钟线上的所有器件的逻辑“与”完成的。SCL线上由高电平到低电平的跳变 将影响到这些器件,一旦某个器件的时钟信号下跳为低电平,将使SCL线一直保持低电平,使SCL线上的所有器件开始低电平期。此时,低电平周期短的器件的时钟 由低至高的跳变并不能影响SCL线的状态,于是这些器件将进入高电平等待的状态。 当所有器件的时钟信号都上跳为高电平时,低电平期结束,SCL线被释放返回高电平,即所有的器件都同时开始它们的高电平期。其后,第一个结束高电平期的

STM32F103读写24C02程序使用过肯定能用

//实验24C02连接在PF口 //WP、A0、A1、A2都接地 #include "stm32f10x_flash.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #define AT24C02 0xa0 //AT24C02 地址 /******************************** 变量定义---------------------------------------------------------*/ GPIO_InitTypeDef GPIO_InitStructure; //GPIO ErrorStatus HSEStartUpStatus; unsigned char Count1 , Count2; unsigned int USEC; static vu32 TimingDelay; unsigned char Readzfc; unsigned char pDat[8] = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55}; unsigned char R_Dat[8]; /*********************************声明函数-----------------------------------------------*/ void RCC_Configuration(void); void SysTick_Configuration(void); void Delay_us_24C02(u32 nTime); /************************************24C02硬件接口******************************/ #define SData GPIO_Pin_6 //I2C 时钟 #define SCLK GPIO_Pin_7 //I2C 数据 /********************************宏定义*******************************************/ #define SCL(x) x ? GPIO_SetBits(GPIOF , SCLK) : GPIO_ResetBits(GPIOF , SCLK) #define SDA(x) x ? GPIO_SetBits(GPIOF , SData) : GPIO_ResetBits(GPIOF , SData) /********************************变量*******************************************/ u8 ack; /******************************************************************* 起动总线函数 函数原型: void Start_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. ********************************************************************/ void Start_I2c() { SDA(1); //SDA=1; 发送起始条件的数据信号 Delay_us_24C02(1); SCL(1); //SCL=1; Delay_us_24C02(5); //起始条件建立时间大于4.7us,延时 SDA(0); //SDA=0; /*发送起始信号*/ Delay_us_24C02(5); // 起始条件锁定时间大于4μs

怎么实现对存储器24C02程序的读写

决 怎么实现24C02程序的读写 我是个新手,对24C02 一窍不通,请问怎么给24C02写程序。是不是要像给单片机写程序那样需要一个编程器,或是需要其他的什么软硬件。另外再给我介绍一些24C02的入门知识,谢谢。 问题补充: 24C02是不是只是一个存储器?使用它时需不需要专门给它写段程序再烧进去? 我们将24c02 的两条总线接在了P26 和P27 上,因此,必须先定义: sbit SCL=P2^7; sbit SDA=P2^6; 在这个试验中,我们写入了一个字节数值0x88 到24c02 的0x02 的位置。 写入完成后,P10 灯会亮起,我们再在下一颗来读出这个字节来验证结果。――――――――――――― #define uchar unsigned char //定义一下方便使用 #define uint unsigned int #define ulong unsigned long #include //包括一个52 标准内核的头文件 //本课试验写入一个字节到24c02 中 char code dx516[3] _at_ 0x003b;//这是为了仿真设置的 #define WriteDeviceAddress 0xa0 //定义器件在IIC 总线中的地址 #define ReadDviceAddress 0xa1 sbit SCL=P2^7; sbit SDA=P2^6; sbit P10=P1^0; //定时函数 void DelayMs(uint number) { uchar temp; for(;number!=0;number--) { for(temp=112;temp!=0;temp--) ; } } //开始总线

51单片机多任务运行

51单片机多任务运行 最近发现有的幺弟在对系统的内核感兴趣,加上我也是部分内核的初学者,突然来兴,便用了两天写了一个简单的内核。这个内核简单得不能再简单了,加上空格行、大括号和详细的注解只有246行,还带了4个点亮LED的任务。至今为止我所见最简单的内核~~~ 就跟这个内核取个“多任务分时处理内核”吧!这个内核和ucos系统思想有很大的差异,但是能够帮助我们学习理解ucos系统,能够帮我们了解51的内部结构,以及大多数的单片机运行处理数据的原理~~~ 好废话就不说啦!希望我们能互相学习共同进步 1、先来讲讲原理: 首先,我们看书时会知道51单片机在执行中断的时候,会有以下几个步骤和几种情况。 根据KEIL的编译惯例(这个编译惯例你可以在编完程序后点仿真,里面有个后缀为.src 的文件,这个文件里面是一句C对应一句汇编,你就可以知道你编译的C代码它是怎么处理的,能帮助你学习汇编哦~~~),通常把进入中断后的所使用的通用寄存器组根据情况选择压栈。也就是说,中断前后使用的寄存器组可能不一样,中断前可能使用0,中断中可能使用1。如果使用的同一组寄存器,为了保存现场,KEIL就PUSH现场数据,然后POP 就行啦。但是keil很多时候不是你想象中那样,你叫它怎样他就怎样编译。所以在程序中嵌入了少量的汇编。 其实,嵌入汇编是很简单的事情。 只要在C代码中加入#pragma asm 和#pragma endasm并在他俩的中间加入汇编就行。别忘了还要在工程文件中添加C51S.LIB,这个文件在KEIL/C51/LIB中,这个文件也很重要,不然编译会出现警告,记得把文件类型选择为全部文件,不然看不见它。 接下来说说KEIL的中断汇编。在C51中,中断到来时,CPU响应中断保存当前PC 指针地址压栈SP所指地址。然后将PC指针指向中断向量地址,在中断向量地址中只有一句汇编程序:LJMP XX 意思是跳转到某地址。因为中断后只有8个寄存器,但是你的代码量远远不只有8个寄存器能装下的。这也就是说,响应中断后,先跳转到硬件规定的地址,再由那个地址跳转到中断程序入口。 然后,PC指针跳转到中断程序地址,开始从SP所指地址压栈ACC,B,DPH,DPL,PSW,按理说还需要压栈R0~R7,但KEIL一般是通过换通用寄存器来实现的(也就是改变RS1和RS0来实现的)。也就说KEIL根本不压栈R0~R7。 这个怎么能行,当然不行!不保存我们就不能完全的返回先前压栈的任务啦!好吧,那我们就只有手动保存压栈,这样不就行了,简单吧! 所以我们来帮它。已经通过前面知道它在进入中断的时候已经把中断前的PC指针压栈到中断前SP所指的地址了,所以进入中断后,实际在SP中断前所指地址中已经按顺序压栈了PC低8位,PC高8位,ACC,B,DPH,DPL,PSW总共7个数据,SP是向上增长的,也就是说每压一次堆栈SP+1。然后再把我们的R0~R7寄存器压入堆栈,这不就行啦,就保护现场所需的全部数据,就算有时R0~R7寄存器用不上我们也得加进去,为了为了保证正确的返回现场。 因此我们保存一次数据就需要7+8=15字节的堆栈,每个任务的起始地址保存一次,中间临时要保存一次,共需要15+15=30字节的堆栈。所以定义程序空间为现场保存空间为 0~29。名字叫:unsigned char TASK_STACK[TASK_MAX][30];//程序现场保存数组。TASK_MAX是程序个数,因为每一个程序都需要保存两次,每次15个变量来保存现场,并且51是8位的单片机所以用unsigned char。 然后就是程序现场保存数组的初始化使每个数据都是0。 首先,根据响应中断后的压栈顺序,知道了数组0位和1位保存的是中断前程序的地

E2PROM芯片24C02的读写程序

E2PR0M 芯片24C02的读写程序 一、实验目的: 给24C02的内部RAM写入一组数据,数据从24C02内部RAM的01h开始存放。然后再把这组数据读出来,检验写入和读出是否正确。 在这里我们给24C02中写入0、1、2的段码,然后把它读出来,送到数码管显示。 二、理论知识准备: 上面两个实验主要学习的是利用单片机的串口进行通讯,本实验要介绍的是基于I2C总线的 串行通讯方法,下面我们先介绍一下I2C总线的相关理论知识。 (—)、I2C总线概念 I2C总线是一种双向二线制总线,它的结构简单,可靠性和抗干扰性能好。目前很多公司都推出了基于I2C总线的外围器件,例如我们学习板上的24C02芯片,就是一个带有I2C总线接口的E2PROM存储器,具有掉电记忆的功能,方便进行数据的长期保存。 (二)、I2C总线结构 I2C总线结构很简单,只有两条线,包括一条数据线(SDA)和一条串行时钟线(SCL )。具有I2C 接口的器件可以通过这两根线接到总线上,进行相互之间的信息传递。连接到总线 的器件具有不同的地址,CPU根据不同的地址进行识别,从而实现对硬件系统简单灵活的 控制。 一个典型的I2C总线应用系统的组成结构如下图所示(假设图中的微控制器、LCD驱动、 E2PROM、ADC各器件都是具有I2C总线接口的器件): SDA SCL|| || || || 微控制器LCD驱动ADC E2PR0M 我们知道单片机串行通讯的发送和接收一般都各用一条线TXD和RXD,而I2C总线的数据 线既可以发送也可以接受,工作方式可以通过软件设置。所以,I2C总线结构的硬件结构非 常简洁。 当某器件向总线上发送信息时,它就是发送器,而当其从总线上接收信息时,又成为接收器。(三)、I2C总线上的数据传送 下面我们看看I2C总线是如何进行数据传送的。我们知道,在一根数据线上传送数据时必须 一位一位的进行,所以我们首先研究位传送。 1、位传输 I2C总线每传送一位数据必须有一个时钟脉冲。被传送的数据在时钟SCL的高电平期间保 持稳定,只有在SCL低电平期间才能够改变,示意图如下图所示,在标准模式下,高低电平宽度必须不小于 4.7us。

24c02读写程序大全

51晶振为 〖文件〗 2001/09/18 --------------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------------------------------------------- 调用方式:void WriteIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address,unsigned char ddata) ﹫2001/09/18 函数说明:对于IIC芯片24CXX,在指定地址address写入一个字节ddata 调用方式:unsigned char ReadIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address) ﹫2001/09/18 函数说明:读取IIC芯片24CXX,指定地址address的数据。 -----------------------------------------------------------------------------------------------------------------*/ #include "" #include "" sbit SCL= P2^7; sbit SDA= P2^6; enum EEPROMTYPE {IIC24C01,IIC24C01A,IIC24C02,IIC24C04,IIC24C08,IIC24C16,IIC24C32,IIC24C64,IIC24C128 ,IIC24C256}; enum EEPROMTYPE eepromtype; delay() { unsigned int i=1200; while(i--); } /*---------------------------------------------------------------------------- 调用方式:write_8bit(unsigned char ch) ﹫2001/03/23 函数说明:内函数,私有,用户不直接调用。 -------------------------------------------------------------------------------*/ void write_8bit(unsigned char ch)

E2PROM芯片24C02的读写程序

E2PROM芯片24C02的读写程序 一、实验目的: 给24C02的内部RAM写入一组数据,数据从24C02内部RAM的01h开始存放。然后再把这组数据读出来,检验写入和读出是否正确。 在这里我们给24C02中写入0、1、2的段码,然后把它读出来,送到数码管显示。 二、理论知识准备: 上面两个实验主要学习的是利用单片机的串口进行通讯,本实验要介绍的是基于I2C总线的串行通讯方法,下面我们先介绍一下I2C总线的相关理论知识。 (一)、I2C总线概念 I2C总线是一种双向二线制总线,它的结构简单,可靠性和抗干扰性能好。目前很多公司都推出了基于I2C总线的外围器件,例如我们学习板上的24C02芯片,就是一个带有I2C总线接口的E2PROM存储器,具有掉电记忆的功能,方便进行数据的长期保存。 (二)、I2C总线结构 I2C总线结构很简单,只有两条线,包括一条数据线(SDA)和一条串行时钟线(SCL)。具有I2C接口的器件可以通过这两根线接到总线上,进行相互之间的信息传递。连接到总线的器件具有不同的地址,CPU根据不同的地址进行识别,从而实现对硬件系统简单灵活的控制。 一个典型的I2C总线应用系统的组成结构如下图所示(假设图中的微控制器、LCD驱动、E2PROM、ADC各器件都是具有I2C总线接口的器件): 我们知道单片机串行通讯的发送和接收一般都各用一条线TXD和RXD,而I2C总线的数据线既可以发送也可以接受,工作方式可以通过软件设置。所以,I2C总线结构的硬件结构非常简洁。 当某器件向总线上发送信息时,它就是发送器,而当其从总线上接收信息时,又成为接收器。(三)、I2C总线上的数据传送 下面我们看看I2C总线是如何进行数据传送的。我们知道,在一根数据线上传送数据时必须一位一位的进行,所以我们首先研究位传送。 1、位传输 I2C总线每传送一位数据必须有一个时钟脉冲。被传送的数据在时钟SCL的高电平期间保持稳定,只有在SCL低电平期间才能够改变,示意图如下图所示,在标准模式下,高低电平宽度必须不小于4.7us。

24c02典型程序

#include #include #include #define uchar unsigned char #define uint unsigned int #define adwrite 0xae //24c02地址(写) #define adread 0xaf //24c02地址(读) uchar num_wr[4]={'a','b','c','d'}; //存放写入数据(液晶显示abcd)//uchar num_rd[4]; //存放读24c02回的数据 /******************************************* 函数名称:delayms() 功能:延迟j毫秒 参数:char j 返回值:无 ********************************************/ void delayms(uchar j) { uint i; for(;j>0;j--) { for(i=0;i<125;i++) {;} } } /******************************************* 函数名称:rom_write() 功能:循环写进num个字节 参数:如下 返回值:无 ********************************************/ void rom_write(uchar date[],uchar address,uchar num) { uchar i; // 循环次数 iic_start(); iic_write(adwrite); // 24c02写地址 iic_ack(); iic_write(address); // 24c02起始存储地址写入可自动+1 iic_ack(); for(i=0;i

相关文档
最新文档