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

合集下载

单片机个实验代码详细

单片机个实验代码详细

第一章单片机系统板说明一、概述单片机实验开发系统是一种多功能、高配置、高品质的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 语言代码的应用。

首先,我们可以使用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)。

单片机实验程序全

单片机实验程序全
#defineuchar unsignedchar
//------------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

单片机程序代码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的流水灯显示。

单片机程序源代码完整版.doc

单片机程序源代码完整版.doc
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=120;j>0;j--);
}
void main()
{
uint i;
while(1)
{
P1=0xff;
delay(500);
for(i=0;i<4;i++)
{
P1=table[i];
delay(500);
{uint j;
for(j=0;j<120;j++);
}
}
void main()
{
while(1)
{
P0=0xfe;
while(P0!=0x7f)
{
//P1=temp;
//delayms(500);
P0=_crol_(P0,1);
delayms(250);
}
temp=0x7f;
while(P0!=0xfe)
利用89c51单片机的端口控制8个LED(D0~D7)循环点亮,刚开始时D0点亮,延时片刻后,接着D1点亮,然后依次点亮D2->D3->D4->D5 ->D6->D7,然后再点亮D7->D6->D5->D4 ->D3->D2->lt;reg52.h>
#include <intrins.h>
}
for(i=3;i>0;i--)
{
P1=table[i-1];
delay(500);
}
}
}
任务四:复杂广告灯的设计
利用89c51单片机的端口实现8个LED(D0~D7)复杂广告灯的控制,要求显示规律为:正向流水->反向流水->隔灯闪烁3次->高四盏、低四盏闪烁2次->隔两盏闪烁3次,再重复循环。

单片机开发与实训演示代码

单片机开发与实训演示代码

单片机开发与实训演示代码全文共四篇示例,供读者参考第一篇示例:在单片机开发和实训演示代码中,我们通常会使用一些常见的单片机开发平台,比如基于STMicroelectronics公司的STM32系列单片机的开发板。

STM32系列单片机是一种性能优越的单片机,拥有丰富的外设和强大的性能,非常适合用于各种复杂的应用场景。

在进行单片机开发和实训演示代码时,我们通常会使用一些常见的开发工具,比如Keil C51开发环境、ST-Link调试器等。

这些工具可以帮助开发者更加高效地进行单片机程序的编写和调试,提高开发效率和代码质量。

接下来,我们将介绍一些常见的单片机开发与实训演示代码例程,希望可以帮助读者更好地理解和掌握单片机开发技术。

1. LED闪烁实验LED闪烁实验是单片机开发中的一个最基础的实验,通过控制单片机的IO口来驱动LED灯实现闪烁的效果。

以下是一个基于STM32单片机的LED闪烁实验代码:```c#include "stm32f10x.h"#define LED_PIN GPIO_Pin_5#define LED_GPIO GPIOAvoid LED_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = LED_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(LED_GPIO, &GPIO_InitStructure);}在这个代码中,我们首先调用了LED_Init函数来初始化LED的GPIO口,使其为输出模式。

西南科技大学单片机原理实实验一及代码

西南科技大学单片机原理实实验一及代码

第2章基础实验2.1 实验一系统认识实验一、实验目的学习实验系统的基本操作,了解在实验系统中进行程序设计、仿真和调试的操作方法和步骤。

二、实验设备Keil单片机程序开发软件。

Proteus仿真软件DP51-PROC单片机综合实验仪。

DT-2003数字万用表。

三、实验内容和步骤内容:简单单片机应用程序的编辑、编译、仿真和调试。

实验程序:功能:使连接在MCS-51单片机P1.0引脚的LED闪烁。

设计思路:①点亮LED需要约10 mA电流,此时LED两端电压差约2 V。

因此,将LED 的阴极通过一个电阻连接到P1.0引脚(电阻阻值约为200 ),阳极连接到电源VCC(5 V)。

②为便于观察,交替的时间间隔不应太小(建议选择在0.5 s左右),由于该时间不要求严格精确,所以,可采用软件延时的方法实现。

③程序可采用图2.1中的流程结构。

图2.1 实验一程序流程图预习:1)提前一周预约好实验时间。

2)自学Keil和Proteus两软件的基本使用方法。

3)按设计思路,用汇编语言或C51语言编制实验程序。

4)了解本次实验的步骤和操作方法。

图2.2 实验一电路图步骤:1)在S: \ STUDY \ Kiel文件夹中新建Ex01文件夹(该文件夹用于保存本次实验的所有内容),通过网上邻居将服务器上本次实验共享文件夹下的所有文件拷贝到S: \ STUDY \ Kiel \ Ex01文件夹中。

2)运行Keil并创建一个新工程。

工程保存为S: \ STUDY \ Kiel \ Ex01 \ Ex01. Uv2。

选择单片机型号为Generic中的8051。

创建新工程的操作方法:菜单Project New Project…3)设置工程选项,将工程选项设置如下:Target页夹:Xtal= 12 MHzOutput页夹:Create HEX FileBL51 Locate页夹:取消Use Memory Layout from Target Dialog设置Code Range属性为0x40-0xFFF如用C51编程,设置此页夹。

单片机实验代码

单片机实验代码

单片机实验代码文件排版存档编号:[UYTR-OUPT28-KBNTL98-UYNN208]单片机实验代码实验一ORG 0000hAJMP HA1SORG 0030HHA1S: MOV A,#00HHA1S1: JB P3.3,HA1S1MOV R2,#20HLCALL DELAYJB P3.3,HA1S1HA1S2: JNB P3.3,HA1S2MOV R2,#20HLCALL DELAYJNB P3.3,HA1S2INC APUSH ACCMOV P1,APOP ACCAJMP HA1S1DELAY: PUSH 02HDELAY1: PUSH 02HDELAY2: PUSH 02HDELAY3: DJNZ R2,DELAY3POP 02HDJNZ R2,DELAY2POP 02HDJNZ R2,DELAY1POP 02HDJNZ R2,DELAYRETEND实验二ORG 0000HAJMP 0030HORG 0013HLJMP HA2S3ORG 0030HHA2S: MOV P1,#0fFH ORL P3,#00HHA2S1: JB P3.4,HA2S1 ORL IE,#84HORL IP,#04HMOV PSW,#00HMOV SP,#53HHA2S2: MOV P1,#081H ACALL HA2S7MOV P1,#082HACALL HA2S7MOV P1,#084HACALL HA2S7MOV P1,#088HACALL HA2S7MOV P1,#090HACALL HA2S7MOV P1,#0A0HACALL HA2S7MOV P1,#0C0HACALL HA2S7SJMP HA2S2HA2S3: MOV B,R2HA2S5: SETB P1.7ACALL HA2S6CLR P1.7ACALL HA2S6JNB P3.3,HA2S5MOV R2,BRETIHA2S6: MOV R2,#06H ACALL DELAYRETHA2S7: MOV R2,#30HACALL DELAYRETDELAY: PUSH 02H DELAY1: PUSH 02H DELAY2: PUSH 02H DELAY3: DJNZ R2,DELAY3 POP 02HDJNZ R2,DELAY2POP 02HDJNZ R2,DELAY1POP 02HDJNZ R2,DELAYRETEND实验10org 0000hSjmp MAINorg 000bhmov th0,r1mov tl0,r0cpl p1.0RETIMAIN:MOV TMOD,#01H MOV IE,#82HMOV DPTR,#TABLOOP: CLR AMOVC A,@A+DPTRMOV R1,AINC DPTRCLR AMOVC A,@A+DPTRMOV R0,AORL A,R1JZ NEXT0MOV A,R0ANL A,R1CJNE A,#0FFH,NEXTSJMP MAINNEXT : MOV TH0,R1MOV TL0,R0SETB TR0SJMP NEXT1NEXT0:CLR TR0NEXT1: CLR AINC DPTRMOVC A,@A+DPTRMOV R2,ALOOP1: ACALL D200CDJNZ R2,LOOP1INC DPTRAJMP LOOPD200C:MOV R3,#81HD200B:MOV A,#0FFHD200A:DEC AJNZ D200ADEC R3CJNE R3,#00H,D200BRETTAB: DB 0FEH,25H,04H,0FEH,25H,02H ;11 1 5 DB 0FEH,25H,02H,0FDH,80H,04HDB 0FEH,84H,02H,0FEH,84H,02H;33 3 1DB 0FEH,84H,04H,0FEH,25H,04HDB 0FEH,25H,02H,0FEH,84H,02H;13 5 5DB 0FEH,0C0H,04H,0FEH,84H,02HDB 0FEH,98H,02H,0FEH,84H,02H;43 2 -DB 0FEH,57H,08H,00H,00H,04HDB 0FFH,0FFHEND;1=131 262 523 1047;2=147 294 587 1175;3=165 330 659 1319;4=175 349 698 1397;5=196 392 784 1568;6=220 440 880 1760;7=247 494 988 1976实验十一ORG 0000HAJMP STARTORG 0030HSTART: SETB P1.0 LCALL DELAYCLR P1.0LCALL DELAYSJMP STARTDELAY: MOV R7,#0FFH DELAY1: MOV R6,#0FFH DELAY2: DJNZ R6,DELAY2 DJNZ R7,DELAY1RETEND实验六ORG 0000HAJMP HA6SORG 0030HHA6S: MOV SP,#53HHA6S1: MOV R6,#00HHA6S2: MOV DPTR,#8000H MOV A,R6MOVX @DPTR,AMOV R2,#30HLCALL DELAY;INC R6;CJNE R6,#0FFH,HA6S2 HA6S3: MOV R6,#0FFH MOV DPTR,#8000H; DEC R6MOV A,R6MOVX @DPTR,AMOV R2,#30HLCALL DELAY;CJNE R6,#00H,HA6S3 SJMP HA6S1DELAY: PUSH 02HDELAY1: PUSH 02H DELAY2: PUSH 02H DELAY3: DJNZ R2,DELAY3 POP 02HDJNZ R2,DELAY2POP 02HDJNZ R2,DELAY1POP 02HDJNZ R2,DELAYRETEND实验29TIMER EQU 01Horg 0000hajmp STARTORG 000BHAJMP INT_T0ORG 070HSTART: MOV SP,#53H MOV TMOD,#01HMOV TL0,#00HMOV TH0,#4BHMOV R0,#0HMOV TIMER,#20MOV SCON,#00HCLR TICLR RISETB TR0SETB ET0SETB EASJMP $INT_T0: PUSH ACCPUSH PSWCLR EACLR TR0MOV TL0,#0HMOV TH0,#4BHSETB TR0DJNZ TIMER,EXITMOV TIMER,#20MOV DPTR,#CDATAMOV A,R0MOVC A,@A+DPTRCLR TICPL AMOV SBUF,AINC R0CJNE R0,#0AH,EXITMOV R0,#0HEXIT: SETB EAPOP PSWPOP ACCRETICDATA: DB 03H,9FH,25H,0DH,99H,49H,41H,1FH,01H,09H END相关文档:更多相关文档请访问:。

单片机代码实验

单片机代码实验

2014年EDA 实验第一次实验:实验1:QII 软件及实验板的使用;用图形输入法和语言输入法完成点灯实验(用两个按键控制两个灯的亮灭:灯的状态随按键状态改变而改变)。

完成软件仿真。

实验2:联控点灯实验:用两个按键独立控制同一个灯亮灭,第三个按键同时控制该灯和另一个灯亮灭。

实验3:流水灯实验:完成一个8路流水灯控制实验,要求有以下3种花型:1)8路灯同时亮灭;2)从左至右再从右至左逐个亮(每次只有1路亮);3)8路灯每次4路灯亮,4路灯灭,且亮灭相间,交替亮灭。

用3个按键控制3种花型。

按下花型按键就一直显示相应花型,再按该键可暂停。

可设置1个复位键关闭显示。

(亮灭时间自定。

)第二次实验:实验4:数据分配器实验:用2个按键代表输入数据in (2位),用2个按键代表选择控制数据位s1s0,用四组发光管(每组2位)代表四路数据输出out0-out3。

当输入数据或控制数据改变时,要求输出数据进行相应变化(原理和真值表如下)。

实验5:七段译码器实验:用一个按键代表数据输入,每按一次数据加一,从0开始到F ,再到0,依次循环,相应数字在数码管上显示。

第三次实验:实验6:数控分频器实验:用24MHz 时钟分频,通过不同按键控制输出不同的频率信号,输出信号用LED 指示。

1)1Hz 频率信号;2)10Hz 频率信号;3)0.5Hz 频率信号。

实验7:加法计数器实验在时钟信号(选择1Hz)作用下,通过使能端和复位信号完成加法计数器的计数。

用2个按键分别表示使能和复位,用4个发光管表示计数的二进制结果。

第四次实验:实验8:动态扫描实验:用4个按键分别代表加、减、暂停、复位,四位数码管代表四位十进制数,从0000开始到9999循环,自动计数,数据显示时间不大于1秒。

第五次实验:实验9:序列检测实验:用一个按键代表时钟,一个按键代表输入数据,(时钟和数据要用LED显示其电平或数值,)当检测到1101序列时,蜂鸣器响动,指示灯点亮。

单片机实验代码

单片机实验代码

;////////////////////////////////////////////////////////;按键功能说明;K1 键显示界面切换默认显示时间:时分秒;K2 键显示时间的时候,进行时间调整,调时按键;K3 键显示时间的时候,进行时间调整,调分按键;K4 键显示日期的时候,进行日期调整,调年按键;K5 键显示日期的时候,进行日期调整,调月按键;K6 键显示日期的时候,进行日期调整,调日按键;程序有待优化。

谢谢使用。

;MADE BY QIANZHAO;QQ: 454800714;////////////////////////////////////////////////////////SDA BIT P1.7;I2C 总线定义SCL BIT P1.6RST BIT P1.0KEY_INT BIT P3.2MTD EQU 58H ;发送数据缓冲器MRD EQU 34H ;接收数据缓冲区;定义器件地址,变ZLG7290 EQU 70H ;ZLG7290 的器件地址ACK BIT 10H ;应答标志位SLA DA TA 50H ;器件的从地址SUBA DATA 51H ;器件的子地址NUMBYTE DATA 52H ;读/写的字节数变量disp_buf EQU 60Hswich_date BIT 12HDA TALABLEBIT 13HTIMELABLE BIT 14HORG 8000HLJMP MAINORG 800BHLJMP TIMER_0ORG 8003HLJMP INT_0ORG 8300H$INCLUDE(VI2C_ASM.INC) ;包含VIIC 软件包MAIN:MOV SP,#70H;--使用T0 定时初始化--;MOV IP,#02HMOV IE,#82HMOV 20H,#12H;--使用T0 定时初始化--;CLRA;初始化赋初值时间MOV 36H,#12HMOV 35H,#30HMOV 34H,#45H;初始化赋初值日期MOV 37H,#20HMOV 38H,#05HMOV 39H,#12H;初始化赋初值MOV TMOD,#01HMOV TH0,#3CHMOV TL0,#0B0HSETB TR0;开INT0 中断SETB EX0SETB IT0SETB EA;----------------对zlg7290 的初始化操作----; CLRRSTLCALL DELAYSETB RSTLCALL DELAY;--------MAINLOOP:MOV SLA,#ZLG7290 ;指定器件地址MOV SUBA,#01H ;指定子地址MOV NUMBYTE,#02H ;发送2 字节数据LCALL IWRNBYTE ;调用写2 字节数据程序LCALL DELAYMOV R6,38HCJNE R6,#4,C1AJMP C0C1:CJNE R6,#6,C2AJMP C0C2:CJNE R6,#9,C3AJMP C0C3:CJNE R6,#11H,C4AJMP C0C4:CJNE R6,#2,C6AJMP C5C0:MOV A,37HCJNE A,#31H,WW1MOV 37H,#01HSJMP WW2C5:MOV A,37HCJNE A,#29H,WW1MOV 37H,#01HSJMP WW2C6:MOV A,37HCJNE A,#32H,WW1MOV 37H,#01HSJMP WW2WW2:MOV A,#01HADDA,38HDAAMOV 38H,ACJNEA,#13H,WW1MOV 38H,#01HMOV A,#01HADDA,39HDAAMOV 39H,ACJNEA,#99H,WW1MOV 39H,#00HWW1:SJMP JUMP;选择界面显示JUMP: JB swich_date,display_time SJMP display_dateLOOP1:JNB KEY_INT,KEY_HANDLE SJMP MAINLOOPKEY_HANDLE:;执行中断程序LJMP INT_0;要显示日期数据处理display_date:MOV A,MRD+3ANL A,#0x7fMOV MRD+3,AMOV A,MRD+4ANL A,#0x7fMOV MRD+4,A MOV A,MRD+3ANL A,#0X0FMOV disp_buf,A MOV A,MRD+3 SWAP AANL A,#0X0FMOV disp_buf+1,A MOV A,MRD+4ANL A,#0X0FADD A,#0X80MOV disp_buf+2,A MOV A,MRD+4 SWAP AANL A,#0X0FMOV disp_buf+3,A MOV A,MRD+5ANL A,#0X0FADD A,#0X80MOV disp_buf+4,A MOV A,MRD+5 SWAP AANL A,#0X0FMOV disp_buf+5,A MOV disp_buf+6,#00H MOV disp_buf+7,#02H SJMP DISPLAY;要显示时间数据处理display_time:MOV A,MRDANL A,#0x7fMOV MRD,AMOV A,MRD+1ANL A,#0x7fMOV MRD+1,A MOV A,MRD+2ANL A,#0x3fMOV MRD+2,A MOV A,MRDANL A,#0X0FMOV disp_buf,A MOV A,MRDSWAP AANL A,#0X0FMOV disp_buf+1,AMOV A,MRD+1ANL A,#0X0FMOV disp_buf+3,AMOV A,MRD+1SWAP AANL A,#0X0FMOV disp_buf+4,AMOV A,MRD+2ANL A,#0X0FMOV disp_buf+6,AMOV A,MRD+2SWAP AANL A,#0X0FMOV disp_buf+7,AMOV disp_buf+2,#1FHMOV disp_buf+5,#1FHDISPLAY:MOV R7,#0X08MOV R1,#disp_bufMOV A,#0X60DISLOOP:MOV MTD,APUSH ACCMOV 31H,R1MOV 30H,R7MOV MTD+1,@R1MOV SLA,#ZLG7290 ;指定器件地址MOV SUBA,#07H ;指定子地址MOV NUMBYTE,#02H ;发送2 字节数据LCALL IWRNBYTE ;调用读2 字节数据程序LCALL DELAYMOV R1,31HMOV R7,30HPOPACCINC R1INC ADJNZ R7,DISLOOPLJMP LOOP1;T0 中断程序开始TIMER_0:PUSHACCPUSH PSW ;保护现场MOV TH0,#3CHMOV TL0,#0B0HDJNZ 20H,RETI1MOV 20H,#12HMOV A,#01HADDA,34HDAAMOV 34H,ACJNEA,#60H,RETI1MOV 34H,#00HMOV A,#01HADDA,35HDAAMOV 35H,ACJNEA,#60H,RETI1MOV 35H,#00HMOV A,#01HADDA,36HDAAMOV 36H,ACJNEA,#24H,RETI1MOV 36H,#00HINC 37HRETI1:POP PSWPOPACCRETI;INT0 中断程序?INT_0:PUSHACCPUSH PSW ;保护现场PUSH MRDMOV SLA,#ZLG7290 ;指定器件地址MOV SUBA,#01H ;指定子地址MOV NUMBYTE,#01H ;发送2 字节数据LCALL IRDNBYTE ;调用写2 字节数据程序LCALL DELAYMOV A,MRDCJNE A,#01,SHOWDATACPLswich_dateLJMP RETI2SHOWDATA:CJNE A,#02,ADJUSTHOUR ;小时调整MOV A,#01HADD A,36HDA AMOV 36H,ACJNE A,#36,NH28MOV 36H,#0NH28:LJMP RETI2ADJUSTHOUR:CJNE A,#03,ADJUSTYEAR ;分钟调整MOV A,#01HADDA,35HDAAMOV 35H,ACJNEA,#96,NM60MOV 35H,#0NM60:LJMP RETI2ADJUSTYEAR:CJNE A,#04,ADJUSTMONTH ;年调整JB swich_date,ADJUSTMOV A,#01HADDA,39HDAAMOV 39H,ACJNEA,#255,NH26MOV 39H,#0NH26: SJMP RETI2 ADJUSTMONTH: ;月调整CJNE A,#05,ADJUSTDAYJB swich_date,ADJUSTMOV A,#01HADDA,38HDAAMOV 38H,ACJNEA,#19,NH38MOV 38H,#1NH38: SJMP RETI2 ADJUSTDAY: ;日调整CJNE A,#06,ADJUSTJB swich_date,ADJUSTMOV A,#01MOV R6,38HCJNE R6,#4,V1V1:MOV R6,38HCJNE R6,#6,V2;是不是6 月AJMP V0V2:MOV R6,38HCJNE R6,#9,V3;是不是9 月AJMP V0V3:MOV R6,38HCJNE R6,#11H,V4 ;是不是11 月AJMP V0V4:MOV R6,38HCJNE R6,#2,V6;是不是2 月AJMP V5V0:ADDA,37HDAAMOV 37H,ACJNEA,#31H,NH48MOV 37H,#1SJMP RETI2V5:ADDA,37HDAAMOV 37H,ACJNEA,#30H,NH48MOV 37H,#1SJMP RETI2V6:ADDA,37HDAAMOV 37H,ACJNEA,#32H,NH48MOV 37H,#1SJMP RETI2NH48:SJMP RETI2ADJUST:SJMP RETI2RETI2:POP MRDPOPACCRETI;ZLG7290 要求延时DELAY:MOV R7,#80HMIN:DJNZ R7,YS500 RETYS500: LCALL YS500US LJMP MINYS500US:MOV R6,#80H DJNZ R6,$RETDELAY1: MOV R7,#20H DJNZ R7,$RETEND。

单片机实验汇编源程序

单片机实验汇编源程序

;软件实验〇:发光二极管右移显示org 0ajmp mainmain:mov sp,#5fhmov a,#7fhloop:mov p0,alcall delayrr aajmp loopdelay:mov r7,#0del0: mov r6,#0del1:nopnopdjnz r6,del1djnz r7,del0retend;软件实验一:存储器块清零;将内部RAM从30H开始至5h单元内容清零ORG 0000HLJMP STARTORG 0100HSTART: mov r0,#30hmov a,#00hloop: mov @r0,ainc r0cjne r0,#60h,loopsjmp $END ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;将外部RAM从90H开始至0CH单元内容清零ORG 0000HLJMP STARTORG 0100HSTART: mov r0,#90hmov a,#00hloop: movx @r0,ainc r0cjne r0,#0c0h,loopsjmp $END ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;将外部RAM从2000H开始的100个单元内容清零ORG 0000HLJMP STARTORG 0100HSTART: mov dptr,#2000hmov b,#100mov a,#00hloop: movx @dptr,ainc dptrdjnz b,loopsjmp $END;*******************Block equ 3000hmov dptr, #Block ; 起始地址mov r0, #0ffh ; 清256 字节clr aLoop:movx @dptr, ainc dptr ; 指向下一个地址djnz r0, Loop ; 记数减一ljmp $end;软件实验二:二进制到BCD转换程序功能:单字节二进制数转换成为压缩BCD码程序条件:待转换的单字节二进制数放在累加器A中结果:转换后的BCD码十位和个位仍放在累加器A中,百位放在R3中ORG 0000HLJMP STARTORG 0100HSTART: mov B,#100 ;分离出百位放在R3中DIV ABMOV R3,Amov a,#10 ;余数继续分离XCH A,BDIV ABORL A,B ;将十位和个位组合成压缩BCD码sjmp $END****************************************; 将A 拆为三个BCD 码, 并存入Result 开始的叁个单元Result equ 20horg 0ljmp StartBinToBCD:mov b, #100div abmov Result, a ; 除以100, 得百位数mov a, bmov b, #10div abmov Result+1, a ; 余数除以10, 得十位数mov Result+2, b ; 余数为个位数retStart:mov sp, #40hmov a, #123call BinToBCDljmp $end;软件实验三:十进制到ASCII码转换程序功能:给出一个压缩BCD码用逻辑运算方法将其转换成ASCII码程序条件:待转换的压缩BCD码放在30h中结果:转换后的ASCII码放在30h(高位)和31h(低位)单元中ORG 0000HLJMP STARTORG 0100HSTART: mov A,30HMOV B,AORL A,#30HMOV 31H,Amov a,BORL A,#30HMOV 30H,Asjmp $END;*************************; 将A 拆为二个ASCII 码, 并存入Result 开始的二个单元Result equ 20horg 0ljmp StartASCIITab:db '0123456789ABCDEF' ; 定义数字对应的ASCII表BinToHex:mov dptr, #ASCIITabmov b, a ; 暂存Aswap aanl a, #0fh ; 取高四位movc a, @a+dptr ; 查ASCII表mov Result, amov a, b ; 恢复Aanl a, #0fh ; 取低四位movc a, @a+dptr ; 查ASCII表mov Result+1, aretStart:mov sp, #40hmov a, #1ahcall BinToHexljmp $end;软件实验四:存储块移动程序功能:将片外数据存储器2000h单元开始的16个单元的内容移到3000h开始的16个单元中ORG 0000HLJMP STARTORG 0100HSTART: mov dptr,#2000hMOV b,#16mov r0,#30hloop1: movx a,@dptrmov @r0,ainc dptrinc r0djnz b,loop1mov b,#16mov r0,#30hmov dptr,#3000hloop2: mov a,@r0movx @dptr,ainc r0inc dptrdjnz b,loop2sjmp $END;********************************* ; 移动3000H --> 4000H, 256 字节mov r0, #30hmov r1, #00hmov r2, #40hmov r3, #00hmov r7, #0Loop:mov dph, r0mov dpl, r1movx a, @dptrmov dph, r2mov dpl, r3movx @dptr, acjne r1, #0ffh, Goon1inc r0Goon1:inc r1cjne r3, #0ffh, Goon2inc r2Goon2:inc r3djnz r7, Loopljmp $end;软件实验五:org 0ljmp StartFunc0: mov a, #0retFunc1: mov a, #1retFunc2: mov a, #2retFunc3: mov a, #3retFuncEnter:add a, acc ; ajmp 为二字节指令, 调用号X 2mov dptr, #FuncTabjmp @a+dptrFuncTab:ajmp Func0ajmp Func1ajmp Func2ajmp Func3Start:mov a, #0call FuncEntermov a, #1call FuncEntermov a, #2call FuncEntermov a, #3call FuncEnterljmp $end;软件实验六:数据排序Size equ 10 ; 数据个数Array equ 50h ; 数据起始地址Change equ 0 ; 交换标志Sort:mov r0, #Arraymov r7, #Size-1clr ChangeGoon:mov a, @r0mov r2, ainc r0mov B, @r0cjne a, B, NotEqualsjmp NextNotEqual:jc Next ; 前小后大, 不交换setb Change ; 前大后小, 置交换标志xch a, @r0 ; 交换dec r0xch a, @r0inc r0Next:djnz r7, Goonjb Change, Sortljmp $end;硬件实验一:跑马灯count equ 30Horg 0ajmp mainmain:mov sp,#5fhmov a,#7fhloop:mov p0,alcall deln10msrr aajmp loop;*******************************************; (1) (2) (3) (4) (5) (6) (7); t= 1T+( 1T+(1T+ 1T+ 2T )*25 + 2T)*100 + 2T =10303T=10303US=10.03MS ;;*******************************************delay10ms:mov r7,#100 ;1T (1)del0: mov r6,#25 ;1T (2)del1:nop ;1T (3)nop ;1T (4)djnz r6,del1 ;2T (5)djnz r7,del0 ;2T (6)ret ;2T (7);入口参数:COUNT,t=count*10msdeln10ms:deln: lcall delay10msdjnz count,delnretend跑马灯(左右)count equ 30Hsel0 equ p3.5org 0ajmp mainmain:mov sp,#5fhsetb sel0clr sel0mov a,#0fehright:rr amov p0,amov count,#10lcall deln10msjb acc.0,rightleft:rl amov p0,alcall deln10msjb acc.7,leftajmp right;*******************************************; (1) (2) (3) (4) (5) (6) (7); t= 1T+( 1T+(1T+ 1T+ 2T )*25 + 2T)*100 + 2T =10303T=10303US=10.03MS ;;*******************************************delay10ms:mov r7,#100 ;1T (1)del0: mov r6,#25 ;1T (2)del1:nop ;1T (3)nop ;1T (4)djnz r6,del1 ;2T (5)djnz r7,del0 ;2T (6)ret ;2T (7);入口参数:COUNT,t=count*10msdeln10ms:deln: lcall delay10msdjnz count,delnretend;硬件实验二:4位LED数码管动态显示SEL0 EQU P3.5SEL1 EQU P3.7DISP1 EQU 30HDISP2 EQU 31HDISP3 EQU 32HDISP4 EQU 33HCOUNT EQU 34HSCAN EQU 20HSCAN1 EQU 20H.0SCAN2 EQU 20H.1SCAN3 EQU 20H.2SCAN4 EQU 20H.3ORG 0000HLJMP MAINORG 001BHAJMP DISPLAYMAIN:MOV TMOD,#00010000BMOV TH1,#0ECHMOV TL1,#78HSETB ET1SETB PT1SETB EASETB TR1MOV COUNT,#0CLR SEL0CLR SEL1MOV DISP1,#2MOV DISP2,#0MOV DISP3,#0MOV DISP4,#6 WAIT: AJMP WAITDISOUT1: MOV DPTR,#TABMOVC A,@A+DPTRMOV P0,ASETB SEL1NOPCLR SEL1RETDISOUT0:MOV A,SCANMOV P0,ASETB SEL0NOPCLR SEL0RET DISPLAY:MOV TH1,#0ECHMOV TL1,#78HPUSH ACCPUSH PSWINC COUNTMOV A,COUNTCJNE A,#1,NO_DIS1CLR SCAN1SETB SCAN2SETB SCAN3SETB SCAN4LCALL DISOUT0MOV A,DISP1LCALL DISOUT1AJMP T1_ENDNO_DIS1:CJNE A,#2,NO_DIS2SETB SCAN1CLR SCAN2SETB SCAN3SETB SCAN4LCALL DISOUT0MOV A,DISP2LCALL DISOUT1AJMP T1_ENDNO_DIS2:CJNE A,#3,NO_DIS3SETB SCAN2CLR SCAN3SETB SCAN2SETB SCAN4LCALL DISOUT0MOV A,DISP3LCALL DISOUT1AJMP T1_ENDNO_DIS3:MOV COUNT,#0SETB SCAN1SETB SCAN2SETB SCAN3CLR SCAN4LCALL DISOUT0MOV A,DISP4LCALL DISOUT1T1_END: POP PSWPOP ACCRETITAB:DB 0C0H,0F9H,0A4H,0B0H,99H DB 92H,82H,0F8H,80H,90HEND;硬件实验三:静态按键、显示实验SEL0 EQU P3.5SEL1 EQU P3.7DISP1 EQU 30HDISP2 EQU 31HDISP3 EQU 32HDISP4 EQU 33HCOUNT EQU 34HSCAN EQU 20HSCAN1 EQU 20H.0SCAN2 EQU 20H.1SCAN3 EQU 20H.2SCAN4 EQU 20H.3SCAN5 EQU 20H.4SCAN6 EQU 20H.5SCAN7 EQU 20H.6ORG 0000HLJMP MAINORG 001BHAJMP DISPLAYMAIN:MOV TMOD,#00010000B MOV TH1,#0ECHMOV TL1,#78HSETB ET1SETB PT1SETB EASETB TR1MOV COUNT,#0CLR SEL0CLR SEL1MOV DISP1,#2MOV DISP2,#0MOV DISP3,#0MOV DISP4,#6WAIT:LCALL KEY_SCANJZ PRO_ENDCJNE A,#1,NO_1MOV DISP1,#1MOV DISP2,#1MOV DISP3,#1MOV DISP4,#1AJMP PRO_ENDNO_1:CJNE A,#2,NO_2MOV DISP1,#2MOV DISP2,#2MOV DISP3,#2MOV DISP4,#2AJMP PRO_ENDNO_2:CJNE A,#3,NO_3MOV DISP1,#3MOV DISP2,#1MOV DISP3,#1MOV DISP4,#1AJMP PRO_ENDNO_3:CJNE A,#4,NO_4MOV DISP2,#1MOV DISP3,#1MOV DISP4,#1AJMP PRO_ENDNO_4:PRO_END:AJMP WAITDISOUT1: MOV DPTR,#TABMOVC A,@A+DPTRMOV P0,ASETB SEL1NOPCLR SEL1RETDISOUT0:MOV A,SCANMOV P0,ASETB SEL0NOPCLR SEL0RETKEY_SCAN:CLR SCAN5SETB SCAN6SETB SCAN7; CLR SCAN6; CLR SCAN7LCALL DISOUT0MOV A,P2ANL A,#00001111BCJNE A,#0FH,MAY_KEYAJMP NO_KEYMAY_KEY:LCALL DELAY10msMOV A,P2ANL A,#0FHCJNE A,#0FH,YES_KEYAJMP NO_KEYYES_KEY:CJNE A,#0EH,NO_KEY1MOV A,#1AJMP KEY_ENDNO_KEY1:CJNE A,#0DH,NO_KEY2MOV A,#2AJMP KEY_ENDNO_KEY2:CJNE A,#0BH,NO_KEY3MOV A,#3NO_KEY3:MOV A,#4AJMP KEY_END NO_KEY:MOV A,#0AJMP KEY_END KEY_END:RETDELAY10ms:MOV R6,#250DEL:MOV R7,#10DJNZ R7,$DJNZ R6,DELRET DISPLAY:MOV TH1,#0ECHMOV TL1,#78HPUSH ACCPUSH PSWINC COUNTMOV A,COUNTCJNE A,#1,NO_DIS1CLR SCAN1SETB SCAN2SETB SCAN3SETB SCAN4LCALL DISOUT0MOV A,DISP1LCALL DISOUT1AJMP T1_ENDNO_DIS1:CJNE A,#2,NO_DIS2SETB SCAN1CLR SCAN2SETB SCAN3SETB SCAN4LCALL DISOUT0MOV A,DISP2LCALL DISOUT1AJMP T1_ENDNO_DIS2:CJNE A,#3,NO_DIS3SETB SCAN2CLR SCAN3SETB SCAN2SETB SCAN4LCALL DISOUT0MOV A,DISP3LCALL DISOUT1AJMP T1_ENDNO_DIS3:MOV COUNT,#0SETB SCAN1SETB SCAN2SETB SCAN3CLR SCAN4LCALL DISOUT0MOV A,DISP4LCALL DISOUT1T1_END: POP PSWPOP ACCRETITAB:DB 0C0H,0F9H,0A4H,0B0H,99H DB 92H,82H,0F8H,80H,90HEND;扫描更多的按键SEL0 EQU P3.5SEL1 EQU P3.7DISP1 EQU 30HDISP2 EQU 31HDISP3 EQU 32HDISP4 EQU 33HCOUNT EQU 34HSCAN EQU 20HSCAN1 EQU 20H.0SCAN2 EQU 20H.1SCAN3 EQU 20H.2SCAN4 EQU 20H.3SCAN5 EQU 20H.4SCAN6 EQU 20H.5SCAN7 EQU 20H.6ORG 0000HLJMP MAINORG 001BHAJMP DISPLAYMAIN:MOV TMOD,#00010000BMOV TH1,#0ECHMOV TL1,#78HSETB ET1SETB PT1SETB EASETB TR1MOV COUNT,#0CLR SEL0CLR SEL1MOV DISP2,#0MOV DISP3,#0MOV DISP4,#6 WAIT:LCALL KEY_SCANJZ WAITCJNE A,#1,NO_1MOV DISP1,#1MOV DISP2,#1MOV DISP3,#1MOV DISP4,#1AJMP PRO_END NO_1:CJNE A,#2,NO_2MOV DISP1,#2MOV DISP2,#2MOV DISP3,#2MOV DISP4,#2AJMP PRO_END NO_2:CJNE A,#3,NO_3MOV DISP1,#3MOV DISP2,#1MOV DISP3,#1MOV DISP4,#1AJMP PRO_END NO_3:CJNE A,#4,NO_4MOV DISP1,#4MOV DISP2,#1MOV DISP3,#1MOV DISP4,#1AJMP PRO_END NO_4:CJNE A,#5,NO_5MOV DISP1,#5MOV DISP2,#1MOV DISP3,#1MOV DISP4,#1AJMP PRO_END NO_5:CJNE A,#6,NO_6MOV DISP1,#6MOV DISP3,#1MOV DISP4,#3AJMP PRO_END NO_6:CJNE A,#7,NO_7MOV DISP1,#7MOV DISP2,#1MOV DISP3,#1MOV DISP4,#1AJMP PRO_END NO_7:CJNE A,#8,NO_8MOV DISP1,#8MOV DISP2,#1MOV DISP3,#1MOV DISP4,#1AJMP PRO_END NO_8:CJNE A,#9,NO_9MOV DISP1,#9MOV DISP2,#1MOV DISP3,#1MOV DISP4,#1AJMP PRO_END NO_9:CJNE A,#10,NO_10MOV DISP1,#10MOV DISP2,#2MOV DISP3,#2MOV DISP4,#2AJMP PRO_END NO_10:CJNE A,#11,NO_11MOV DISP1,#11MOV DISP2,#1MOV DISP3,#1MOV DISP4,#1AJMP PRO_END NO_11:MOV DISP1,#12MOV DISP2,#1MOV DISP3,#1MOV DISP4,#1PRO_END:LJMP WAITDISOUT1: MOV DPTR,#TABMOVC A,@A+DPTRMOV P0,ASETB SEL1NOPCLR SEL1RETDISOUT0:MOV A,SCANMOV P0,ASETB SEL0NOPCLR SEL0RETKEY_SCAN:CLR SCAN5CLR SCAN6CLR SCAN7LCALL DISOUT0MOV A,P2ANL A,#00001111BCJNE A,#0FH,MAY_KEYAJMP NO_KEYMAY_KEY:LCALL DELAY10msMOV A,P2ANL A,#0FHCJNE A,#0FH,YES_KEYAJMP NO_KEYYES_KEY: CLR SCAN5SETB SCAN6SETB SCAN7LCALL DISOUT0MOV A,P2ANL A,#0FHCJNE A,#0FH,LINE1AJMP LINE2LINE1:CJNE A,#0EH,NO_KEY1MOV A,#1AJMP KEY_ENDNO_KEY1:CJNE A,#0DH,NO_KEY2MOV A,#2AJMP KEY_ENDNO_KEY2:CJNE A,#0BH,NO_KEY3MOV A,#3AJMP KEY_ENDNO_KEY3:MOV A,#4AJMP KEY_ENDLINE2: SETB SCAN5CLR SCAN6SETB SCAN7LCALL DISOUT0MOV A,P2ANL A,#0FHCJNE A,#0FH,LINE20AJMP LINE3LINE20:CJNE A,#0EH,NO_KEY5MOV A,#5AJMP KEY_ENDNO_KEY5:CJNE A,#0DH,NO_KEY6MOV A,#6AJMP KEY_ENDNO_KEY6:CJNE A,#0BH,NO_KEY7MOV A,#7AJMP KEY_ENDNO_KEY7:MOV A,#8AJMP KEY_ENDLINE3:SETB SCAN5SETB SCAN6CLR SCAN7LCALL DISOUT0MOV A,P2ANL A,#0FHCJNE A,#0EH,NO_KEY9MOV A,#9AJMP KEY_ENDNO_KEY9:CJNE A,#0DH,NO_KEY10MOV A,#10AJMP KEY_ENDNO_KEY10:CJNE A,#0BH,NO_KEY11MOV A,#11AJMP KEY_ENDNO_KEY11:MOV A,#12AJMP KEY_ENDNO_KEY:MOV A,#0AJMP KEY_END KEY_END:RETDELAY10ms:MOV R6,#250DEL:MOV R7,#10DJNZ R7,$DJNZ R6,DELRET DISPLAY:MOV TH1,#0ECHMOV TL1,#78HPUSH ACCPUSH PSWINC COUNTMOV A,COUNTCJNE A,#1,NO_DIS1CLR SCAN1SETB SCAN2SETB SCAN3SETB SCAN4LCALL DISOUT0MOV A,DISP1LCALL DISOUT1AJMP T1_ENDNO_DIS1:CJNE A,#2,NO_DIS2SETB SCAN1CLR SCAN2SETB SCAN3SETB SCAN4LCALL DISOUT0MOV A,DISP2LCALL DISOUT1AJMP T1_ENDNO_DIS2:CJNE A,#3,NO_DIS3SETB SCAN2CLR SCAN3SETB SCAN2SETB SCAN4LCALL DISOUT0MOV A,DISP3LCALL DISOUT1AJMP T1_ENDNO_DIS3:MOV COUNT,#0SETB SCAN1SETB SCAN2SETB SCAN3CLR SCAN4LCALL DISOUT0MOV A,DISP4LCALL DISOUT1T1_END: POP PSWPOP ACCRETITAB:DB 0C0H,0F9H,0A4H,0B0H,99HDB 92H,82H,0F8H,80H,90H,88H,83H,0C6H END;硬件实验四:;硬件实验五:串行A/D转换器TLC1549实验串行A/D转换器TLC1549实验(扩展)SEL0 EQU P3.5SEL1 EQU P3.7DOUT EQU P1.1CIO EQU P1.0CS EQU P1.2DISP1 EQU 30HDISP2 EQU 31HDISP3 EQU 32HDISP4 EQU 33HCOUNT EQU 34HTEMP EQU 35HSCAN EQU 20HSCAN1 EQU 20H.0SCAN2 EQU 20H.1SCAN3 EQU 20H.2SCAN4 EQU 20H.3SCL EQU P1.5SDA EQU P1.6ORG 0000HLJMP MAINORG 001BHAJMP DISPLAYMAIN:MOV TMOD,#00010000BMOV TH1,#0ECHMOV TL1,#78HSETB ET1SETB PT1SETB EASETB TR1MOV COUNT,#0CLR SEL0CLR SEL1MOV DISP1,#2MOV DISP2,#0MOV DISP3,#0MOV DISP4,#6 WAIT:MOV R0,#00HMOV R1,#00HLCALL WR_DATALCALL RD_DATAMOV R0,#01HMOV R1,#01HLCALL WR_DATALCALL RD_DATALCALL TRANSMOV B,#10DIV ABMOV DISP3,AMOV DISP4,BMOV DISP2,#10MOV DISP1,#10AJMP WAIT DISOUT1:MOV DPTR,#TABMOVC A,@A+DPTRMOV P0,ASETB SEL1NOPCLR SEL1RETDISOUT0:MOV A,SCANMOV P0,ASETB SEL0NOPCLR SEL0RET DISPLAY:MOV TH1,#0ECHMOV TL1,#78HPUSH ACCPUSH PSWINC COUNTMOV A,COUNTCJNE A,#1,NO_DIS1CLR SCAN1SETB SCAN2SETB SCAN3SETB SCAN4LCALL DISOUT0MOV A,DISP1LCALL DISOUT1AJMP T1_ENDNO_DIS1:CJNE A,#2,NO_DIS2SETB SCAN1CLR SCAN2SETB SCAN3SETB SCAN4LCALL DISOUT0MOV A,DISP2LCALL DISOUT1AJMP T1_END NO_DIS2:CJNE A,#3,NO_DIS3SETB SCAN1CLR SCAN3SETB SCAN2SETB SCAN4LCALL DISOUT0MOV A,DISP3LCALL DISOUT1AJMP T1_ENDNO_DIS3:MOV COUNT,#0SETB SCAN1SETB SCAN2SETB SCAN3CLR SCAN4LCALL DISOUT0MOV A,DISP4LCALL DISOUT1T1_END:POP PSWPOP ACCRETITRANS:LCALL ADCAMOV B,AMOV TEMP,#0MOV A,#0 LOOP0:MOV DPTR,#TAB1MOVC A,@A+DPTRSUBB A,BJNC GET_TEMPINC TEMPMOV A,TEMPAJMP LOOP0 GET_TEMP:MOV A,TEMPRETADCA:MOV R3,#0FHSETB CSNOPCLR CSCLR CIONOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPLCALL READASETB CSNOPRETREADA:MOV R4,#08H REDA1:MOV C,DOUTRLC ANOPNOPSETB CIONOPNOPNOPNOPNOPNOPNOPNOPCLR CIONOPNOPNOPNOPNOPNOPNOPDJNZ R4,REDA1NOPNOPNOPNOPSETB CSRETWR_DATA:LCALL BSTARTMOV A,#0A0HLCALL WBYTEMOV A,R0LCALL WBYTEMOV A,R1LCALL WBYTELCALL BSTOPRETRD_DATA:LCALL BSTARTMOV A,#0A0HLCALL WBYTEMOV A,R0LCALL WBYTELCALL DELAYLCALL BSTARTMOV A,#0A1HLCALL WBYTELCALL BSTOPRETDELAY:NOPNOPRET BSTART:CLR SCLLCALL DELAYLCALL DELAYSETB SCLLCALL DELAYCLR SDALCALL DELAYCLR SCLRET BSTOP:CLR SCLLCALL DELAYCLR SDALCALL DELAYSETB SCLLCALL DELAYSETB SDALCALL DELAYCLR SCLLCALL DELAYRET WBYTE:MOV R3,#8 WBY0:CLR SCLRLC AMOV SDA,CSETB SCLDJNZ R3,WBY0CLR SCLLCALL DELAYSETB SCLLCALL DELAYCLR SCLLCALL DELAYRET RBYTE:LCALL DELAYMOV R3,#8 RBY0:CLR SCLLCALL DELAYSETB SCLLCALL DELAYMOV C,SDADJNZ R3,RBY0CLR SCLLCALL DELAYSETB SDALCALL DELAYSETB SCLLCALL DELAYRETTAB1:DB 32,34,35,36,38,39,41,43,44,46DB 48,49,51,53,55,57,59,61,63,65DB 67,69,71,73,75,77,80,82,84,86DB 87TAB: DB 0C0H,0F9H,0A4H,0B0H,99HDB 92H,82H,0F8H,80H,90H,0FFHEND;硬件实验六:************************************;THIS IS THE PROGRAMMER OF __________;***********************************CS25 REG P1.6 ;复位电路X25045控制管脚SO25 REG P1.5SCK25 REG P1.4SI25 REG P1.3CLK164 REG P0.7 ;并串电路控制管脚,用于显示DIN164 REG P0.6ADCS REG P1.2 ;A/D转换电路TLC1549CP控制管脚ADDO REG P1.1ADCLK REG P1.0DE485 REG P1.7 ;75LBC184发送接收控制管脚RELAY1 REG P3.7 ;继电器输出控制(高电平有效)RELAY2 REG P3.6RELAY3 REG P2.7SOUND REG P2.6DISCOU EQU 30H ;显示定位SPEED1 EQU 31H ;速度控制管脚SPEED2 EQU 32HSPEED3 EQU 33HTEMP1 EQU 34H ;温度控制管脚TEMP2 EQU 35HTEMP3 EQU 36HCOUNT EQU 37HDATEADH EQU 38H ;串行EEPROMX25045地址,数据设定DATEADL EQU 39HDATE EQU 3AHADDRES EQU 3BHCOMMAND EQU 23H ;变频器控制命令设定TIMEH EQU 3DHTIMEL EQU 3EHTEMP EQU 3FH ;温度数据缓存对应EEPROM地址00H TEMPH EQU 40H ;过热温度数据缓存对应EEPROM地址01H TEMPL EQU 41H ;停止温度数据缓存对应EEPROM地址02H DSPEEDH EQU 42H ;速度高位数据缓存对应EEPROM地址03H DSPEEDL EQU 43H ;速度低位数据缓存对应EEPROM地址04H TIME01 EQU 44H ;延时0.1SDHEXH EQU 45H ;俩位十六进制数高位DHEXL EQU 46H ;俩位十六进制数低位TEN3 EQU 47H ;压缩BCD码第三位TEN2 EQU 48H ;压缩BCD码第二位TEN1 EQU 49H ;压缩BCD码第一位BCUSUH EQU 4AH ;被除数高位BCUSUL EQU 4BH ;被除数低位(商)CUSU EQU 4CH ;除数XHTIME EQU 4DHBEI EQU 4EHSE EQU 4FHGE EQU 50HLENGTH EQU 51HLEDFLASH EQU 52HLEDCOUNT EQU 56HFLASHBZ EQU 57HWARMBZ EQU 58HRUNBZ EQU 59HERRORBZ EQU 5AHHOTBZ EQU 5BHS3 EQU 5CHS2 EQU 5DHS1 EQU 5EHLEDBZ EQU 5FHSDIS1 EQU 53HSDIS2 EQU 54HSDIS3 EQU 55HK1 EQU 0FHK2 EQU 0EHK3 EQU 0DHASKBZ EQU 3CHE1BZ EQU 1BHE2BZ EQU 1CHECOU EQU 0CHWARMSIN EQU 0BHSOUNDBZ EQU 0AH;==================================================== ORG 0000HLJMP MAININITORG 000BHLJMP T0ORG 0023HLJMP SIS;***********************************;====================; TIME DELAY 5MS ;延时5毫秒;---------------------DL5MS:; CPL CS25MOV TIMEH,#50DL1: MOV TIMEL,#25DL: NOPCPL CS25DJNZ TIMEL,DLDJNZ TIMEH,DL1RET;====================== ;延时0.1秒DL0.1S:CPL CS25MOV TIME01,#20DEL:LCALL DL5MSDJNZ TIME01,DELRET;=======================SD_A_BYTE: ;发送8位数据MOV LENGTH,#08H; SETB SCK25SD0:RLC AMOV SI25,CCLR SCK25NOPSETB SCK25NOPDJNZ LENGTH,SD0RETRD_A_BYTE: ;接收8位数据MOV LENGTH,#08H; CLR SCK25NOPRD0:SETB SCK25NOPCLR SCK25NOPMOV C,SO25RLC ADJNZ LENGTH,RD0RET;WATCHDOG:;; CLR CS25; SETB CS25; RETREADSTATE:SETB CS25MOV A,#05H ;读寄存器CLR SCK25NOPCLR CS25 ;判断EEPROM是否空闲LCALL SD_A_BYTELCALL RD_A_BYTESETB CS25RETWRITEBYTE: ;写一个数据进X25045,入口ADDRES AND DATE LCALL READSTATEJB ACC.0,WRITEBYTECLR CS25MOV A,#06HLCALL SD_A_BYTESETB CS25CLR SCK25CLR CS25MOV A,#02HLCALL SD_A_BYTEMOV A,ADDRESLCALL SD_A_BYTEMOV A,DATELCALL SD_A_BYTESETB CS25LCALL DL5MSLCALL DL5MS; LCALL DL5MSWAITWRITE:LCALL READSTATEJB ACC.0,WAITWRITERETREADBYTE: ;读出一个数据从X25045 INPUT=ADDRES OUTPUT=DATELCALL READSTATEJB ACC.0,READBYTECLR CS25CLR SCK25MOV A,#03HLCALL SD_A_BYTEMOV A,ADDRESLCALL SD_A_BYTELCALL RD_A_BYTEMOV DATE,ACLR SCK25SETB CS25RET;************************************MAININIT: ;初始化MOV SP,#5FH ;开辟堆栈(60H--7FH)SETB F0MOV P0,#0FFH ;CLOSE DISPLAY 关闭显示MOV P3,#11111111B ;CLOSE RELAY1 AND RELAY2关闭继电器MOV P2,#10111111B ;CLOSE RELAY3 AND RELAY4MOV P1,#0FFHMOV TMOD,#21H ;定时器1采用方式二,定时器0采用方式一MOV TH0,#0F8HMOV TL0,#30H ;定时器0定时2MSMOV TH1,#0FAH ;定时器1波特率采用BAUD=1200B/SMOV TL1,#0FAHMOV SCON,#0D0H ;SM0 SM1 SM2 REN TB8 RB8 TI RI=11010000BMOV PCON,#0 ;SMOD=0CLR DE485SETB P3.0SETB P3.1SETB ET0 ;INIT X25045,RST TIME IS 1.4SSETB PT0SETB EASETB TR1CLR SCK25NOPSETB CS25NOPSETB SO25NOPCLR SI25NOPSETB CS25NOPCLR CS25MOV A,#06HLCALL SD_A_BYTECLR SCK25SETB CS25NOPCLR CS25MOV A,#01HLCALL SD_A_BYTENOPMOV A,#00H ;RESET TIME IS 1.4SLCALL SD_A_BYTECLR SCK25NOPSETB CS25CLR CS25READ: LCALL READSTATEJNB ACC.0,READ0AJMP READREAD0: JNB ACC.4,READ1AJMP READREAD1: JNB ACC.5,READ2AJMP READREAD2: JNB ACC.3,READ3AJMP READREAD3: JNB ACC.2,MAINAJMP READ;===============================MAIN:MOV LEDCOUNT,#100 ;100*2MS=0.2S=5HZ LED FLASHMOV FLASHBZ,#0 ;**BZ="0" INDICATE LED IS OFFMOV WARMBZ,#0MOV HOTBZ,#0MOV ERRORBZ,#0MOV RUNBZ,#0MOV LEDBZ,#0MOV DISCOU,#0MOV ECOU,#0MOV E1BZ,#0MOV E2BZ,#0MOV ASKBZ,#0MOV R7,#200 ;延时200*15MS=3000MS=3SMOV WARMSIN,#0MOV SOUNDBZ,#0SHEZHI:CPL CS25 ;复位看门狗LCALL DL5MS ;判断“+-”键有无同时被按下LCALL DL5MSLCALL DL5MSSETB P2.5SETB P2.4SETB P2.3CLR P2.1JNB P2.4,SHEZHI1LJMP STARTSHEZHI1:JNB P2.5,NIANLJMP STARTNIAN: DJNZ R7,SHEZHIMOV HOTBZ,#0FFHLCALL SHEZHIDIS ;调用上次过热和加热停止温度显示;SETB TR0 ;OPEN DISPLAYSONY:CPL CS25SETB P2.3SETB P2.4SETB P2.5CLR P2.1JNB P2.4,SONYNOPJB P2.5,KEYLJMP SONY;============================================================================ ; 键判定;***********************************************KEY:CPL CS25CLR P2.0 ;判断有无按键按下CLR P2.1CLR P2.2SETB P2.3SETB P2.4SETB P2.5MOV A,P2ANL A,#00111000BCJNE A,#00111000B,FPD1LJMP KEYFPD1: ACALL DL5MS ;去抖动ACALL DL5MSCLR P2.0CLR P2.1CLR P2.2SETB P2.3SETB P2.4SETB P2.5MOV A,P2ANL A,#00111000BCJNE A,#00111000B,FPD2LJMP KEYFPD2: MOV R3,#00H ;有键按下,键处理MOV R4,#00HSETB P2.0SETB P2.1CLR P2.2SETB P2.3SETB P2.4SETB P2.5JB P2.3,P24MOV R3,#01HSJMP FENCODEP24: JB P2.4,P25MOV R3,#02HSJMP FENCODEP25: JB P2.5,NOPRE1MOV R3,#03HSJMP FENCODENOPRE1:INC R4INC R4INC R4SETB P2.0CLR P2.1SETB P2.2SETB P2.3SETB P2.4SETB P2.5JB P2.3,P241MOV R3,#01HSJMP FENCODEP241: JB P2.4,P251MOV R3,#02HSJMP FENCODEP251: JB P2.5,NOPRE2MOV R3,#03HSJMP FENCODENOPRE2:INC R4INC R4INC R4SETB P2.3SETB P2.4SETB P2.5CLR P2.0SETB P2.1SETB P2.2JB P2.3,NOPRE3MOV R3,#01HSJMP FENCODENOPRE3:MOV R4,#00H ;无效键MOV R3,#0FENCODE: ;键处理MOV A,R4ADD A,R3JZ KEY0CJNE A,#3,SPEEDUP ;按下了STOP键吗?MOV HOTBZ,#0LJMP START ;是的,转向START正常处理程序KEY0: LJMP KEYSPEEDUP: ;按下了SPEEDUP键吗?CJNE A,#2,SPEEDDOWNMOV ADDRES,#02HLCALL READBYTEMOV TEMPL,DATEMOV A,TEMPL ;是的CJNE A,#0FFH,GOD1 ;已经达到最大值了吗?LJMP NOADDGOD1: MOV SOUNDBZ,#100 ;;;INC TEMPL ;没有,加一MOV ADDRES,#02H ;保存加热停止温度MOV DATE,TEMPLLCALL WRITEBYTELCALL SHEZHIDISLCALL DL0.1S ;延时NOADD: LJMP KEYSPEEDDOWN: ;按下了SPEEDDOWN键吗?CJNE A,#01H,TEMPUPMOV ADDRES,#2LCALL READBYTEMOV TEMPL,DATEMOV A,TEMPL ;是的CJNE A,#0H,GOD2 ;已经达到最小值了吗?LJMP NODELGOD2: MOV SOUNDBZ,#100DEC TEMPL ;没有,减一MOV ADDRES,#02H ;保存加热停止温度MOV DATE,TEMPLLCALL WRITEBYTELCALL SHEZHIDISLCALL DL0.1SNODEL: LJMP KEYTEMPUP:CJNE A,#05H,TEMPDOWN ;按下了TEMPUP键吗?MOV ADDRES,#01HLCALL READBYTEMOV TEMPH,DATEMOV A,TEMPH ;是的CJNE A,#0FFH,GOD3 ;已经达到最大值了吗?LJMP NOADD1GOD3: MOV SOUNDBZ,#100INC TEMPH ;没有,加一MOV ADDRES,#01H ;保存过热温度MOV DATE,TEMPHLCALL WRITEBYTELCALL SHEZHIDISLCALL DL0.1SNOADD1:LJMP KEYTEMPDOWN:CJNE A,#06H,NOOPERATION ;按下了TEMPDOWN键吗?MOV ADDRES,#01HLCALL READBYTEMOV TEMPH,DATEMOV A,TEMPH ;是的CJNE A,#0H,GOD4 ;已经达到最小值了吗?LJMP NODEL1GOD4: MOV SOUNDBZ,#100DEC TEMPH ;没有,减一MOV ADDRES,#01H ;保存过热温度MOV DATE,TEMPHLCALL WRITEBYTELCALL SHEZHIDISLCALL DL0.1SNODEL1:LJMP KEYNOOPERATION: ;继续判定LJMP KEY;===============================START: SETB TR0LCALL STOPKEY ;OPEN DISPLMOV ADDRES,#1LCALL READBYTEMOV TEMPH,DATEMOV ADDRES,#2LCALL READBYTEMOV TEMPL,DATEMOV ADDRES,#0 ;取上次温度设定数据LCALL READBYTEMOV TEMP,DATEMOV ADDRES,#3 ;取上次速度设定数据LCALL READBYTEMOV DSPEEDH,DATEMOV ADDRES,#04HLCALL READBYTEMOV DSPEEDL,DATE; MOV A,TEMP ;将温度数据转换成十进制数; LCALL BCD; MOV TEMP3,BEI; MOV TEMP2,SE; MOV TEMP1,GEMOV DHEXH,DSPEEDHMOV DHEXL,DSPEEDLCJNE A,#0,NEXTLJMP RIGHTNEXT: CJNE A,#1,WRONGLJMP RIGHTWRONG: MOV DSPEEDH,#0MOV DHEXH,#0MOV ADDRES,#3MOV DATE,#0LCALL WRITEBYTERIGHT:LCALL SUBBCD ;将速度数据转换成十进制数MOV SDIS1,S1MOV SDIS2,S2MOV SDIS3,S3;============================WAIT: CPL CS25MOV SPEED1,#0MOV SPEED2,#0MOV SPEED3,#0LCALL ADSUBMOV DHEXH,DATEADHMOV DHEXL,DATEADLLCALL SUBBCDMOV TEMP1,S1MOV TEMP2,S2MOV TEMP3,S3LCALL KEYSCANMOV A,R4JZ WAITCJNE A,#07,YU1AJMP YUYU1: LJMP NORUNYU:MOV SPEED1,SDIS1MOV SPEED2,SDIS2MOV SPEED3,SDIS3MOV COMMAND,#31H ;变频器正转LCALL SEND485MOV SOUNDBZ,#100 ;;;;MOV RUNBZ,#0FFH ;点亮起动灯LCALL DL0.1SLCALL DL0.1SMOV K1,SDIS1MOV K3,SDIS3MOV A,SDIS1JZ YOU1DEC SDIS1LJMP YOUYOU1: MOV A,SDIS2JZ YOU2DEC SDIS2MOV SDIS1,#9LJMP YOUYOU2: MOV A,SDIS3JZ YOUDEC SDIS3MOV SDIS2,#9MOV SDIS1,#9 YOU:MOV SPEED1,#0MOV SPEED2,#0MOV SPEED3,#0U1:; MOV FLASHBZ,#0FFH LCALL KEYSCANMOV A,R4JZ U2CJNE A,#4,D1E2: LCALL KEYSCANMOV A,R4CJNE A,#4,E1AJMP E2E1:MOV A,WARMSINJZ D2MOV WARMSIN,#0SETB RELAY1SETB RELAY2SETB RELAY3; SETB RELAY4MOV WARMBZ,#0MOV SOUNDBZ,#100LJMP U2D2: MOV WARMSIN,#0FFH MOV SOUNDBZ,#100CLR RELAY1CLR RELAY3; CLR RELAY4MOV WARMBZ,#0FFHLJMP U2D1: LJMP U3U2: LCALL QUESTIONLCALL DL0.1SLCALL DL0.1SLJMP JUNJUN1:LCALL DL0.1SLCALL DL0.1SLJMP JUN2JUN: CJNE R1,#1BH,JUN1JUN2: MOV A,SDIS3CJNE A,SPEED3,U1MOV A,SDIS2CJNE A,SPEED2,U1MOV A,SDIS1CJNE A,SPEED1,U1MOV SPEED1,K1MOV SPEED2,K2MOV SPEED3,K3MOV A,WARMSINJNZ D4LJMP YESRUND4: LJMP NE1U3: CJNE A,#03H,U1MOV FLASHBZ,#0MOV SOUNDBZ,#100LCALL STOPKEYAJMP STARTGYN: LJMP WAIT;==================================;==================================NORUN:LCALL KEYSCANMOV A,R4 ;起动键未按,只能进行WARMUP WARMDOEN SPUPKEY SPDOWNKEY处理JZ GYNCJNE A,#4,Z1LJMP GYNZ1: CJNE A,#3,Z2Z2: CJNE A,#7,Z3LJMP GYNZ3:MOV ADDRES,#0 ;取上次温度设定数据LCALL READBYTEMOV TEMP,DATEMOV ADDRES,#3 ;取上次速度设定数据LCALL READBYTEMOV DSPEEDH,DATEMOV ADDRES,#04HLCALL READBYTEMOV DSPEEDL,DATEMOV A,TEMP ;将温度数据转换成十进制数LCALL BCDMOV TEMP3,BEIMOV TEMP2,SEMOV TEMP1,GEMOV DHEXL,DSPEEDLMOV DHEXH,DSPEEDHLCALL SUBBCDMOV SPEED3,S3MOV SPEED2,S2MOV SPEED1,S1; LCALL DL0.1S ;起动键未按,只能进行WARMUP WARMDOEN SPUPKEY SPDOWNKEY处理; CPL CS25JX1: MOV A,R4CJNE A,#1,N1 ;按下了SPEEDDOWN键吗?MOV ADDRES,#3LCALL READBYTEMOV DSPEEDH,DATEMOV ADDRES,#4LCALL READBYTEMOV DSPEEDL,DATEMOV A,DSPEEDH ;是的JNZ NO111MOV A,DSPEEDLJZ MINNO1 ;已经达到最小值了吗?DEC DSPEEDLLJMP NO131NO111: MOV SOUNDBZ,#100MOV DSPEEDH,#1MOV A,DSPEEDL ;没有,减一。

单片机试验源程序

单片机试验源程序

单片机实验指导书(实验源程序)实验二、三I/O 接口实验1、输出实验例1:ORG 0000HAJMP START;跳转到初始化程序ORG 0033H;-----主程序开始-----START: MOV P1,#0FFH;是所有 LED熄灭ACALL DELAY;调用延时子程序CLR;输出低电平 ,使 LED3点亮ACALL DELAY;调用延时子程序SETB;输出高电平 ,使 LED3熄灭CLR;输出低电平 ,使 LED4点亮ACALL DELAY;调用延时子程序SETB;输出高电平 ,使 LED4熄灭CLR;输出低电平 ,使 LED5点亮ACALL DELAY;调用延时子程序SETB;输出高电平 ,使 LED5熄灭CLR;输出低电平 ,使 LED6点亮ACALL DELAY;调用延时子程序MOV P1, #0F0H;LED3~LED6所有发光ACALL DELAY;调用延时子程序AJMP START;返回到标号 START处再循环;-----延时子程序-----DELAY: MOV R5,#10LOOP:MOV R6,#200LOOP1:MOV R7,#250LOOP2: DJNZ R7,LOOP2DJNZ R6,LOOP1DJNZ R5,LOOPRET例 2:ORG 0000HAJMP START;跳转到初始化程序ORG 0033H;-----主程序开始-----START: MOV P1,#0FFH;是所有 LED熄灭ACALL DELAY;调用延时子程序MOV ACC,#0FEH;ACC中先装入 LED3亮的数据(二进制的)MOV P1,ACC;将 ACC的数据送 P1 口ACALL DELAY;调用延时子程序MOV R0,#03H;上句送到 P1 口的数据就点亮了LED1,因此将数据再移动 3 次就达成一个 4 位流水过程LOOP3: RL A; 将 ACC中的数据左移一位MOV P1,A;把 ACC挪动过的数据送p1 口显示ACALL DELAY;调用延时子程序DJNZ R0,LOOP3;没有挪动够 4 次持续挪动MOV P1, #0F0H;LED3~LED6所有发光ACALL DELAY;调用延时子程序AJMP START;返回到标号START处再循环;----- 延时子程序-----DELAY: MOV R5,#10LOOP:MOV R6,#200LOOP1:MOV R7,#250LOOP2: DJNZ R7,LOOP2DJNZ R6,LOOP1DJNZ R5,LOOPRET2、输入实验例1:;****;*K1 控制 LED3亮灭交替*;****org 0star: mov p1,#0hmov p3,#0ffhst1: jb ,$jnb ,$cplsjmp st1end例2:;;* 按压实验板上的按钮K1,控制的LED亮灭*;* 按压 K1,LED 点亮,再次按压K1, LED熄灭* ;*程序没有进行按键消抖动处理,控制结果会因为按键抖动而出错*;* 按压 K1 十次,大体有 3~5 次输出会由于按键颤动而发生错误* ;*实验时请多按几次,观察一下效果,加深对按键消抖动重要性的认识*;ORG 0000HAJMP START;跳转到初始化程序ORG 0033HSTART: MOV SP,#60H;SP 初始化MOV P3,#0FFH 端;口初始化MAIN:JB ,MAIN;检测按键K1 有没有按下CPL;履行按键命令,改变指示灯状态JNB ,$;等候按键K1 开释AJMP MAIN;返回从头检测按键END例 3:;;* ;*按压实验板上的按钮K1,控制的LED亮灭*按压 K1,LED 点亮,再次按压K1, LED熄灭*;*程序进行了按键消抖动处理,不会出现控制结果出错的现象*;*由此可以看出按键软件消抖动的功效*;ORG0000HAJMP START;跳转到初始化程序ORG0033HSTART:MOV SP,#60H;SP 初始化MOV P3,#0FFH;端口初始化MAIN:JB,MAIN;检测按键有没有按下ACALL YS20ms;消前沿颤动延时 ,实现软件去颤动JB,MAIN;再次检测按键 ,假如为高电平 ,则是颤动CPL;履行按键命令 ,改变指示灯状态JNB,$;等候按键开释AJMP MAIN;返回从头检测按键YS20ms: MOV R7,#40;延时20ms 子程序YS1:MOV R6,#229DJNZ R6,$DJNZ R7,YS1RET实验四多级外面中止控制实验例程:;;* ;*INT0,INT1 为边缘触发方式,INT1 为高级中止主程序中8个LED轮流闪*烁*;*外中断程序0中,8个指示灯同时闪烁8次*;*外中断程序1中,左右4个指示灯交替闪烁*;* ;* ;*由于 INT1 为高级中止,因此 INT1 中止能够中止INT0 中止程序即当按压K1 进入外中止0 时,8 个 LED同时闪耀,此时按压 K2 能够中止TIN0 的履行。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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的单元,因此实验程序不能使用这些单元。

相关文档
最新文档