合泰C语言编程资料HT-IDE3000+Programmer+Guide+for+C+Language(936)
- 格式:pdf
- 大小:1.80 MB
- 文档页数:88
#include "HT46R47-H.h"//---------------def-----------------------//pa#define _pac0 _13_0#define _pac1 _13_1#define _pac2 _13_2#define _pac3 _13_3#define _pac4 _13_4#define _pac5 _13_5#define _pac6 _13_6#define _pac7 _13_7//pb#define _pbc0 _15_0#define _pbc1 _15_1#define _pbc2 _15_2#define _pbc3 _15_3//pd#define _pdc0 _19_0#define CN_DOWN _pa1#define JM _pa4#define LED_GREEN _pa5#define LED_RED _pa6#define FAN _pa7#define PWM_IO _pd0#define C_SAMP 0x00#define BT_SAMP 0x01#define V_SAMP 0x02#define TIM_PRE 7200 //pre 2H-7200#define TIM_NOML 43920 //CC/CV 12.2H=13H#define OVER_VOLTAGE 0x0c5 //43.57V#define LOW_VOLTAGE 0x068 //24V 0x06b//#define OVER_CURRENT 0x0062 //3.9A 10.5A #define PRE_CHARGER 0x088 //30V#define FULL_DOWN_V 0x0b5 //40V#define FULL_CURRENT 0x05f //0.2A#define N20C_NTC 0x0ec //-20度#define _0C_NTC 0x0d7 //0度#define _45C_NTC 0x089 //45度0x07e//---------------var-----------------------unsigned int adcvalue;unsigned int I_by;unsigned char chargermode;unsigned char T_Mode; //T mode unsigned int ChargingTimeValue; //bit StartTimeFlg;bit ChargingT_OverFlg;unsigned char Tcount;unsigned char SecondCnt;bit UnLoad;bit Start_5S;bit Flg_5S;unsigned char Cnt5s; //5 seconds//---------------ex fuction----------------extern unsigned int ADCStart(unsigned char chanl);//delay 1ms Fsys=4Mhz 实测1msvoid Delay1ms(void){unsigned int va;for(va=0;va<60;va++){;}}//delay N msvoid DelayNms(unsigned int ms){unsigned int vb;for(vb=0;vb<ms;vb++){Delay1ms();}}//----------------------------------------------// 上电自校准电压IV// 自校电压是否在空载范围内void s1_VI(void)while(1){adcvalue = ADCStart(V_SAMP); //voltageif(((adcvalue<0x01ff)||(adcvalue==0x01ff))&&((adcvalue>0x0000)||(adcvalue==0x0000))) {break;}}}//------------------------------------------------// 校正OP电流否正常,条件打开0.05A校正电流// 实测I-V OP放大电压,0x0074 4.2A=0X0141 【0X0141-0X0074=D205,// 4200/205=20.5mA/位ADvoid s1_VI1(void){while(1){adcvalue = ADCStart(C_SAMP); //currentif(((adcvalue<0x01ff)||(adcvalue==0x01ff))&&((adcvalue>0x0000)||(adcvalue==0x0000))) {I_by = adcvalue;break;}}}//system initialvoid SYS_Inital(void){//IOport --------------CN_DOWN = 0;JM = 0;FAN = 0;PWM_IO = 0;LED_GREEN = 0;LED_RED = 1;_pb3 = 0;_pac1 = 0;_pac4 = 0;_pac7 = 0;_pdc0 = 0;_pac5 = 0;_pac6 = 0;_pbc0 = 1;_pbc1 = 1;_pbc2 = 1;_pbc3 = 0;//var ----------------------chargermode = 0x01;Tcount = 0;SecondCnt = 0;//Timer -------------------_tmrc = 0x87; //timer mode Ftimer=Fsys/128 Fsys=4M Ttimer=32us _tmr = (256-250); //32*250=8ms//PWM ---------------------_pwm = 0xfc; //set pwm duty cycle//voltage current just self-----s1_VI();DelayNms(1000);s1_VI1();}//---------------------相关保护void ToPretect(void){//---------------短路保护//---------------低压保护/*adcvalue = ADCStart(V_SAMP); //voltageif(adcvalue<=LOW_VOLTAGE) //Low voltage{adcvalue = ADCStart(C_SAMP); //currentif(adcvalue>20){PWM_IO = 0;JM = 0;chargermode = 0x05; //errorreturn;}}*///---------------过压保护if(adcvalue>=OVER_VOLTAGE) //over voltage {PWM_IO = 0;JM = 0;chargermode = 0x05; //errorreturn;}//---------------过流保护/*adcvalue = ADCStart(C_SAMP); //currentif(adcvalue>=OVER_CURRENT) //over current {PWM_IO = 0;JM = 0;chargermode = 0x05; //errorreturn;}*/}//------------------main-----------void main(){SYS_Inital();_intc=0x05; // EMI ETI enable _ton = 1; //start timerwhile(1){switch(chargermode){case 0x01://startT_Mode = chargermode;ChargingTimeValue = 0;StartTimeFlg = 0;ChargingT_OverFlg = 0;FAN = 0;LED_GREEN = 0;LED_RED = 1;DelayNms(1000);adcvalue = ADCStart(V_SAMP); //voltageif((adcvalue>=OVER_VOLTAGE)) //&&(adcvalue>=LOW_VOLTAGE)//over or low voltage{JM = 0;chargermode = 0x05; //errorbreak;}else{//adcvalue = ADCStart(BT_SAMP); //B temp//if(adcvalue<=N20C_NTC)//if(adcvalue>=LOW_VOLTAGE)//{PWM_IO = 0;JM = 1;DelayNms(1000);adcvalue = ADCStart(C_SAMP); //Currentif(adcvalue>=0x50){//UnLoad = 0;//Start_5S = 0;//Cnt5s = 0;//Flg_5S = 0;//adcvalue = ADCStart(V_SAMP); //voltage//if(adcvalue<=PRE_CHARGER) //24<V<30V-pre//{PWM_IO = 0;chargermode = 0x02; //prebreak;//}//else //V>30V-nor//{// PWM_IO = 1;// chargermode = 0x03; //normal// break;//}}//}}break;case 0x02://PRE_CHARGERPWM_IO = 0;JM = 1;FAN = 0;LED_GREEN = 1;LED_RED = 1;//----------------------------------------- //over timeif(T_Mode!=chargermode){T_Mode = chargermode;ChargingTimeValue = TIM_PRE;StartTimeFlg = 1;ChargingT_OverFlg = 0;}if(ChargingT_OverFlg==1){PWM_IO = 0;JM = 0;chargermode = 0x05; //errorbreak;}//----------低压,过压,过流,短路ToPretect();//----------BMS over tempadcvalue = ADCStart(BT_SAMP); //B tempif(((adcvalue>0xd7)||(adcvalue==0xd7))||((adcvalue<0x7f)||(adcvalue==0x7f))) {PWM_IO = 0;JM = 0;chargermode = 0x05; //errorbreak;}//----------pre to Normaladcvalue = ADCStart(V_SAMP); //voltageif(adcvalue>PRE_CHARGER) //>30V{PWM_IO = 1;chargermode = 0x03; //normal}//------------------------------battery removeadcvalue = ADCStart(BT_SAMP); //battery NTCif(adcvalue>=N20C_NTC) //no ntc{PWM_IO = 0;JM = 0;chargermode = 0x05; //standbybreak;}//---------------adcvalue = ADCStart(V_SAMP); //voltageif(adcvalue<=0x16) //5V{adcvalue = ADCStart(C_SAMP); //currentif(adcvalue>20){JM = 0;PWM_IO = 0;chargermode = 0x05; //errorbreak;}}break;case 0x03://CC+CVPWM_IO = 1;JM = 1;FAN = 1;LED_GREEN = 1;LED_RED = 1;//---------------------timerif(T_Mode!=chargermode){T_Mode = chargermode;ChargingTimeValue = TIM_NOML;StartTimeFlg = 1;ChargingT_OverFlg = 0;}if(ChargingT_OverFlg==1){PWM_IO = 0;chargermode = 0x05; //errorbreak;}//----------低压,过压,过流,短路ToPretect();//-----------------------------normal to FULLadcvalue = ADCStart(V_SAMP); //voltageif(adcvalue>=FULL_DOWN_V) //>40V{adcvalue = ADCStart(C_SAMP); //currentif(adcvalue<=(FULL_CURRENT)) //get FULL{chargermode = 0x04; //fullbreak;}}//----------BMS over tempadcvalue = ADCStart(BT_SAMP); //B temp//0度-0xc2 45度-0x6bif(((adcvalue>0xdb)||(adcvalue==0xdb))||((adcvalue<0x82)||(adcvalue==0x82))) {PWM_IO = 0;JM = 0;chargermode = 0x05; //errorbreak;}//------------------normal to preadcvalue = ADCStart(V_SAMP); //voltageif(adcvalue<(PRE_CHARGER-10)) //PRE{chargermode = 0x02; //prebreak;}//------------------------------battery removeadcvalue = ADCStart(BT_SAMP); //battery NTCif(adcvalue>=N20C_NTC) //no ntc{PWM_IO = 0;JM = 0;chargermode = 0x05; //standby}//---------------adcvalue = ADCStart(V_SAMP); //voltageif(adcvalue<=0x16) //5V{adcvalue = ADCStart(C_SAMP); //currentif(adcvalue>20){JM = 0;PWM_IO = 0;chargermode = 0x05; //errorbreak;}}break;case 0x04://FULL_DOWNT_Mode = chargermode;ChargingTimeValue = 0; //StartTimeFlg = 0;ChargingT_OverFlg = 0;PWM_IO = 0;JM = 0;FAN = 0;LED_GREEN = 1;LED_RED = 0;DelayNms(1000);adcvalue = ADCStart(V_SAMP); //voltageif(adcvalue>OVER_VOLTAGE) //{PWM_IO = 0;JM = 0;chargermode = 0x05; //errorbreak;}else{if(adcvalue<(LOW_VOLTAGE-20)){PWM_IO = 0;JM = 0;chargermode = 0x01; //standbybreak;}}break;case 0x05://errorT_Mode = chargermode;ChargingTimeValue = 0; //StartTimeFlg = 0;ChargingT_OverFlg = 0;PWM_IO = 0;JM = 0;FAN = 0;LED_GREEN = 0;LED_RED = 1;DelayNms(1000);LED_GREEN = 0;LED_RED = 0;DelayNms(1000);break;default:break;}}}。
合泰单片机ADC转换程序合泰单片机ADC转换程序;内容:旋转变阻器改变AD转换的数通过4为LED显示出来;数码管段码接法A-PD0,B-PD1....G-PD6,H-PD7;数码管位码接法4-PC3;完整源码下载:;;AD输入脚-PA0include HT66F50.incORG 0000HJMP A1ORG 0014H ;多功能中断入口地址JMP ZD1ORG 1CH ;ADC中断入口地址JMP ISR_ADCORG 0030HQ1:DC 03FH ; 0DC 006H ; 1DC 05BH ; 2DC 04FH ; 3DC 066H ; 4DC 06DH ; 5DC 07DH ; 6DC 007H ; 7DC 07FH ; 8DC 06FH ; 9DC 077H ; ADC 07CH ; BDC 039H ; CDC 05EH ; DDC 079H ; EDC 071H ; FA1:CLR [98H] ;AD数据高8位存储器CLR [99H] ;AD数据低8位存储器MOV A,0 ;显示内容MOV [8AH],A ;第一位数码管段码显示内容寄存器MOV A,0 ;显示内容MOV [8BH],A ;第二位数码管段码显示内容寄存器MOV A,0 ;显示内容MOV [8CH],A ;第三位数码管段码显示内容寄存器MOV A,0 ;显示内容MOV [8DH],A ;第四位数码管显示内容寄存器MOV A,08H ;跟CP1C寄存器设置要求选择数据MOV CP1C,A ;设置PC口为I/0口而不是中断口CLR PBC ;设置pc 口为输出口CLR PDC ;设置PD 口为输出口MOV A,1 ;设置初始显示位码显示第一位MOV [80H],A ;位码寄存器MOV A,8AH ;设置对应第一位段码寄存器MOV MP0,A ;间接寄存器指针MOV A,00000000B ;设置TM2 计数时钟位为fSYS/4MOV TM2C0,AMOV A,11000001B ;设置TM2中断为定时/计数模式选择比较器A匹配MOV TM2C1,AMOV A,LOW 5000 ;设置中断时间为5000个时钟周期MOV TM2AL,A ;低8位MOV A,HIGH 5000 ;设置中断时间为5000个时钟周期MOV TM2AH,A ;高8位MOV A,00010000B ;打开AD电源并ADRFS=1 MOV ADCR0,A ;ADRH为bit 3~bit 0,ADRL为bit 7~bit 0 MOV A,00000110B ;AD转换时钟为fSYS/64,MOV ADCR1,A ;VREFS=0选择内部参考电压MOV A,00000001B ;选择AD通道为AN0MOV ACERL,Aclr START ; 启动AD转换 0→1→0 启动set START ;clr START ;CLR ADF ;清标志SET ADE ;开AD中断CLR MF0F ;清多功能中断0标志CLR T2AF ;清定时器2较器A中断标志SET MF0E ;使能多功能0中断SET T2AE ;使能定时器2较器A中断SET EMI ;使能总中断SET T2ON ;开始计数A2:CALL CL1 ;调用2位16进制数转换为5位10进制数子程序MOV A,[9DH] ;显示内容MOV [8AH],A ;第一位数码管段码显示内容寄存器MOV A,[9CH] ;显示内容MOV [8BH],A ;第二位数码管段码显示内容寄存器MOV A,[9BH] ;显示内容MOV [8CH],A ;第三位数码管段码显示内容寄存器MOV A,[9AH] ;显示内容MOV [8DH],A ;第四位数码管显示内容寄存器JMP A2;*******************************************************;2位16进制数转换为5为10进制数子程序(0ffh=65535);******************************************************* CL1:MOV A,[98H]MOV [9AH],AMOV A,[99H]MOV [9BH],ACALL CL2MOV A,00001111BAND A,[9EH]MOV [9AH],ASWAP [9EH]MOV A,00001111BAND A,[9EH]MOV [9BH],AMOV A,[9CH]MOV [9EH],AMOV A,00001111BAND A,[9DH]MOV [9CH],ASWAP [9DH]MOV A,00001111BANDM A,[9DH]RETCL2:CLR [9CH]CLR [9DH]CLR [9EH]MOV A,16MOV [9FH],ACL3:CLR CRLC [9BH]RLC [9AH]MOV A,[9EH]ADC A,[9EH]DAA [9EH]MOV A,[9DH]ADC A,[9DH]DAA [9DH]MOV A,[9CH]ADC A,[9CH]DAA [9CH]SDZ [9FH]JMP CL3RET;*******************************************************; 中断服务子程序;*******************************************************ZD1:MOV [0F0H],A ;压栈ACC到0F0HMOV A,STATUS ;MOV [0F1H],A ;压栈status标志寄存器到0F1HCLR PB ;清PC(清屏幕)MOV A,Q1 ;数据表地址CLR TBHP ;清数据表地址高位否则出错ADD A,IAR0 ;利用间接寄存器找到要显示段码所在数据表的地址MOV TBLP,A ;表格指针寄存器TBLPTABRD PD ;查表并将数据存到PD口寄存器MOV A,[80H] ;位码寄存器MOV PB,A ;将位码寄存器的数存到PC口寄存器;段码和位码的数都有了所以数码管被点亮INC MP0 ;间接寄存器指针加1指向下一个段码寄存器RL [80H] ;左移位码寄存器控制下一个数码管SNZ [80H].5 ;判断是否控制完4个数码管JMP ZD2 ;退出中断继续MOV A,1 ;是则从新初始化寄存器数据MOV [80H],A ;MOV A,8AH ;千位数码管对应寄存器MOV MP0,A ;存到间接寄存器0ZD2:MOV A,[0F1H] ;弹栈后进先出先进后出MOV STATUS,A ;弹栈0F1H的数到标志寄存器MOV A,[0F0H] ;弹栈0F0H的数到accCLR MF0F ;清多功能标志CLR T2AF ;清定时器2比较器A标志RETI ;中断返回ISR_ADC:MOV [0F0H],A ;压栈ACC到0F0HMOV A,STATUS ;MOV [0F1H],A ;压栈status标志寄存器到0F1HMOV A,ADRHMOV [98H],AMOV A,ADRLMOV [99H],AMOV A,[0F1H] ;弹栈后进先出先进后出MOV STATUS,A ;弹栈0F1H的数到标志寄存器MOV A,[0F0H] ;弹栈0F0H的数到accclr START ;high pulse on start bit to initiate conversion set START ;reset A/Dclr START ;start A/DRETI ;中断返回;******************************************************* ; 延时子程序;******************************************************* M001:MOV A,1MOV [85H],AM002:MOV A,200MOV [86H],AM003:MOV A,250MOV [87H],AM004:SDZ [87H]JMP M004SDZ [86H]JMP M003SDZ [85H]JMP M002RETEND。
合泰单⽚机基础教程第⼀章⼀、概念与分类单⽚机⼜称微控制器(M icro C ontroller U nit),包含:中央处理单元、程序存储器、数据存储器、输⼊/输出端⼝1、按算术逻辑单元的位长度:4位机、8位机、 16位机、 32位机、64位机2、按内部结构(1)精简指令集RISC:提供较少的基本指令,执⾏效率较⾼(2)复杂指令集CISC :提供较多的指令,包括功能强⼤的指令(如乘除法),执⾏效率较低3、按编址⽅式(1)普林斯顿结构:指令与数据共⽤同⼀块存储器,共⽤地址/数据总线,同⼀时间只能对指令或数据操作(2)哈佛结构:指令与数据是分开的,各⾃独⽴的地址/数据总线,可同时对指令与数据操作⼆、单⽚机结构概述1、中央处理单元(CPU):(1)指令解码单元(IU)通过解码硬件电路去解析⼀连串⼆进制码以作为控制器的决策核⼼(2)执⾏控制单元(EU)接受IU所发出的指⽰,将各单元中的数据进⾏互换、传送、运算、判断,再依汇编指令所指定的动作或运算进⾏输⼊、输出、存储等⼯作(3)算术逻辑单元(ALU)可从指令集中实现算术和逻辑操作,ALU在接收相关的指令码后执⾏需要的算术与逻辑操作,并将结果存储在指定的存储位置2、程序存储器(ROM)内容⼀般不可更改的,⽤于存放⽤户代码的存储器,不同型号不同容量3、数据存储器(RAM)内容可更改的,⽤于存放单⽚机状态或⽤户变量的存储器,不同型号不同容量4、总线(BUS)⽤于内部各单元间信息互通,⼀般有3种总线:数据总线、控制总线、地址总线(1)数据总线:传送各单元间数据的硬件(2)控制总线: 控制单⽚机数据的读或写,使、除能某单元以接收或传送数据(3)地址总线: 主要⽤来寻址,指⽰数据存取的位置,即⽤地址总线寻址三、 HT合泰单⽚机结构分析(以HT48系列为例)1、时序和流⽔线结构(1)系统时钟由晶体/陶瓷震荡器或RC震荡器提供(2)指令周期由T1~T4 4个内部时钟组成,流⽔线结构保证指令在⼀个指令周期内被有效执⾏T1:程序计数器⾃动加1并抓取新指令T2~T4:完成解码、算术逻辑并执⾏功能(3)当程序计数器的内容改变时,如call调⽤或jmp跳转时,指令需要多⼀个指令周期取出当前指令地址的下⼀条指令,并清除流程,再⽤另⼀个周期去执⾏下⼀动作2、程序计数器(PC)(1)程序指令码的读取是由于内部有⼀程序计数器来寻址,在指令码被读取后程序执⾏期间,程序计数器指向下⼀条要执⾏的指令地址(2)复位起始地址是0000h,在每条指令执⾏后⾃动加1(jmp、call等除外) 3、堆栈(Strack)是存储器特殊的部分,在⼦程序调⽤或中断响应时,程序指针压⼊堆栈,返回指令(RET或RETI)使程序指针返回到上次⼦程序调⽤位置四、程序存储器(ROM)存放⽤户代码,内容为⼆进制机器码1、分类:掩模 \ OTP \ EEPROM \ FLASH2、⼀般为14Bit~16Bit,除了存放程序外也包含中断⼊⼝和数据表3、特殊向量地址(以HT48R50A-1为例):(1)复位向量地址: 000H(2)外部中断向量地址: 004H(3)定时/计数器0中断向量地址: 008H(4)定时/计数器1中断向量地址: 00CH五、数据存储器(RAM)1、可更改的8位内部存储器,⽤来存放临时数据,分为“专⽤寄存器”和“通⽤数据存储器”2、通⽤数据存储器(⽩⾊部分)3、专⽤寄存器六、专⽤寄存器1、间接寻址寄存器IAR0/IAR1在间接寻址寄存器上的任何动作,将对间接寻址指针(MP0/MP1)所指定的数据存储地址产⽣的读/写操作2、间接寻址指针MP0/MP1与IAR0/IAR1组成间接寻址操作功能3、累加器ACC所有ALU得到的运算结果都会暂时存储在累加器,数据传送也需要累加器4、程序计数器低字节寄存器PCL直接给PCL赋值将导致直接跳转到本页范围的某⼀地址。
第一课时1、Holtek公司编译器HT-IDE3000使用说明(1)双击打开HT-IDE3000,进入编译器的界面,见下图:(2)单击“工程”——>选择“新建”,弹出下图窗口;——Project Name:新建项目文件的名称,不建议使用中文名称;——Project Location:项目文件存放的位置,勾选“Create directory for project”后,会自动建立一个文件夹,项目文件都存放在此文件夹内;——Project MCU:单片机的型号;——Choose Language Tool:选择编程语言,这里选择“V2”版本的C语言。
(3)点击下一步,选择“.C”;(4)点击下一步,再点击下一步,点击OK,然后弹出“配置选项”,配置选择只要是对单片机一些功能和特性进行设置,例如工作电压,工作频率,看门狗等;(5)配置选项设置完后,点击OK,再点击确定,那么新的工程就建立完毕了。
2、C语言程序设计(1)主函数每个程序只有一个主函数,程序是从主函数开始执行。
格式:void main(){}例子:#include "HT66F40.h"void main()//程序从这里开始跑{_nop();//语句1_nop();//语句2_nop();//语句3}功能说明:程序执行的顺序,语句1—>语句2—>语句3。
(2)子函数一个程序包含各种功能,如果每种功能都做成一个子函数,那么整个程序的架构实现了模块化。
例如,LCD的开启,显示及关闭这三个功能可以分别做成三个独立的子函数。
使用子函数的步骤:①编写子函数的功能void TurnOn_LCD()//LCD开启子函数,TurnOn_LCD是函数的名称{_nop();//这里先用空指令代表子函数的功能_nop();//这里先用空指令代表子函数的功能}②声明子函数,告诉单片机有这个子函数存在void TurnOn_LCD();技巧:直接把步骤①的第一行复制过来,然后在后面加上分号;③调用子函数TurnOn_LCD();例子:#include "HT66F40.h"void TurnOn_LCD();//声明子函数,告诉单片机有这个子函数存在void TurnOff_LCD();//声明子函数,告诉单片机有这个子函数存在void display_LCD();//声明子函数,告诉单片机有这个子函数存在void main(){_nop();//空指令_nop();//空指令_nop();//空指令while(1) //while循环结构,当小括号里内容为真,执行{//while大括号里的内容TurnOn_LCD(); //调用LCD开启子函数display_LCD();//调用LCD显示子函数TurnOff_LCD();//调用LCD关闭子函数}}void TurnOn_LCD()//编写子函数的功能,LCD开启子函数,TurnOn_LCD是{ //函数的名称_nop();//这里先用空指令代表子函数的功能_nop();//这里先用空指令代表子函数的功能}void TurnOff_LCD()//编写子函数的功能,LCD关闭子函数,TurnOff_LCD是{//函数的名称_nop();//这里先用空指令代表子函数的功能_nop();//这里先用空指令代表子函数的功能}void display_LCD()//编写子函数的功能,LCD显示子函数,display_LCD是{//函数的名称_nop();//这里先用空指令代表子函数的功能_nop();//这里先用空指令代表子函数的功能}(3)中断子函数使用中断子函数的步骤:①相关寄存器进行初始化(请查阅相关型号IC的PDF)②声明中断子函数地址格式:#pragma vector 中断子函数名称@中断入口地址例如:#pragma vector isr_tm0@0x14③编写中断子函数的功能例如:void isr_tm0(){}例子:#include "HT66F40.h"#pragma vector isr_tm0 @0x14//声明中断子函数的入口地址void mcu_init();//声明单片机初始化子函数void main(){mcu_init();while(1)//while循环结构,当小括号里内容为真,执行while{//大括号里的内容_nop();_nop();}}void isr_tm0()//编写中断子函数的功能{_t0af=0;//清除中断标志位_nop();//这里先用空指令代表中断子函数的功能}void mcu_init()//编写单片机初始化子函数{//定时器相关寄存器初始化_tm0c0=0b00000000;//定时器计数时钟fsys/4=1Mhz,fsys=4Mhz为系统//频率_tm0c1=0b11000001;//选择定时计数工作模式,//清0计数器的条件:与比较器A匹配,即//计数值与tm0al,tm0ah的值相等时,计数器清0)_tm0al=0xe8;//0x03e8=1000_tm0ah=0x03;_t0on=1;//启动定时器//定时器中断相关寄存器初始化_emi=1;//总中断控制位,0-关闭1-开启_mf0e=1;//多功能中断0控制位,0-关闭1-开启_t0ae=1;//TM0比较器A匹配中断控制位,0-关闭1-开启}(4)函数的返回值及参数的介绍①无返回值,无参数函数:前面介绍的函数均为无返回值无参数函数。
1、编程将片内 RAM30H 单元开始的15 B 的数据传递到片外 RAM3000H 开始的单元中去。
解: STRAT: MOV R0,#30HMOV R7,#0FHMOV DPTR,#3000HLOOP: MOV A,@R0MOVX@DPTR,AINC R0INC DPTRDJNZ R7,LOOP3、将内部 RAM 40H 开始的 10 个字节的数搬到外面RAM 2000H 处MOV DPTR,#2000HMOV R0,#40HMOV R2,#0AHLOOP:MOV A,@R0MOVX @DPTR,AINC R0INC DPTRDJNZ R2,LOOPSJMP$ENDRET2 、编程将片内 RAM 40H 单元中的内容送到片外RAM2000H 单元中。
解:ORG0100HMOV A, 40HMOV DPTR, #2000HMOVX @DPTR, AEND4、将存于外面 RAM 8000H 开始的 50H 数据传递 0010H 的地区,请编程实现。
MOV DPTR, #8000HMOV R0,#10HMOV R2,#50HLOOP: MOVX A, @DPTR;取数MOVX @R0,A;存数1NC DPTR1NC R0DJNZ R2, LOOPRET5.片内 RAM40H 开始的单元内有10B 二进制数,编程找出此中最大值并存于50H 单元中.解START: MOV R0,#40H;数据块首地点送 R0MOV R7,#09H;比较次数送R7MOV A,@R0;取数送ALOOP:INC R0MOV30H,@R0;取数送30 HCJNE A,30H,NEHT;( A)与( 30H)对比NEXT:JNC BIE1(A)≥ (30H)转 BIR1MOV A,30H;(A)< (30H),大数送 ABIE1:DJNZ R7,LOOP;比较次数减 1,不为 0,持续比较MOV50H,A;比较结束,大数送 50HRET6.片内 RAM30H 开始的单元中有 10B 的二进制数,请编程求它们之和(和<256 ).解ADDIO:MOV R0,30H ADD A,@R0MOV R7,#9DJNZ R7,LOOPMOV A,@R0MOV30H,A LOOP: INC R0RET7、设从内存BLOCK单元开始寄存一无符号数的数据块,其长度为LEN。