西南科技大学 单片机实验 程序代码
单片机个实验代码详细

第一章单片机系统板说明一、概述单片机实验开发系统是一种多功能、高配置、高品质的MCS-51单片机教学与开发设备。
适用于大学本科单片机教学、课程设计和毕业设计以及电子设计比赛。
该系统采用模块化设计思想,减小了系统面积,同时增加了可靠性,使得单片机实验开发系统能满足从简单的数字电路实验到复杂的数字系统设计实验,并能一直延伸到综合电子设计等创新性实验项目。
该系统采用集成稳压电源供电,使电源系统的稳定性大大提高,同时又具备完备的保护措施。
为适应市场上多种单片机器件的应用,该系统采用“单片机板+外围扩展板”结构,通过更换不同外围扩展板,可实验不同的单片机功能,适应了各院校不同的教学需求。
二、单片机板简介本实验系统因为自带了MCS-51单片机系统,因此没有配置其他单片机板,但可以根据教学需要随时配置。
以单片机板为母板,并且有I/O接口引出,可以很方便的完成所有实验。
因此构成单片机实验系统。
1、主要技术参数(1)MSC-51单片机板板上配有ATMEL公司的STC89C51芯片。
STC89C51资源:32个I/O口;封装DIP40。
STC89C51开发软件:KEIL C51。
2、MSC-51单片机结构(1)单片机板中央放置一块可插拔的DIP封装的STC89C51芯片。
(2)单片机板左上侧有一个串口,用于下载程序。
(3)单片机板的四周是所有I/O引脚的插孔,旁边标有I/0引脚的脚引。
(4)单片机板与各个模块配合使用时,可形成—个完整的实验系统。
三、母板简介主要技术参数(1)实验系统电源实验系统内置了集成稳压电源,使整个电源具有短路保护、过流保护功能,提高了实验的稳定性。
主板的右上角为电源总开关,当把220V交流电源线插入主板后,打开电源开关,主板得电工作。
为适用多种需要,配置了+5V,+12V,—5V电压供主板和外设需要,通过右上角的插针排和插孔输出到外设。
此外,还设有螺旋保险插孔保护实验箱。
(2)RS232接口RS232接口通过MAX232芯片实现与计算机的串行通讯,通过接口引出信号。
经典单片机实用开发教程代码

//实例51-2:定时器T0的模式2测量正脉冲宽度#include<reg51.h> //包含51单片机寄存器定义的头文件sbit ui=P3^2; //将ui位定义为P3.0(INT0)引脚,表示输入电压/*******************************************函数功能:主函数******************************************/void main(void){TMOD=0x0a; // TMOD=0000 1010B,使用定时器T0的模式2,GATE置1 EA=1; //开总中断ET0=0; //不使用定时器T0的中断TR0=1; //启动T0TH0=0; //计数器T0高8位赋初值TL0=0; //计数器T0低8位赋初值while(1) //无限循环,不停地将TL0计数结果送P1口{while(ui==0) //INT0为低电平,T0不能启动;TL0=0; //INT0为高电平,启动T0计时,所以将TL0清0while(ui==1) //在INT0高电平期间,等待,计时;P1=TL0; //将计时结果送P1口显示}}//实例52:用定时器T0控制输出高低宽度不同的矩形波#include<reg51.h> //包含51单片机寄存器定义的头文件sbit u=P3^0; //将u位定义为P3.0,从该引脚输出矩形脉冲unsigned char Countor; //设置全局变量,储存负跳变累计数/*************************************************函数功能:延时约30ms (3*100*100=30 000μs =30ms)*************************************************/void delay30ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<100;n++);}/*******************************************函数功能:主函数******************************************/void main(void){unsigned char i;EA=1; //开放总中断EX0=1; //允许使用外中断IT0=1; //选择负跳变来触发外中断Countor=0;for(i=0;i<100;i++) //输出100个负跳变{u=1;delay30ms();u=0;delay30ms();}while(1); //无限循环,防止程序跑飞}/************************************************************** 函数功能:外中断T0的中断服务程序**************************************************************/ void int0(void) interrupt 0 using 0 //外中断0的中断编号为0{Countor++;P1=Countor;}//实例53:用外中断0的中断方式进行数据采集#include<reg51.h> //包含51单片机寄存器定义的头文件sbit S=P3^2; //将S位定义为P3.2,/*******************************************函数功能:主函数******************************************/void main(void){EA=1; //开放总中断EX0=1; //允许使用外中断IT0=1; //选择负跳变来触发外中断P1=0xff;while(1); //无限循环,防止程序跑飞}/**************************************************************函数功能:外中断T0的中断服务程序**************************************************************/ void int0(void) interrupt 0 using 0 //外中断0的中断编号为0{P1=~P1; //每产生一次中断请求,P1取反一次。
单片机c语言代码及应用

