multisim52单片机头文件
multisim仿真教程--单片机应用

图13.2.8存储器内部数据
第25页,共36页。
13.2.3交通灯管理控制器
1. 创建交通灯管理控制器 在电路工作区建立一个交通灯管理控制器电路如图13.2.9
所示。
第26页,共36页。
图13.2.9 交通灯管理控制器电路
第27页,共36页。
2.程序编写与汇编 单击MCU菜单可选择“MCU Code Manager(微控制器代码管
掌握单片机仿真平台的使用和单片机应用电路的仿真设计与分析方法是本章的重 点。注意单片机应用系统要求,单片机型号的选择,电路设计、电路功能的模块 化、程序编写和编译等设计技巧。解决一个实际问题,可以采用不同的单片机应 用电路形式。
第36页,共36页。
第13页,共36页。
图13.2.2 微控制器代码管理器对话框
第14页,共36页。
单击MCU →MCU 8051U1→ Debug View ,进入图13.2.3所示调 试对话框,窗口的上方显示简易计算器(Calculator)的程序, 在窗口下方的编译信息栏显示相关编译信息,程序汇编是否正确 将给出提示信息。如果程序有错误,点击出错提示信息,光标会 自动跳到程序出错处,检查错误并修改,直到编译通过。源程序 编译通过后,单击启动仿真按钮或者单击Simulate→Run,则可 进行加载仿真。注:详细的源程序请参考NI Multisim 10评估版 中Samples→ MCU Sample Circiut文件夹中的Calculator.asm (C:\Program Files\National Instruments\Circuit Design Suite 10.0\samples\MCU Sample Circuits\805x Samples\Calculator)。
51单片机C语言头文件及其使用

51单片机C语言头文件及其使用2007-05-29 16:33很多初学单片机者往往对C51的头文件感到很神秘,而为什么要那样写,甚至有的初学者喜欢问,P1口的P为什么要大写,不大写行不行呢?其实这样的问题,看过本文后,就会明白。
其实这个是在头文件中用sfr定义的,现在定义好了的是这样的sfr P1 = 0x90;,也就是说,到底大写,还是小写,就是在这里面决定的。
这就说明,如果你要用小写,就得在头文件中改为小写。
其实它都是为了编程序方便才这样写的,在程序编译时,就会变成相应的地址(如P1就变成了0x90)。
还有一点就是,现在有很多改进型的单片机,它们有很多新增的特殊功能寄存器在标准的reg51.h或reg52.h中没有定义,这就需要自己加进头文件(相关厂家已经把它们定义好了),当然也可以直接在程序中定义。
下面是一个标准的C51头文件:(此文件一般在C:\KEIL\C51\INC下,INC文件夹根目录里有不少头文件,并且里面还有很多以公司分类的文件夹,里面也都是相关产品的头文件。
如果我们要使用自己写的头文件,使用的时候只需把对应头文件拷贝到INC文件夹里就可以了。
)/* BYTE Registers */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;/* 8052 Extensions */sfr T2CON = 0xC8;sfr RCAP2L = 0xCA;sfr RCAP2H = 0xCB;sfr TL2 = 0xCC;/* BIT Registers */ /* PSW */sbit CY = PSW^7;sbit AC = PSW^6;sbit F0 = PSW^5;sbit RS1 = PSW^4;sbit RS0 = PSW^3;sbit OV = PSW^2;sbit P = PSW^0; //8052 only/* TCON */sbit TF1 = TCON^7;sbit TR1 = TCON^6;sbit TF0 = TCON^5;sbit TR0 = TCON^4;sbit IE1 = TCON^3;sbit IT1 = TCON^2;sbit IE0 = TCON^1;sbit IT0 = TCON^0;/* IE */sbit EA = IE^7;sbit ET2 = IE^5; //8052 onlysbit ES = IE^4;sbit ET1 = IE^3;sbit EX1 = IE^2;sbit ET0 = IE^1;sbit EX0 = IE^0;/* IP */sbit PT2 = IP^5;sbit PS = IP^4;sbit PT1 = IP^3;sbit PX1 = IP^2;sbit PT0 = IP^1;sbit PX0 = IP^0;/* P3 */sbit RD = P3^7;sbit WR = P3^6;sbit T1 = P3^5;sbit INT1 = P3^3;sbit INT0 = P3^2;sbit TXD = P3^1;sbit RXD = P3^0;/* SCON */sbit SM0 = SCON^7;sbit SM1 = SCON^6;sbit SM2 = SCON^5;sbit REN = SCON^4;sbit TB8 = SCON^3;sbit RB8 = SCON^2;sbit TI = SCON^1;sbit RI = SCON^0;/* P1 */sbit T2EX = P1^1; // 8052 onlysbit T2 = P1^0; // 8052 only/* T2CON */sbit TF2 = T2CON^7;sbit EXF2 = T2CON^6;sbit RCLK = T2CON^5;sbit TCLK = T2CON^4;sbit EXEN2 = T2CON^3;sbit TR2 = T2CON^2;sbit C_T2 = T2CON^1;sbit CP_RL2 = T2CON^0;还有一点就是,现在有很多改进型的单片机,它们有很多新增的特殊功能寄存器在标准的reg51.h或reg52.h中没有定义,这就需要自己加进头文件(相关厂家已经把它们定义好了),当然也可以直接在程序中定义。
自制51常用头文件(黑色护眼版)

#define LCD_GO_HOME
0x02 // AC=0,光标、画面回HOME位
//设置显示、光标及闪烁开、关
#define LCD_DISPLAY_ON
0x0C // 显示开
#define LCD_DISPLAY_OFF
0x08 // 显示关
#define LCD_CURSOR_ON
0x0A // 光标显示
LCM_RW = 0; LCM_E = 0; LCM_E = 0;
// 若晶振速度太高可以在这后加小的延时 // 延时
LCM_E = 1;
}
/***************************************************** 函 数 名:void WriteCommandLCM() 功 能:向LCM1602中写入指令 说 明:向LCM中写入指令;如果BuysC=0时,忽略忙检测,如果BuysC=1时,不忽略忙检测 入口参数:WCLCM,BuysC 返 回 值:无
void Delay_LCD(void)
{ uint TempCyc = 5552; // 放入延时数据
while(TempCyc--)
{
;
}
}
/***************************************************** 函 数 名:uchar ReadStatusLCM() 功 能:读忙状态 说 明:判断LCM的工作状态;也可以不用此函数,用一段延时程序代替 入口参数:无 返 回 值:LCM_Data
*****************************************************/
//LCM初始化
multisim单片机仿真的例子