单片机c语言代码及应用单片机是一种集成了中央处理器、内存和各种外设接口的微型计算机。
它广泛应用于家用电器、工控设备、汽车电子等各个领域。
C语言是单片机最常用的编程语言,它具有代码简洁、运行效率高的特点。
下面我将为你介绍一些单片机C 语言代码的应用。
首先,我们可以使用C语言编写一个LED闪烁的程序。
这个程序可以通过单片机的GPIO口控制LED的亮灭,实现LED的闪烁效果。
以下是一个简单的LED 闪烁的C语言代码:c#include <reg51.h>void delay(unsigned int count) 延时函数{while (count);}int main(){while (1) {P1 = 0xFF; 点亮LEDdelay(50000);P1 = 0x00; 熄灭LEDdelay(50000);}return 0;}上面的代码中,我们首先定义了一个延时函数`delay`,它通过循环来实现延时。
然后在`main`函数中,通过控制P1口的电平来控制LED的亮灭,并调用延时函数来控制闪烁的时间间隔。
这样就实现了一个简单的LED闪烁程序。
另外一个常见的应用是通过单片机控制液晶显示屏。
液晶显示屏可以用来显示各种信息,比如温度、湿度、时间等。
以下是一个使用单片机控制液晶显示屏显示字符串的程序:c#include <reg51.h>#define LCD_DATA P0 数据口sbit LCD_RS = P1^0; RS口sbit LCD_RW = P1^1; RW口sbit LCD_EN = P1^2; EN口void delay(unsigned int count) 延时函数{while (count);}void lcd_write_command(unsigned char command) 写指令{LCD_RS = 0; 设置为指令模式LCD_RW = 0; 设置为写入模式LCD_DATA = command;LCD_EN = 1;delay(5);LCD_EN = 0;}void lcd_write_data(unsigned char data) 写数据{LCD_RS = 1; 设置为数据模式LCD_RW = 0; 设置为写入模式LCD_DATA = data;LCD_EN = 1;delay(5);LCD_EN = 0;}void lcd_init() LCD初始化{lcd_write_command(0x38); 初始化显示模式lcd_write_command(0x08); 关闭显示lcd_write_command(0x01); 清屏lcd_write_command(0x06); 设置光标移动方向lcd_write_command(0x0C); 显示开启}void lcd_display_string(unsigned char x, unsigned char y, unsigned char *string) 在指定位置显示字符串{unsigned char address;if (y == 0) {address = 0x80 + x;} else {address = 0xC0 + x;}lcd_write_command(address);while (*string) {lcd_write_data(*string++);}}int main(){unsigned char string[] = "Hello, World!";lcd_init(); LCD初始化lcd_display_string(0, 0, string); 在第一行显示字符串while (1);return 0;}上面的代码中,我们首先定义了一些宏和端口变量,用来控制液晶显示屏。
单片机实验报告

西南科技大学
学生实验报告
实验课程名称单片机原理及接口技术
开课实验室CAD/CAM计算机实验室
学院制造学院专业成型班级
学生姓名学号
开课时间2012 至2013 学年第 2 学期
制造科学与工程学院制
《 I/O接口技术实验》实验报告
修改工程属性,点击快捷按钮
8.编写完成后,进行编译程序。
选择对应的单片机型号(STC89C52RC)、打开(HEX)程序文件、对应的串行口编号,再选择下载程序,打开单片机上的开关以传输下载文件
11.观察单片机上的现象,并检查是否正确
《中断系统》实验报告。
西南科技大学单片机原理实实验四及代码

2.1 实验四中断实验一、实验目的加深对MCS-51单片机中断系统基础知识的理解。
二、实验设备Keil C单片机程序开发软件。
Proteus仿真软件DP51-PROC单片机综合实验仪。
三、实验内容和步骤内容:利用外部中断输入引脚(以中断方式)控制步进电机的转动。
要求:每产生1次中断,步进电机只能步进1步。
实验程序:使用INT0的中断服务程序控制步进电机正向步进;使用INT1中断服务程序控制步进电机反向步进。
设计思路:①主程序在完成对INT0和INT1的设置后,可进入死循环(等待中断请求)。
②为便于实验观察和操作,设INT0和INT1中断触发方式为边沿。
③步进电机的转动控制由外部中断的服务程序来实现。
④当前步进电机的相位通电状态信息可以使用片内RAM中的一个字节单元来存储。
设计参考:①主程序需要设置的中断控制位如下:IT0和IT1 外部中断触发方式控制0=电平1=边沿(下降沿)EX0和EX1 外部中断允许控制0=屏蔽1=允许PX0和PX1 中断优先级级别控制0=低级1=高级在同级别(PX0=PX1)时INT0的优先级高于INT1EA 中断允许总控制0=屏蔽1=允许②外部中断服务程序的入口地址:0003H 外部中断00013H 外部中断1预习:1)编写好实验程序。
2)根据编写的程序和实验步骤的要求制定调试仿真的操作方案。
实验单元电路:1) 步进电机驱动电路。
步进电机共有4相,当以A →B →C →D →A →B …的顺序依次通电时,电机就会正转,若按相反的顺序依次通电,电机就会反转。
每顺序切换一相(1步),电机旋转18°,切换的频率决定电机的转速(切换的频率不能超过电机的最大响应频率)。
根据图2.4中的电路,当BA (插孔)输入为高时,对应的A 相通电。
2) SW 电路开关SW X 拨在下方时,输出端SWX 输出低电平,开关SW X 拨在上方时,输出端SWX 输出高电平。
其中SW1和SW3具备消除抖动电路,这样,SW1或SW3每上下拨动一次,输出端产生单一的正脉冲(上升沿在前,下降沿在后)。
西南科技大学单片机实验考试程序题库

(在两个中)识别最大模拟输入通道一、任务利用0809采集两路模拟电压,将电压值最大的通道号显示在LED显示器上。
(硬件电路参见AD_CH2_1.DSN)。
二、设计参考:①算法:依次采集两路模拟电压,并将其保存。
当所有通道都采集完后,比较通道的采样值,将采样值最大的通道号显示(当采样值一样时,显示其中最小通道编号)。
注:通道IN0~IN7的编号分别为0~7。
②LED显示的段码:字符编码0 0C0H1 0F9H2 0A4H3 0B0H4 99H5 92H6 82H7 0F8H8 80H9 90H③地址分配:0809片选地址3C00H通道地址片选地址+通道编号3X3键盘扫描三、任务利用8155的PB、PC口实现3X3键盘扫描(硬件电路参见3X3KEY_8155.DSN)。
当1~8号键独立按下时,连接在PA口对应的LEDx点亮(即1号键按下时LDE1亮,2号键按下时LDE2亮),当9号键按下时,所有LED点亮,当没有键按下时,所有LED熄灭。
四、设计参考:①8155命令/状态寄存器格式:D7 TM2D6TM1D5IEBD4IEAD3PC2D2PC1D1PBD0PAPA 0=A口输入;1=A口输出PB 0=B口输入;1=B口输出PC2PC1 00=A口、B口基本输入输出,C口输入01=A口、B口基本输入输出,C口输出10=略11=略IEA 略IEB 略TM2TM1 略②8155端口地址分配:控制口7F00HPA 7F01HPB 7F02HPC 7F03H3X3键盘扫描五、任务利用8255的PC口实现3X3键盘扫描(硬件电路参见3X3KEY_8255.DSN)。
当1~8号键独立按下时,连接在PA口对应的LEDx点亮(即1号键按下时LDE1亮,2号键按下时LDE2亮),当9号键按下时,所有LED点亮,当没有键按下时,所有LED 熄灭。
六、设计参考:①8255控制字格式:②8255端口地址分配:PA 0000HPB 0400HPC 0800H控制口0C00H 控制字标志1有效D7D6D5D4D3 D2D1 D0C口低4位0 输出,1输入工作方式0 方式0,1方式1B口0 输出,1输入C口高4位0 输出,1输入工作方式00 方式0,01方式11x方式1A口0 输出,1输入50赫兹同步锯齿波发生器七、任务利用0832同步输出两个频率为50赫兹的锯齿波(硬件电路参见DA_BUF2_1.DSN)。
单片机实验程序全