multisim单片机仿真的例子实验四、定时/计数器实验一、实验目的掌握单片机定时/计数器的内部结构和工作方式。
掌握单片机定时/计数器的应用。
二、实验原理1、定时/计数器的工作方式与控制寄存器MCS-51系列单片机内部包含两个十六位的定时/计数器T0和T1,当被设为定时方式时,实际上对机器周期计数,每个机器周期计数器加1直至溢出。
当被设为计数方式时,则对加在T0(P3.4)或T1(P3.5)引脚上的外部脉冲计数。
单片机中与定时/计数器相关的特殊功能寄存器(SFR)有定时/计数器控制寄存器(TCON)和定时/计数器模式寄存器(TMOD)。
模式寄存器TMOD的字节地址为89H,其各位的定义如下:M1 0 0 1 1GATE C/T M1 M0 GATE C/T M1 M0 T1控制 T0控制 M0 0 1 0 1工作模式模式0 模式1 模式2 模式313位定时/计数方式 16位定时/计数方式 8位自动重装载方式对T0:分为一个8位的定时/计数器TL0和一个8位的定时器TH0 对T1:停止计数C/T=0,设为定时器方式,C/T=1,设为计数器方式。
GATE=0,定时/计数器的启动和停止完全由TRi位控制。
GATE=1,只有当TRi位置位并且INTi引脚为高电平时才启动计数器。
控制寄存器TCON的字节地址为88H,其各位的定义如下:TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0定时/计数器外中断控制TRi:定时/计数器启停控制,TRi=1启动定时/计数器(当GATE=0时)。
TFi:定时/计数器溢出标志,当定时/计数器溢出时,由硬件置位,CPU响应中断时,自动清零。
2、定时初值的计算当单片机的振荡频率为fOSC,则机器周期为12?(2L12fOSC,设定时初值为TC,则定时周期为:t??TC)fOSCLTC?2?t?fOSC12其中L为计数器的位数,模式0时L=13,模式1时L=16,模式2、模式3时L=8。
MULTISIM 与KEIL-C互联的方法

MULTISIM 与KEIL-C互联的方法。
文章发表于:2009-03-23 09:46
以下是我用multisim与keic互联做的一个简单的流水灯。
与大家交流,有附件(multisim文件和KEILC的HEX文件与C程序。
)
第一步:新建一个空电路文件,点元件栏里的MCU,选8051,,放到工作区,这时弹出一个对话框。
第二步:在对话框中输入workspace的名称,点next,在弹出的对话框中的project type项选中选load erternal hex file,好了别点next了,直接点finish就完成电路创建了。
第三步:按下图连接电路。
第四步:接下来就是写keil-c的程序了,在附件里面有。
大家直接下载就可以看到了。
第五步:写好KEIL_C的程序后,multisim左侧设计栏里的MCU的图标,点code manager,在弹出对话框的左侧选中工程名,在对话框的右侧把写好的hex文件装进去就ok了。
第六步:运行电路,灯就会一次闪烁起来啦。
Multisim10在51单片机仿真中的运用2

搭建电路设置MCU建好的电路图如图1所示,各器件的名称等信息如附表所示。
需要说明的是电路图中的单片机不用连接晶振也可以进行仿真,时钟频率(速度)的设置见下文。
图1 带复位功能的简单计数器的电路图附表搭建电路时,当将单片机U1放入电路图中时,会出现MCU向导,如图2所示。
第一步,分别输入工作区路径和工作区名称。
工作区名称任意,这里输入MCUCosimWS。
第二步,如图3所示,在项目类型(Proj ect type)下拉框有两个选项:标准(Standard)和加载外部Hex文件(Load External Hex File),你可以在Kei l等环境下编写汇编和C源程序,然后生成Hex文件,再通过“加载外部Hex文件”导入。
限于篇幅这里选标准(Standard),接着在“编程语言”(Programming language)下拉框里会有两个选项:C和汇编(Asse mbly),如果选择C,则在汇编器/编译器工具(Assembler/Compiler tool)下拉框会出现Hi-Tech C51-Lite c ompiler,我们这里选择汇编(Assembly),则出现8051/8052 Metalink assembler。
接下来在项目名称(Pr oject name)里输入名称,如CosimProject。
第三步,如图4所示,对话框里有两个选项:创建空项目(Cr eate empty project)和添加源文件(Add source file)。
选择添加源文件,点击完成。
保存文件,键入M10C osim作为文件名,然后查看“设计工具箱”(Design Toolbox),应如图5所示。
你可能更愿意用C来编写程序,而不是汇编,或两个都用,或还想引入外部Hex文件,这都可以通过用“MCU代码管理器”添加MCU项目来解决。
在设计工具箱里右键单击MCUCosimWS,选择“MCU代码管理器”(MCU Code Manager),点击“新MCU项目”(New MCU Project)按钮,选择“项目类型”(Proje ct Type),可以是标准(Standard)或加载外部Hex文件(Load External Hex File),这里选“标准”,接着输入名称,如Cosim_C_Project,确定后就可以在MCU代码管理器对话框里进行下一步设置了,可以创建新文件,设置汇编器/编译器等等。
单片机经验总结8---单片机常用芯片的头文件以及c51模块