//------------LED显示代码-----------//
// bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
// dp G C D E F B A
uchar code seg[10]={0x3f,0x22,0x5b,0x73,0x66,//0,1,2,3,4
buzzer=~buzzer;
}
if(voice==2)
{TH0=T0ReLoadH2;
TL0=T0ReLoadL2;
buzzer=~buzzer;
}
if(voice==3)
{
}
}
4 LED数码管动态扫描显示实验
#include<STC12c5A32s2.h>
#defineuint unsignedint
TL0 =T0ReLoadL;
TR0 =1;//启动Timer0
ET0 =1;//Timer0中断使能
EA =1;//总开关使能
counter=0;
//-----------------------------大循环
WR_DS1302(0x8e,0X00);
WR_DS1302(0x84,0X14);
功能:产生10ms定时中断
**********************************************************/
void Timer0_Int(void) interrupt1
{if(voice==1)
{TH0=T0ReLoadH1;//重装载计数器初值
TL0=T0ReLoadL1;
#define T0ReLoadL((65536-(uint)(T0_TIME*11.0592/12)) % 256)
单片机程序代码1

闪烁灯一/***********************************************************************/#include<reg52.h>#define uchar unsigned char //这里用"uchar"代替"unsigned char","uchar"用来定义无符号字符型数。
#define uint unsigned int //"uint"用来定义无符号整型数。
sbit Show_LED = P0^0; //用来声明P0.0口为程序所要控制的端口,"sbit"是KEIL专门用来声明某位IO口/********************************************************************* 名称: Delay()* 功能: 延时,延时时间为10ms * del。
这是通过软件延时,有一定误差。
* 输入: del* 输出: 无***********************************************************************/void Delay(uint del){uint i,j;for(i=0; i<del; i++)for(j=0; j<1827; j++) //这个是通过软件仿真得出的数;}/********************************************************************* 名称: Main()* 功能: 实现灯的闪烁* 输入: 无* 输出: 无***********************************************************************/void Main(void){P0 = 0xff; //关闭所有LEDwhile(1){Show_LED = 1;Delay(20); //Delay(del)中的数为延时的时间参数,延时时间为10ms * del.Show_LED = 0;Delay(20);}}闪烁灯二/********************************************************************* 文件名:闪烁灯二.c* 描述:* 创建人:东流,2009年8月27日* 版本号:1.0***********************************************************************/ #include<reg52.h>#define uchar unsigned char#define uint unsigned int/********************************************************************* 名称: Delay()* 功能: 延时,延时时间为10ms * del* 输入: del* 输出: 无***********************************************************************/ void Delay(uint del){uint i,j;for(i=0; i<del; i++)for(j=0; j<1827; j++);}/********************************************************************* 名称: Main()* 功能: 实现灯的闪烁* 输入: 无* 输出: 无***********************************************************************/ void Main(void){P0 = 0xff; //关闭所有LEDwhile(1){/*下面四行用于控制LED每隔一个亮*/P0 = 0xaa;Delay(50);P0 = 0x55;Delay(50);/*下面四行用于控制LED每隔一个亮*/P0 = 0xcc;Delay(50);P0 = 0x33;Delay(50);/*下面四行用于控制LED 高四位或者低四位亮*/P0 = 0x0f;Delay(50);P0 = 0xf0;Delay(50);/*下面八行用于控制LED的两次全亮全灭*/P0 = 0x00;Delay(25);P0 = 0xff;Delay(25);P0 = 0x00;Delay(25);P0 = 0xff;Delay(25);Delay(200); //延时两秒}}3流水灯A/********************************************************************* 文件名:流水灯.c* 描述: 该程序实现LED的流水灯显示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一 功能:使连接在MCS-51单片机P1.0引脚的LED 闪烁。
设计思路:① 点亮LED 需要约10 mA 电流,此时LED 两端电压差约2 V 。
因此,将LED 的阴极通过一个电阻连接到P1.0引脚(电阻阻值约为200 Ω),阳极连接到电源VCC (5 V )。
② 为便于观察,交替的时间间隔不应太小(建议选择在0.5 s 左右),由于该时间不要求严格精确,所以,可采用软件延时的方法实现。
③ 程序可采用图2.1中的流程结构。
ORG 0000HAJMP STARTORG 0030HSTART: MOV P1,#0FFHLOOP: CPL P1.0ACALL DELAYAJMP LOOPDELAY: MOV R0,#99DL2: MOV R1,#99DL1: NOPNOPDJNZ R1,DL1DJNZ R0,DL2RETEND实验二 设计并调试一个双字节无符号数乘法子程序。
功能:双字节无符号数乘法子程序。
入口参数: 被乘数放在R7(高)和R6(低);乘数放在R5(高)和R4(低);积(片内RAM 中的连续4字节)的首地址放在R0中。
设计思路:由于MCS-51指令集中只有单字节无符号数乘法指令,因此需要将双字节无符号数相乘变换成4次单字节无符号数相乘,才能利用乘法指令实现双字节无符号数乘法计算。
变换方法如图2.1所示。
MCS-51指令集中乘法指令的结果是固定存放在A 和B 中的,因此每次乘法操作后都须将结果保存在积中。
所以应首先将积的初值置0图2.1 实验一程序流程图图2.1 双字节无符号乘法示意图R6 ⨯ R5 R7 ⨯ R4 低字节高字节且在每次乘法指令结束后需要进行2次加操作,分别将A和B加到积的对应位置(注意:在两次加法之间要考虑进位)。
ORG 0000HAJMP STARTADR EQU 20HORG 0030HSTART:MOV R0,#ADRMOV R4,#14HMOV R5,#05HMOV R6,#35HMOV R7,#21HACALL DW_MULAJMP $DW_MUL:MOV R1,#04HCLE:MOV @R0,#00HINC R0DJNZ R1,CLEMOV R0,#ADRMU:MOV A,R4MOV B,R6MUL ABMOV @R0,AMOV A,BINC R0ADDC A,@R0MOV @R0,AMOV A,R4MOV B,R7MUL ABADDC A,@R0MOV @R0,AMOV A,BINC R0ADDC A,@R0MOV @R0,AMOV A,R5MOV B,R6MUL ABDEC R0ADDC A,@R0MOV @R0,AMOV A,BINC R0ADDC A,@R0MOV @R0,AMOV A,R5MOV B,R7MUL ABADDC A,@R0MOV @R0,AMOV A,BINC R0ADDC A,@R0MOV @R0,ARETEND实验三:设计并调试一个将双字节无符号二进制数转换为压缩BCD数的子程序。
功能:双字节无符号二进制数转换为压缩BCD数子程序入口参数:双字节无符号二进制数的地址放在R0中;存放转换结果(BCD数)的地址放在R1中。
设计思路:①双字节无符号二进制数最大值为0FFFFH,对应的十进制数为65535,其压缩BCD编码表示为06H,55H,35H,所以转换结果应用3个字节存放。
② Y=(D15D14…D1D0) 2 = (((…(((0⨯2)+D15)⨯2+D14) ⨯2+…) ⨯2+D1) ⨯2+D0) 2。
Y0=(0⨯2)+D15,Y1= Y0+D14,Y2= Y1+D13,…,Y15= Y14+D0,Y= Y15。
Y0|BCD =( (0⨯2)+D15)|BCD,Y1|BCD =( Y0+D14)|BCD,…,Y15 |BCD = ( Y14+D0)|BCDY |BCD =Y15|BCD算法:1、Y=02、Y=Y⨯2+Di (i =15,14,…,2,1,0)3、对Y进行十进制调整4、重复2、3步16次③Y=Y⨯2+Di可用Y=Y+Y+C实现(Di首先放在C中),考虑到Y存放在3个字节,应分别加3次,且要考虑每次加法产生的C。
ORG 0000HAJMP STARTORG 0030HSTART:MOV SP,#60HMOV R1,#25HMOV R0,#20HMOV @R0,#43HINC R0MOV @R0,#4AHACALL DW_BCDAJMP $DW_BCD:DEC R0MOV A,R0MOV R6,AMOV A,R1MOV R7,AMOV R2,#3 CLEAR:CLR AMOV @R1,AINC R1DJNZ R2,CLEARMOV R3,#16CLR C YIWEI: MOV A,R6 MOV R0,AMOV A,@R0RLC AMOV @R0,AINC R0MOV A,@R0RLC AMOV @R0,AMOV R2,#3MOV A,R7MOV R1,A FANG: MOV A,@R1 ADDC A,@R1DA AMOV @R1,AINC R1DJNZ R2,FANGDJNZ R3,YIWEIRETENDMOV R1,#25HMOV R0,#20HMOV @R0,#0FFHINC R0MOV @R0,#0FFH ;20H 21H=FFHmov @r1,#0efhACALL DW_BCDAJMP $DW_BCD: DEC R0MOV A,R0MOV R6,AMOV A,R1MOV R7,A ;R7=25h R6=20HMOV R2,#3CLEAR: CLR AMOV @R1,AINC R1DJNZ R2,CLEAR;25H 26H 27H==00MOV R3,#16CLR CYIWEI: MOV A,R6MOV R0,AMOV A,@R0RLC AMOV @R0,AINC R0MOV A,@R0RLC AMOV @R0,AMOV A,R7MOV R1,AMOV R2,#3FANG: MOV A,@R1ADDC A,@R1DA A;16进制到10 进制的转化INC R1DJNZ R2,FANGDJNZ R3,YIWEIRETEND实验四:利用外部中断输入引脚(中断方式)控制步进电机的转动。
要求:每产生1次中断,步进电机只能步进1步。
使用INT0的中断服务程序控制步进电机正向步进;使用INT1中断服务程序控制步进电机反向步进。
设计思路:①主程序在完成对INT0和INT1的设置后,可进入死循环(等待中断请求)。
②为便于实验观察和操作,设INT0和INT1中断触发方式为边沿。
③步进电机的转动控制由外部中断的服务程序来实现。
④当前步进电机的相位通电状态信息可以使用片内RAM中的一个字节单元来存储。
ORG 0000HLJMP RESETORG 0003H ;外部中断0 服务程序入口LJMP INT_EX0ORG 000BH ;定时器/计数器0 溢出中断服务程序入口RETIORG 0013H ;外部中断1 服务程序入口LJMP INT_EX1ORG 001BH ;定时器/计数器1 溢出中断服务程序入口RETIORG 0023H ;串行口中断服务程序入口RETIORG 0040H ;复位处理程序RESET:MOV SP, #67HSETB IT0SETB IT1SETB EX0SETB EX1MOV 30H,#11110111BCLR A ;累加器A清零SETB EAMAIN: SJMP MAININT_EX0: ;使用INT0的中断服务程序控制步进电机正向步进PUSH ACCMOV A,30HRR A ;累加器A的内容向右循环移位一位MOV P1,APOP ACCRETIINT_EX1: ;使用INT1中断服务程序控制步进电机反向步进PUSH ACCMOV A,30HRL A ;累加器A的内容向左循环移位一位MOV 30H,AMOV P1,APOP ACCRETIEND另一种实验方法:ORG 0000H ;复位入口LJMP RESETORG 0003H ;外部中断0 服务程序入口LJMP INT_EX0ORG 000BH ;定时器/计数器0 溢出中断服务程序入口RETIORG 0013H ;外部中断1 服务程序入口LJMP INT_EX1ORG 001BH ;定时器/计数器1 溢出中断服务程序入口RETIORG 0023H ;串行口中断服务程序入口RETIORG 040H ;复位处理程序RESET: MOV SP,#67HSETB IT0SETB IT1SETB EX0SETB EX1MOV 30H,#11110111BCLR ASETB EAMAIN: SJMP MAIN;----------------------------------------使用INT0的中断服务程序控制步进电机正向步进INT_EX0:MOV R0,#00H ;正转至TABLE取码指针初值ABC: MOV A, R0 ;至TABLE取码MOV DPTR, #TABLE ;存表MOVC A,@A+DPTR ;取表代码JZ INT_EX0 ;是否取到结束码(00H)?MOV P0, A ; 输出至P0,正转INC R0 ;取下一个码JMP ABC ;转至Z_M处,循环RETI;----------------------------------------使用INT1中断服务程序控制步进电机反向步进INT_EX1:MOV R0, #05 ;反转至TABLE取码指针初值ABC1: MOV A, R0 ;至TABLE取码MOV DPTR, #TABLE ;存表MOVC A, @A+DPTR ;取表代码JZ INT_EX1 ;是否取到结束码(00H)?MOV P0, A ; 输出至P0, 反转INC R0 ;取下一个码JMP ABC1 ; 转至F_M1处,循环RETI ;反转子程序TABLE: DB 0FCH, 0F9H, 0F3H, 0F6H ;正转DB 00H ;正转结束码DB 0F7H, 0F3H, 0FBH, 0F9H ; 反转DB 0FDH, 0FCH, 0FEH, 0F6HDB 00H ;反转结束码END ;程序结束实验五:利用定时/计数器测量电动机的转速。
使用T1作为定时器(定时时间为50毫秒),T0作为计数器(计数由电机测速电路产生的脉冲个数,每转4个脉冲),每1秒时间后,读出T0的值(读出后须将T0清0),将该值(速度值*4)显示到LCM显示器上(显示子程序/函数由实验库文件提供)。
本次实验程序需要使用实验库文件(LCMDRV_12864.LIB)。
该库中的子程序/函数占用单片机片内RAM中地址为18H~20H的单元,因此实验程序不能使用这些单元。