单片机经验总结8 #ifndef __ADC_H__#define __ADC_H__#define ADC_POWER 0x80 //ADC 电源控制位#define ADC_FLAG 0x10 //ADC 完成标志#define ADC_START 0x08 //ADC 启动控制位//ADC转换速度选择#define ADC_SPEEDLL 0x00 //420 clocks#define ADC_SPEEDL 0x20 //280 clocks#define ADC_SPEEDH 0x40 //140 clocks#define ADC_SPEEDHH 0x60 //70 clocksunsigned int AD_Result_Temp;unsigned int GetADCResult (unsigned char chan); //ADC 转换处理,查询方式#endif//C文件#ifndef __ADC_C__#define __ADC_C__#include <adc.h>//#include <cbit.h>/*----------------------------初始化ADC 寄存器中断方式----------------------------void InitADC(){unsigned unsigned char chan=0;P1ASF = 0xff; //设置P1口全部为ADC通道ADC_RES = 0; //清除高8位缓冲数据ADC_RESL = 0; //清除低2位缓冲数据ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | chan;_nop_();_nop_(); //打开ADC}*///----------------------------//ADC 中断处理//----------------------------/*void adc_isr() interrupt 5 using 1{unsigned unsigned int AD_Result_TempADC_CONTR &= !ADC_FLAG; //清除ADC 中断标志位return (((AD_Result_Temp|ADC_RES)<<2)+ADC_RESL); //返回10位ADC转换结果if (++ch > 7) ch = 0; //却换到下一个通道ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | chan;}*/unsigned int GetADCResult(unsigned char chan){AD_Result_Temp=0;ADC_RES=0;ADC_RESL=0;ADC_CONTR = ADC_POWER | ADC_SPEEDHH | chan | ADC_START;_nop_(); //Must wait before inquiry_nop_();_nop_();_nop_();while (!(ADC_CONTR & ADC_FLAG));//等待完成ADC_CONTR &= ~ADC_FLAG; //关闭ADC转换AD_Result_Temp=(((AD_Result_Temp|ADC_RES)<<2)+ADC_RESL);return AD_Result_Temp;}#endif//74HC595//发送完一个8位数据,就锁存一次// 8个数码管,可以这样做// for(i=0;i<8;i++)// {// Send_HC595(....//要发送的8为数据);// Show_595();// }/********************************************************//* *//*将显示数据送入74HC595内部移位寄存器*//* *//********************************************************/void Send_HC595(INT16U LED_DATA){INT8U i;for(i=0;i<8;i++){HC595_DS=LED_DATA&0x80;HC595_SHCP=1; //上升沿发生移位_nop_();_nop_();HC595_SHCP=0;LED_DATA=LED_DATA<<1;}}/********************************************************//* *//*将移位寄存器内的数据锁存到输出寄存器并显示*//* *//********************************************************/void Show_595(void){HC595_STCP=0;_nop_();_nop_();HC595_STCP=1; //上升沿将数据送到输出锁存器_nop_();_nop_();HC595_STCP=0;}//74HC164#ifndef __74LS164_H__#define __74LS164_H__extern void Write_Bit8(unsigned char bit_8){unsigned char i;for(i=8;i>0;i--) //数码管段8位数据{Data=bit_8&0x80; //传送一位数据CLK=0;CLK=1;bit_8=bit_8<<1;}}#endif20位串口A/D转换器CS551320位串口A/D转换器CS5513 接口程序2010-03-22 14:56//cs5513接口的C51官方程序//cs5513返回长整型数据//CS=0时表示片选有效,当然可以直接接地,这样可以节省一个I/O口sbit ADCS=P2^0;sbit ADCLK=P2^1;sbit ADDO=P2^2;unsigned long int ADConv(void){uchar i;unsigned long int Result=0;ADCLK=0;ADCS=0;_nop_();_nop_();_nop_();ADCLK=0;while(ADDO);ADCLK=1;_nop_();for(i=0;i<3;i++){ADCLK=0;_nop_();ADCLK=1;}for (i=0;i<20;i++){ADCLK=0;Result=Result<<1;if (ADDO)Result=Result+1;ADCLK=1;}ADCS=1;return Result;}//LCD SMC12864-05#ifndef _CRYFUCNS_H_#define _CRYFUCNS_H_void Send(unsigned char type,unsigned char transdata);void Init_LCD(void);void Clear_GDRAM(void);void Disp_HZ(unsigned char addr,const unsigned char * pt,unsigned char num);void Draw_PM(const unsigned char *ptr);void Draw_TX(unsigned char Yaddr,unsigned char Xaddr,const unsigned char * dp) ;void Disp_SZ(unsigned char addr,unsigned char shuzi);#endif#include <cryfucns.h>#include <STC12C5A.H>#include<intrins.h>#include <types.h>extern const INT8U shuzi_table[];void Send(INT8U type,INT8U transdata);/**********液晶控制IO的宏定义*************/sbit RS_CS = P0^0;sbit RW_SDI = P0^1;sbit E_CLK = P0^2;/*******************************************函数名称:delay_Nus功能:延时N个us的时间参数:n--延时长度返回值:无********************************************/void delay_Nus(INT16U n){INT8U i;for(i = n;i > 0;i--)_nop_();}/*******************************************函数名称:delay_1ms功能:延时约1ms的时间参数:无返回值:无********************************************/void delay_1ms(void){INT8U i;for(i = 150;i > 0;i--) _nop_();}/*******************************************函数名称:delay_Nms功能:延时N个ms的时间参数:无返回值:无********************************************/void delay_Nms(INT16U n){INT16U i = 0;for(i = n;i > 0;i--)delay_1ms();}/*******************************************函数名称:Ini_Lcd功能:初始化液晶模块参数:无返回值:无********************************************/void Init_LCD(void){delay_Nms(100); //延时等待液晶完成复位Send(0,0x30); /*功能设置:一次送8位数据,基本指令集*/delay_Nus(72);Send(0,0x02); /*DDRAM地址归位*/delay_Nus(72);Send(0,0x0c); /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/delay_Nus(72);Send(0,0x01); /*清屏,将DDRAM的位址计数器调整为“00H”*/delay_Nus(72);Send(0,0x06); /*功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1*/ delay_Nus(72);}/*******************************************函数名称:Send功能:MCU向液晶模块发送1一个字节的数据参数:type--数据类型,0--控制命令,1--显示数据transdata--发送的数据返回值:无********************************************/void Send(INT8U type,INT8U transdata){INT8U firstbyte = 0xf8;INT8U temp;INT8U i,j = 3;if(type) firstbyte |= 0x02;RS_CS=1;E_CLK=0;while(j > 0){if(j == 3) temp = firstbyte;else if(j == 2) temp = transdata&0xf0;else temp = (transdata << 4) & 0xf0;for(i = 8;i > 0;i--){if(temp & 0x80) RW_SDI=1;else RW_SDI=0;E_CLK=1;temp <<= 1;E_CLK=0;}//三个字节之间一定要有足够的延时,否则易出现时序问题if(j == 3) delay_Nus(600);else delay_Nus(200);j--;}RW_SDI=0;RS_CS=0;}/*******************************************函数名称:Clear_GDRAM功能:清除液晶GDRAM内部的随机数据参数:无返回值:无********************************************/void Clear_GDRAM(void){INT8U i,j,k;Send(0,0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){Send(0,i++);Send(0,0x80);for(k = 0;k < 16;k++){Send(1,0x00);}}i = 0x80;for(j = 0;j < 32;j++){Send(0,i++);Send(0,0x88);for(k = 0;k < 16;k++){Send(1,0x00);}}Send(0,0x30); //回到基本指令集}/*******************************************函数名称:Disp_HZ功能:显示汉字程序参数:addr--显示位置的首地址pt--指向显示数据的指针num--显示数据的个数返回值:无********************************************/ void Disp_HZ(INT8U addr,const INT8U * pt,INT8U num) {INT8U i;Send(0,addr);for(i = 0;i < (num*2);i++)Send(1,*(pt++));}/*******************************************函数名称:Draw_PM功能:在整个屏幕上画一个图片参数:ptr--指向保存图片位置的指针返回值:无********************************************/ void Draw_PM(const INT8U *ptr){INT8U i,j,k;Send(0,0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){Send(0,i++);Send(0,0x80);for(k = 0;k < 16;k++){Send(1,*ptr++);}}i = 0x80;for(j = 0;j < 32;j++){Send(0,i++);Send(0,0x88);for(k = 0;k < 16;k++){Send(1,*ptr++);}}Send(0,0x36); //打开绘图显示Send(0,0x30); //回到基本指令集}/*******************************************函数名称:Draw_TX功能:在液晶上描绘一个16*16的图形参数:Yaddr--Y地址,Xaddr--X地址dp--指向保存图形数据的指针返回值:无********************************************/void Draw_TX(INT8U Yaddr,INT8U Xaddr,const INT8U * dp){INT8U j;INT8U k = 0;Send(0,0x34); //使用扩展指令集,关闭绘图显示for(j = 0;j < 16;j++){Send(0,Yaddr++); //Y地址Send(0,Xaddr); //X地址Send(1,dp[k++]); //送两个字节的显示数据Send(1,dp[k++]);}Send(0,0x36); //打开绘图显示Send(0,0x30); //回到基本指令集模式}/*******************************************函数名称:Disp_SZ功能:显示一个两位数字参数:addr--显示地址数字--显示的数字返回值:无********************************************/void Disp_SZ(INT8U addr,INT8U shuzi){INT8U tmp0,tmp1;tmp0 = shuzi / 10;tmp1 = shuzi % 10;Send(0,addr);Send(1,shuzi_table[tmp0]);Send(1,shuzi_table[tmp1]);}//STC 内部EEPROM 操作程序#ifndef _EEPROM_H_#define _EEPROM_H_//定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数//#define ENABLE_ISP 0x80 //系统工作时钟<30MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x81 //系统工作时钟<24MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值#define ENABLE_ISP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x84 //系统工作时钟<6MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x85 //系统工作时钟<3MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x86 //系统工作时钟<2MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x87 //系统工作时钟<1MHz 时,对IAP_CONTR 寄存器设置此值#define FIRST 0x0000#define SECOND 0x200#define THIRD 0x400#define START_FLAG 0xE1union eeprom_addr{unsigned int temp16;unsigned char temp8[2];}addr16;void IAP_Disable (void); //关闭IAP 功能void Sector_Erase (unsigned int add); //擦除扇区void Byte_Program (unsigned int add, unsigned char ch); //字节编程,调用前需打开IAP 功能extern unsigned char Byte_Read (unsigned int add); //读一字节,调用前需打开IAP 功能#endif#include <eeprom.h>/*********************************************************************************************** 读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节************************************************************************************************ /unsigned char Byte_Read(unsigned int add){EA = 0;IAP_DATA = 0x00;IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间IAP_CMD = 0x01; //IAP/ISP/EEPROM 字节读命令addr16.temp16 = add;IAP_ADDRH = addr16.temp8[0]; //设置目标单元地址的高8 位地址IAP_ADDRL = addr16.temp8[1]; //设置目标单元地址的低8 位地址IAP_TRIG = 0x5A; //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动_nop_();IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关EA = 1;return (IAP_DATA);}/*********************************************************************************************** *****字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据************************************************************************************************ *****/void Byte_Program(unsigned int add, unsigned char ch){EA = 0;IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash操作等待时间IAP_CMD = 0x02; //IAP/ISP/EEPROM 字节编程命令addr16.temp16 = add;IAP_ADDRH = addr16.temp8[0]; //设置目标单元地址的高8 位地址IAP_ADDRL = addr16.temp8[1]; //设置目标单元地址的低8 位地址IAP_DATA = ch; //要编程的数据先送进IAP_DATA 寄存器IAP_TRIG = 0x5A; //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动_nop_();IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,EA = 1; //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}/*********************************************************************************************** *******擦除扇区, 入口:DPTR = 扇区地址************************************************************************************************ *******/void Sector_Erase(unsigned int add){EA = 0;IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇区擦除命令addr16.temp16 = add;IAP_ADDRH = addr16.temp8[0]; //设置目标单元地址的高8 位地址IAP_ADDRL = addr16.temp8[1]; //设置目标单元地址的低8 位地址IAP_TRIG = 0x5A; //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动_nop_();IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,EA = 1; //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}/*********************************************************************************************** *****关闭IAP 功能************************************************************************************************ *****/void IAP_Disable(){//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关IAP_CONTR = 0; //关闭IAP 功能IAP_CMD = 0; //清命令寄存器,使命令寄存器无命令,此句可不用IAP_TRIG = 0; //清命令触发寄存器,使命令触发寄存器无触发,此句可不用IAP_ADDRH = 0;IAP_ADDRL = 0;}//MAX186 程序#ifndef _MAX186_H_#define _MAX186_H_#include <stc12c5a.h>sbit MAX186_SCLK_1 = P1^0;sbit MAX186_CS_1 = P1^1;sbit MAX186_DIN_1 = P1^2;sbit MAX186_DOUT_1 = P1^3;sbit MAX186_SCLK_2 = P1^4;sbit MAX186_CS_2 = P1^5;sbit MAX186_DIN_2 = P1^6;sbit MAX186_DOUT_2 = P1^7;unsigned int Max186_AD(unsigned char chan);#endif#include <max186.h>unsigned int Max186_AD(unsigned char chan){unsigned char i,kki,ch;unsigned int i_data,i_datatransfer,addata;switch(chan){case 0: ch=0x8E;break;case 1: ch=0xCE;break;case 2: ch=0x9E;break;case 3: ch=0xDE;break;case 4: ch=0xAE;break;case 5: ch=0xEE;break;case 6: ch=0xBE;break;case 7: ch=0xFE;break;default: ch=0xAE;break;}MAX186_CS_2=1;MAX186_SCLK_2=0;MAX186_CS_2=0;MAX186_SCLK_2=0;for(i=0;i<8;i++){unsigned char adaddresstransfer;adaddresstransfer=ch;adaddresstransfer=(adaddresstransfer>>(7-i))&0x01;MAX186_DIN_2=adaddresstransfer;MAX186_SCLK_2=1;for(kki=0;kki<2;kki++);MAX186_SCLK_2=0;}MAX186_CS_2=1;for(i=0;i<6;i++);MAX186_CS_2=0;MAX186_SCLK_2=1;for(i=0;i<12;i++){MAX186_SCLK_2=1;MAX186_SCLK_2=0;i_datatransfer=MAX186_DOUT_2;i_datatransfer=i_datatransfer<<(11-i);i_data=i_data|i_datatransfer;}addata=i_data;for(i=0;i<4;i++){MAX186_SCLK_2=1;MAX186_SCLK_2=0;}MAX186_CS_2=1;i_data=i_datatransfer=0;delay(5);return(addata);}//SMC12864-05.H #ifndef _SMC12864_05_H_#define _SMC12864_05_H_#include<types.h>void Init_LCD();void SetOnOFF(bit Switch);void Clean_LCD();void Check_LCD_Status();void Write_Cmd(INT8U Cmd);void Set_Adrr(INT8U x,INT8U y);void Write_Data(INT8U Data);void Disp_HZ(INT8U addr,const INT8U * pt,INT8U num); #endif#include<SMC12864_05.H>#include<STC12C5A.H>#include<intrins.h>#include<delay.h>sbit RS_CS = P2^7;sbit RW_SDI = P2^6;sbit E_CLK = P2^5;sbit Busy_Bit = P0^7;void Init_LCD(){Write_Cmd(0x30); //基本指令集delay(1);Write_Cmd(0x02); // 地址归位delay(1);Write_Cmd(0x0c); //整体显示打开,游标关闭delay(1);Write_Cmd(0x01); //清除显示delay(1);Write_Cmd(0x06); //游标右移delay(1);Write_Cmd(0x80); //设定显示的起始地址Clean_LCD();SetOnOFF(1);}void Clean_LCD(){RS_CS=0;RW_SDI=0;P0=0x01;E_CLK=1;delay(1);E_CLK=0;}void SetOnOFF(bit Switch){RS_CS=0;RW_SDI=0;if(Switch==1)P0=0x0F;else P0=0x08;E_CLK=1;delay(1);E_CLK=0;}void Write_Cmd(INT8U Cmd){Check_LCD_Status();RS_CS=0;RW_SDI=0;P0=Cmd;E_CLK=1;delay(1);E_CLK=0;}void Write_Data(INT8U Data){Check_LCD_Status();RS_CS=1;RW_SDI=0;P0=Data;E_CLK=1;delay(1);E_CLK=0;}void Check_LCD_Status(){RS_CS=0;RW_SDI=1;P0=0xFF;E_CLK=1;delay(1);E_CLK=0;while(!Busy_Bit);}/*******************************************函数名称:Disp_HZ功能:控制液晶显示汉字参数:addr--显示位置的首地址pt--指向显示数据的指针num--显示字符个数返回值:无********************************************/void Disp_HZ(INT8U addr,const INT8U * pt,INT8U num){INT8U i;Write_Cmd(addr);for(i = 0;i < (num*2);i++)Write_Data(*(pt++));}单片机c51常用模块要包含一个单片机硬件的资源头文件。
自制51单片机常用头文件

自制51单片机常用头文件
#ifndef __COM_H__
#define __COM_H__
#define uchar unsigned char
#define uint unsigned int
#define XTAL 11059200 // CUP 晶振频率
#define baudrate 9600 // 通信波特率
void sendmsg(uint ps)
{
SBUF = ps; // 要发送的字符放入缓冲区
while(TI == 0); // 一直等等,直到发送完数据为止
TI = 0;
}
uint rcvmsg(void) //调用此函数前,要先调用RI,查看是否收到数据,确定已收到的话,再调用此函数
{
RI=0; //要先将RI=0再返回,否则,返回后,RI=0这句就不执行了。
return SBUF;
}
void initcom(void)
{
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate))); // 定时器1赋初值
SM0 = 0; //串口工作方式控制
SM1 = 1; //串口工作方式控制 //这两个共同控制了串口工作方式为 0;
REN = 1; //串口接收允许
PCON = 0x00;
TR1 = 1; //允许串口接收
ES = 0; //关闭串口中断
}
#endif。
自定义reg52.h头文件(单片机学习重难点核心知识点)

⾃定义reg52.h头⽂件(单⽚机学习重难点核⼼知识点)/*--------------------------------------------------------------------------⾃定义REG52头⽂件@auth lei@date 2017-05--------------------------------------------------------------------------*/#ifndef __REG52_H__#define __REG52_H__/* ⼀个字节的寄存器 */sfr P0 = 0x80;//双向IO,向外输出要接上拉电阻sfr P1 = 0x90;//准双向IO,作为输⼊要先置1sfr P2 = 0xA0;//准双向IO,作为输⼊要先置1sfr P3 = 0xB0;//准双向IO,作为输⼊要先置1,有第⼆功能sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;//中断控制寄存器sfr TMOD = 0x89;//定时器⼯作⽅式寄存器sfr TL0 = 0x8A;//定时器/计数器0低8位sfr TL1 = 0x8B;//定时器/计数器1低8位sfr TH0 = 0x8C;//定时器/计数器0⾼8位sfr TH1 = 0x8D;//定时器/计数器1⾼8位sfr IE = 0xA8;//中断允许寄存器sfr IP = 0xB8;//中断优先级寄存器sfr SCON = 0x98;sfr SBUF = 0x99;/* 8052单⽚机扩展的寄存器 */sfr T2CON = 0xC8;sfr RCAP2L = 0xCA;sfr RCAP2H = 0xCB;sfr TL2 = 0xCC;sfr TH2 = 0xCD;/* ⼀位长度的寄存器 *//* PSW */sbit CY = PSW^7;sbit AC = PSW^6;sbit F0 = PSW^5;sbit RS1 = PSW^4;sbit RS0 = PSW^3;sbit OV = PSW^2;sbit P = PSW^0; //8052 专⽤/*------------中断内容详解----------------------------*相关的寄存器* 1.IE中断允许寄存器* 2.TCON定时控制寄存器* 3.IP中断优先级寄存器(不常⽤)* 4.TMOD定时器⼯作⽅式寄存器(定时器/计数器中断才⽤到)*使⽤中断的步骤:* 1.中断初始化函数(只需要调⽤⼀次,不要放到循环⾥重复调⽤)* 2.编写中断处理函数* 3.主函数中调⽤中断初始化函数*------------中断内容详解----------------------------//* TCON定时控制寄存器 */sbit TF1 = TCON^7;//定时器/计数器中标志位:sbit TR1 = TCON^6;//定时器/计数器中1启动、停⽌:sbit TF0 = TCON^5;//定时器/计数器中0标志位:sbit TR0 = TCON^4;//定时器/计数器中断0启动、停⽌:sbit IE1 = TCON^3;//外部中断1中断标志位:中断产⽣时硬件置1,中断函数处理完后硬件置0sbit IT1 = TCON^2;//外部中断1触发⽅式:0为电平、1为下降沿sbit IE0 = TCON^1;//外部中断0中断标志位:中断产⽣时硬件置1,中断函数处理完后硬件置0sbit IT0 = TCON^0;//外部中断0触发⽅式:0为电平、1为下降沿/* IE中断允许寄存器 */sbit EA = IE^7;//中断总开关sbit ET2 = IE^5; //8052 专⽤sbit ES = IE^4;sbit ET1 = IE^3;//定时器/计数器中断1开关sbit EX1 = IE^2;//外部中断1开关sbit ET0 = IE^1;//定时器/计数器中断0开关sbit EX0 = IE^0;//外部中断0开关/* IP中断优先级寄存器 */sbit PT2 = IP^5;sbit PS = IP^4;sbit PT1 = IP^3;sbit PX1 = IP^2;sbit PT0 = IP^1;sbit PX0 = IP^0;/*------------------TMOD寄存器详解-----------------8位从⾼到低依次为:GATE C/T M1 M0 GATE C/T M1 M0{----配置定时器1----} {----配置定时器0----}GATE:门控位,由外部引脚(T0、T1)作为定时器的启动总开关:GATE=0时,T0和T1⽆效;GATE=1时,需要T0或者T1开关打开(⾼电平)定时器才能启动C/T:计数⽅式选择,C/T=0时⽤作定时器,C/T=1时⽤作计数器M1、M0:⼯作⽅式选择位,00为⼯作⽅式0,13位定时器/计数器,TH存放⾼8位,TL存放低5位01为⼯作⽅式1,16位定时器/计数器,TH存放⾼8位,TL存放低8位(常⽤)10为⼯作⽅式2,初值⾃动装载的8位定时器/计数器(常⽤)11为⼯作⽅式3,T0被分为两个8位独⽴计数器,T1停⽌⼯作*------------------TMOD寄存器详解-----------------//* P3⼝的第⼆功能 */sbit RD = P3^7;//外部存储器读选通信号sbit WR = P3^6;//外部存储器写选通信号sbit T1 = P3^5;//外部控制定时器/计数器1的启动(TMOD寄存器第7位GATE = 1时才有效),1为启动,0位停⽌sbit T0 = P3^4;//外部控制定时器/计数器0的启动(TMOD寄存器第3位GATE = 1时才有效),1为启动,0位停⽌sbit INT1 = P3^3;//外部中断1输⼊sbit INT0 = P3^2;//外部中断0输⼊sbit TXD = P3^1;//串⾏输出sbit RXD = P3^0;//串⾏输⼊/* SCON串⼝控制寄存器 */sbit SM0 = SCON^7;sbit SM1 = SCON^6;sbit SM2 = SCON^5;sbit REN = SCON^4;sbit TB8 = SCON^3;sbit RB8 = SCON^2;sbit TI = SCON^1;sbit RI = SCON^0;/* P1⼝第⼆功能 */sbit T2EX = P1^1; // 8052 专⽤sbit T2 = P1^0; // 8052 专⽤/* T2CON */sbit TF2 = T2CON^7;sbit EXF2 = T2CON^6;sbit RCLK = T2CON^5;sbit TCLK = T2CON^4;sbit EXEN2 = T2CON^3;sbit TR2 = T2CON^2;sbit C_T2 = T2CON^1;sbit CP_RL2 = T2CON^0;#endif。
单片机C语言头文件详解

单片机C语言头文件详解单片机中用c编程时头文件reg51.h及reg52.h解析我们在用c语言编程是往往第一行就是reg51.h或者其他的自定义头文件,我们怎么样来理解呢?1)“文件包含”处理。
程序的第一行是一个“文件包含”处理。
所谓“文件包含”是指一个文件将另外一个文件的内容全部包含进来。
程序中包含REG51.h文件的目的是为了要使用P1 (还有其他更多的符号)这个符号,即通知C 编译器,程序中所写的P1 是指80C51 单片机的P1 端口而不是其它变量。
这是如何做到的呢?打开reg51.h 可以看到这样的一些内容:(此文件一般在C:\KEIL\C51\INC下,INC文件夹根目录里有不少头文件,并且里面还有很多以公司分类的文件夹,里面也都是相关产品的头文件。
如果我们要使用自己写的头文件,使用的时候只需把对应头文件拷贝到INC文件夹里就可以了。
)/*---------------------------------------------------------REG51.HHeader file for generic 80C51 and 80C31 microcontroller.Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.------------------------------------------------------------*/#ifndef __REG51_H__#define __REG51_H__/* BYTE Register */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98; sfr SBUF = 0x99; /* BIT Register */ /* PSW */sbit CY = 0xD7; sbit AC = 0xD6; sbit F0 = 0xD5; sbit RS1 = 0xD4; sbit RS0 = 0xD3; sbit OV = 0xD2; sbit P = 0xD0;/* TCON */sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88; /* IE */sbit EA = 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA; sbit ET0 = 0xA9; sbit EX0 = 0xA8; /* IP */sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8; /* P3 */sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5; sbit T0 = 0xB4; sbit INT1 = 0xB3; sbit INT0 = 0xB2; sbit TXD = 0xB1;/* SCON */sbit SM0 = 0x9F;sbit SM1 = 0x9E;sbit SM2 = 0x9D;sbit REN = 0x9C;sbit TB8 = 0x9B;sbit RB8 = 0x9A;sbit TI = 0x99;sbit RI = 0x98;#endif熟悉80C51 内部结构的读者不难看出,这里都是一些符号的定义,即规定符号名与地址的对应关系。
C51单片机的头文件REG51 和REG52

/*--------------------------------------------------------------------------REG51.HHeader file for generic 80C51 and 80C31 microcontroller.Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.--------------------------------------------------------------------------*/#ifndef __REG51_H__#define __REG51_H__/* BYTE Register */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;/* BIT Register *//* PSW */sbit CY = 0xD7;sbit AC = 0xD6;sbit F0 = 0xD5;sbit RS1 = 0xD4;sbit RS0 = 0xD3;sbit P = 0xD0; /* TCON */sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88;/* IE */sbit EA = 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA; sbit ET0 = 0xA9; sbit EX0 = 0xA8; /* IP */sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8; /* P3 */sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5; sbit T0 = 0xB4; sbit INT1 = 0xB3; sbit INT0 = 0xB2; sbit TXD = 0xB1; sbit RXD = 0xB0; /* SCON */sbit SM0 = 0x9F; sbit SM1 = 0x9E; sbit SM2 = 0x9D; sbit REN = 0x9C; sbit TB8 = 0x9B;sbit TI = 0x99;sbit RI = 0x98;#endif--------------------------------------------------------------/*--------------------------------------------------------------------------REG52.HHeader file for generic 80C52 and 80C32 microcontroller.Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.--------------------------------------------------------------------------*/#ifndef __REG52_H__#define __REG52_H__/* BYTE Registers */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;/* 8052 Extensions */sfr T2CON = 0xC8;sfr RCAP2L = 0xCA;sfr RCAP2H = 0xCB;sfr TL2 = 0xCC;sfr TH2 = 0xCD;/* BIT Registers *//* PSW */sbit CY = PSW^7;sbit AC = PSW^6;sbit F0 = PSW^5;sbit RS1 = PSW^4;sbit RS0 = PSW^3;sbit OV = PSW^2;sbit P = PSW^0; //8052 only /* TCON */sbit TF1 = TCON^7;sbit TR1 = TCON^6;sbit TF0 = TCON^5;sbit TR0 = TCON^4;sbit IE1 = TCON^3;sbit IT1 = TCON^2;sbit IE0 = TCON^1;sbit IT0 = TCON^0;/* IE */sbit EA = IE^7;sbit ET2 = IE^5; //8052 onlysbit ES = IE^4;sbit ET1 = IE^3;sbit EX1 = IE^2;sbit ET0 = IE^1;sbit EX0 = IE^0;/* IP */sbit PT2 = IP^5;sbit PT1 = IP^3;sbit PX1 = IP^2;sbit PT0 = IP^1;sbit PX0 = IP^0;/* P3 */sbit RD = P3^7;sbit WR = P3^6;sbit T1 = P3^5;sbit T0 = P3^4;sbit INT1 = P3^3;sbit INT0 = P3^2;sbit TXD = P3^1;sbit RXD = P3^0;/* SCON */sbit SM0 = SCON^7;sbit SM1 = SCON^6;sbit SM2 = SCON^5;sbit REN = SCON^4;sbit TB8 = SCON^3;sbit RB8 = SCON^2;sbit TI = SCON^1;sbit RI = SCON^0;/* P1 */sbit T2EX = P1^1; // 8052 only sbit T2 = P1^0; // 8052 only /* T2CON */sbit TF2 = T2CON^7;sbit EXF2 = T2CON^6;sbit RCLK = T2CON^5;sbit TCLK = T2CON^4;sbit EXEN2 = T2CON^3;sbit TR2 = T2CON^2;sbit C_T2 = T2CON^1;sbit CP_RL2 = T2CON^0;#endif。
52单片机

2.5.3 AT89C52引脚及功能AT89C52的引脚如图2.7所示。
图2.7 单片机引脚图·P0口: P0 口是一组8 位漏极开路型双向I/O口,也即地址/数据总线复用口。
作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8 位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash 编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻[5]。
·P1 口: P1 是一个带内部上拉电阻的8 位双向I /O 口,P1 的输出缓冲级可驱动 4 个TTL 逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(TTL)。
Flash 编程和程序校验期间,P1 接收低8 位地址。
·P2 口:P2 是一个带有内部上拉电阻的8 位双向I/O口,P2 的输出缓冲级可驱动4 个TTL 逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX延安大学学士学位论文12@DPTR 指令)时,P2口送出高8 位地址数据。
在访问8位地址的外部数据存储器(如执行MOVX @RI 指令)时,P2 口线上的内容(也即特殊功能寄存器区 R2 寄存器的内容),在整个访问期间不改变。
Flash 编程或校验时,P2 亦接收高位地址和其它控制信号。
·P3 口: P3 口是一组带有内部上拉电阻的8 位双向I/O 口。
P3口输出缓冲级可驱动4 个TTL 逻辑门电路。
对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。
基于Multisim的单片机仿真

Multisim补充实验二:以单片机8051为核心的交通灯控制电路的仿真如今的电子电路已经很少再由若干个硬件器件拼接而成,而更多的则是以单片机、DSP、FPGA或ARM等可编程器件为核心,进行相关的编程处理再辅以适当的外围电路来设计实现。
Multisim从9.0版本开始,加入了MCU(Microprocessor Control Unit,,微处理机控制器)模块,使得该软件的实际应用能力得到了大大地增强。
本例将通过以单片机8051为核心的交通灯控制电路的仿真设计说明其基本应用方法。
(注:本例选自黄培根等编著《Multisim10计算机虚拟仿真实验室》一书,北京:电子工业出版社,2008。
如对MCU仿真设计有兴趣,还可参考聂典主编《Mumsim 9计算机仿真在电子电路设计中的应用》P460~472之范例。
)一、设计要求和分析在道路的十字路口,为了有序地指挥车辆和行人正常通行,都架有红绿灯,“红灯停,绿行”,这是大家所熟悉的交通规则。
实际的交通灯控制,除了红绿灯之外,在红绿灯之间还有一盏黄灯,它起一个过渡作用,即由红灯转换为绿灯或由绿灯转换为红灯之前,黄灯先闪亮几下,提醒正在通行的车辆行人加快通过道口,绿灯即将灭,红灯即将亮;同时也提醒另一方向正在路口等待的车辆行人,红灯即将灭,绿灯即将亮,准备通行;黄灯闪烁几次后,红灯亮转换为绿灯亮或绿灯转换为红灯亮。
根据以上十字路口红、黄、绿灯的工作情况,我们采用单片机模块8051实现交通灯控制。
单片机模块8051需要的工作电源电压为5V;由于模块内已备晶振(默认振荡频率为12MHz),所以仿真外围电路可以省略晶振;外围需要加一只电容和一只电阻,实现单片机的上电复位功能;单片机输出利用Mumsim 10.1元件工具条中的3D元件,红色、黄色和绿色发光二极管各4只,组成南北方向和东西方向的指示灯,形象直观、生动有趣。
交通灯控制框图如图1所示,交通灯控制电路原理图如图2所示。
52单片机开发板原理图

H G F
9 14 K7 P36 8 K8 P37 12 1 GND 7 2 5
串口通信模块
X1 X2
4X4矩阵键盘
单片机晶振
11.0594 Y1
STC/AT89S52单片机 ATmega16 AVR单片机(加转接板)
PS/2键盘
红外接收模块
VCC R18 10K U7 IR1838 VCC 1 2 3
继电器模块
P18 U12 P30 K2 VCC P31 K3 P32 11 882 15 881 16 880 K4 P33 K5 P34 K6 P35 GND K1 1 2 3 4 5 A-1 B-2 C-3 D-4 P9 1 2 3 4 5 JD U11 D C B A 1 2 3 4 5 6 7 8 IN1 IN2 IN3 IN4 IN5 IN6 IN7 GND OUT1 OUT2 OUT3 OUT4 OUT5 OUT6 OUT7 VCC 16 15 14 13 12 11 10 9 VCC JDOUT2 JD P10 1 2 3 4 5 VCC
P14 VCC 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CON20 P00 P01 P02 P03 P04 P05 P06 P07
RP2 1 2 3 4 5 6 7 8 9 103
P15 REST P17 P16
C9 22P
P1 P15 VCC NC GND RSTGND P17 GND P16 GND
VCC P17 P12
10 884
电机实验说明:接上 P18到 P9跳线帽,步进电机接到P10位置 继电器模块
P19 JD A-12 B-22 C-32 D-42 1 2 3 4 5 P7 U10 D C B A 1 2 3 4 5 6 7 8 IN1 IN2 IN3 IN4 IN5 IN6 IN7 GND OUT1 OUT2 OUT3 OUT4 OUT5 OUT6 OUT7 VCC 16 15 14 13 12 11 10 9 VCC JD P8 1 2 3 4 5 VCC DZ JZOUT1
C51常用头文件

C51常用头文件在KEIL 中,对于单片机所使用的头文件,除了reg51 reg52以外,还有一些从各芯片制商的官网下载与reg51,reg52功能类似的头文件,需了解透外,还要对各类型单片机均可通用且相当有用的的头文件,做相应的了解。
因为,内部所包含的函数与宏定义,可以及大的方便我们编写应用程序1字符函数 ctype.h1 extern bit isalpha(char);功能:检查参数字符是否为英文字母,是则返回12 extern bit isalnum(char)功能:检查字符是否为英文字母或数字字符,是则返回13 extern bit iscntrl(char)功能:检查参数值是否在0x00~0x1f 之间或等于0x7f,是则返回14 extern bit isdigit(char)功能:检查参数是否为数字字符,是则返回15 extern bit isgraph(char)功能:检查参数值是否为可打印字符,是则返回1,可打印字符为0x21~0x7e 6 extern bit isprint(char)功能:除了与isgraph相同之外,还接受空格符0x207 extern bit ispunct(char)功能:不做介绍。
8 extern bit islower(char)功能:检查参数字符的值是否为小写英文字母,是则返回19 extern bit isupper(char)功能:检查参数字符的值是否为大写英文字母,是则返回110 extern bit isspace(char)功能:检查字符是否为下列之一,空格,制表符,回车,换行,垂直制表符和送纸。
如果为真则返回111 extern bit isxdigit(char)功能:检查参数字符是否为16进制数字字符,是则返回112 extern char toint(char)功能:将ASCII字符0~9 a~f(大小写无关)转换成对应的16进制数字,返回值00H~0FH13 extern char tolower(char)功能:将大写字符转换成小写形式,如字符变量不在A~Z之间,则不作转换而直接返回该字符14 extern char toupper(char)功能:将小写字符转换成大写形式,如字符变量不在a~z之间,则不作转换而直接返回该字符15 define toascii(c) ((c)&0x7f)功能:该宏将任何整形数值缩小到有效的ASCII范围之内,它将变量和0x7f相与从而去掉第7位以上的所有数位16 #define tolower(c) (c-‘A’+’a’)功能:该宏将字符与常数0x20 逐位相或17 #define toupper(c) ((c)-‘a’+’A’)功能:该宏将字符与常数0xdf 逐位相与2数学函数 math.hextern int abs (int val);extern char cabs (char val);extern long labs (long val);extern float fabs (float val);功能:返回绝对值。
52头文件含备注

sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;
/*------------------
TF1 :TF1=1表示T1有中断产生。
TR1 :TR1=1表示T1开始运行。
TF0 :TF0=1表示T0有中断产生。
EXEN2 :T2外部允许标志;
EXEN2=1,T2为捕获方式,T2EX(P1.1)发生负跳变时,TL2和TH2的当前值自动捕获到RCAP2L和RCAP2H中,同时置中断标志EXF2。
EXEN2=0,T2为自动装入方式,T2EX(P1.1)发生负跳变时,RCAP2L和RCAP2H自动装入TL2和TH2中,同时置中断标志EXF2。
/*--------------------------------------------------------------------------
REG52.H
Header file for generic 80C52 and 80C32 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
0 1 1 16位计时计数器 (65536)
1 0 2 8位计时计数器,可自动重新载入计数值 (256)
1 1 3 当成两组独立的8位计时器(256,T0和T1不能同时用)
------------------*/
/* 8052 Extensions */
sfr T2CON = 0xC8; //状态控制寄存器
SM0 SM1 工作模式 说明 波特率
Multisim仿真-单片机20100601

中山大学
第8章 Multisim应用于单片机电路
8.1 单片机仿真平台 8.2 基本输入输出 8.3 外部中断 8.4 定时/计数器应用 8.5 A/D及D/A 8.6 波形发生器
SUN YAT-SEN UNIVERSITY YAT-
中山大学
8.2 基本输入输出
SUN YAT-SEN UNIVERSITY YAT-
SUN YAT-SEN UNIVERSITY YAT-
中山大学
第8章 Multisim应用于单片机电路
8.1 单片机仿真平台 8.2 基本输入输出 8.3 外部中断 8.4 定时/计数器应用 8.5 A/D及D/A 8.6 波形发生器
SUN YAT-SEN UNIVERSITY YAT-
中山大学
第三步: 添加源程序文件(汇编源程序*.asm),通常采 用默认文件名
中山大学
8.1 单片机仿真平台
注意界面 变化,与资 源管理器 中一致
SUN YAT-SEN UNIVERSITY YAT-
中山大学
8.1 单片机仿真平台
SUN YAT-SEN UNIVERSITY YAT-
双击单片机图标,或右击选择"属性",出现参 数设置对话框
汇编源程序:右击main.asm,点击Build
汇编结果
汇编:使源程序转换成由机器码指令组成的目标程序. 汇编:使源程序转换成由机器码入输出
汇编源程序方法:
右击main.asm,点击Build 菜单栏MCU
SUN YAT-SEN UNIVERSITY YAT-
中山大学
SUN YAT-SEN UNIVERSITY YAT-
Multisim电路仿真 电路仿真 快速入门
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AT89LS52
AT87LV55
*/
#ifndef __AT89S52_H
#define __AT89S52_H
typedef struct {
unsigned B7:1; /* this is the most significant bit */
unsigned B6:1;
static bit TR0 @ 0x8C;
static volatile bit TF0 @ 0x8D;
static bit TR1 @ 0x8E;
static volatile bit TF1 @ 0x8F;
// Port 1 P1
static volatile bit P10 @ 0x90;
static bit SM1 @ 0x9E;
static bit SM0 @ 0x9F;
// Port 2 P2
static volatile bit P20 @ 0xA0;
static volatile bit P21 @ 0xA1;
static volatile bit P22 @ 0xA2;
static volatile bit A13 @ 0xA5;
static volatile bit A14 @ 0xA6;
static volatile bit A15 @ 0xA7;
// Interrupt Enable IE
static bit EX0 @ 0xA8;
static bit ET0 @ 0xA9;
static volatile unsigned char WDTRST @ 0xA6;
static unsigned char IE @ 0xA8;
static volatile unsigned char P3 @ 0xB0;
static unsigned char IP @ 0xB8;
static SFR_BITS TMOD_BITS @ 0x89;
static volatile SFR_BITS AUXR_BITS @ 0x8E;
static volatile SFR_BITS P1_BITS @ 0x90;
static volatile SFR_BITS SCON_BITS @ 0x98;
static volatile unsigned char TH0 @ 0x8C;
static volatile unsigned char TH1 @ 0x8D;
static volatile unsigned char AUXR @ 0x8E;
static volatile unsigned char P1 @ 0x90;
static volatile bit AD2 @ 0x82;
static volatile bit AD3 @ 0x83;
static volatile bit AD4 @ 0x84;
static volatile bit AD5 @ 0x85;
static volatile bit AD6 @ 0x86;
static volatile unsigned char TL2 @ 0xCC;
static volatile unsigned char TH2 @ 0xCD;
static volaபைடு நூலகம்ile unsigned char PSW @ 0xD0;
static volatile unsigned char ACC @ 0xE0;
static volatile unsigned char B @ 0xF0;
static volatile SFR_BITS P0_BITS @ 0x80;
static SFR_BITS PCON_BITS @ 0x87;
static volatile SFR_BITS TCON_BITS @ 0x88;
static volatile bit P11 @ 0x91;
static volatile bit P12 @ 0x92;
static volatile bit P13 @ 0x93;
static volatile bit P14 @ 0x94;
static volatile bit P15 @ 0x95;
static bit EX1 @ 0xAA;
static bit ET1 @ 0xAB;
static bit ES @ 0xAC;
static bit ET2 @ 0xAD;
static bit EA @ 0xAF;
// Port 3 P3
static volatile bit P30 @ 0xB0;
static volatile bit P23 @ 0xA3;
static volatile bit P24 @ 0xA4;
static volatile bit P25 @ 0xA5;
static volatile bit P26 @ 0xA6;
static volatile bit P27 @ 0xA7;
static volatile bit P16 @ 0x96;
static volatile bit P17 @ 0x97;
// Alternate Functions
static volatile bit T2 @ 0x90;
static volatile bit T2EX @ 0x91;
unsigned B5:1;
unsigned B4:1;
unsigned B3:1;
unsigned B2:1;
unsigned B1:1;
unsigned B0:1;
} SFR_BITS;
static volatile unsigned char P0 @ 0x80;
static volatile bit AD7 @ 0x87;
// Timer Control TCON
static bit IT0 @ 0x88;
static volatile bit IE0 @ 0x89;
static bit IT1 @ 0x8A;
static volatile bit IE1 @ 0x8B;
static volatile bit P31 @ 0xB1;
static volatile bit P32 @ 0xB2;
static volatile bit P33 @ 0xB3;
static volatile bit P34 @ 0xB4;
static volatile bit RI @ 0x98;
static volatile bit TI @ 0x99;
static volatile bit RB8 @ 0x9A;
static bit TB8 @ 0x9B;
static bit REN @ 0x9C;
static bit SM2 @ 0x9D;
// Alternate definition
static volatile unsigned char DP1L @ 0x84;
static volatile unsigned char DP1H @ 0x85;
// 16 bit definition
static unsigned char PCON @ 0x87;
static volatile unsigned char SCON @ 0x98;
static volatile unsigned char SBUF @ 0x99;
static volatile unsigned char P2 @ 0xA0;
static volatile unsigned char AUXR1 @ 0xA2;
static volatile bit P06 @ 0x86;
static volatile bit P07 @ 0x87;
// Alternate Functions
static volatile bit AD0 @ 0x80;
static volatile bit AD1 @ 0x81;
// Alternate Functions
static volatile bit A8 @ 0xA0;
static volatile bit A9 @ 0xA1;
static volatile bit A10 @ 0xA2;
static volatile bit A11 @ 0xA3;
static volatile bit A12 @ 0xA4;
static volatile bit P01 @ 0x81;
static volatile bit P02 @ 0x82;
static volatile bit P03 @ 0x83;
static volatile bit P04 @ 0x84;
static volatile bit P05 @ 0x85;
static volatile unsigned char SP @ 0x81;
static volatile unsigned char DP0L @ 0x82;
static volatile unsigned char DP0H @ 0x83;
// 16 bit definition
#if !defined(_AT87LV55)
static volatile bit MOSI @ 0x95;