单片机实验2【完整】代码
- 格式:doc
- 大小:273.00 KB
- 文档页数:10
单片机上机实验报告【实验一】端口实验,掌握通过端口编程实现数据输出和输入的方法,并观察结果。
实验内容:1)输出实验:假定4个端口全部连接发光二极管,编程实现所有发光二极管同时亮,延迟一定时间(自定)后,又同时灭,如此循环。
2)输入:从P0口输入某个数据到累加器A,打开观察窗口观察数据是否进入累加器A。
实现方式:通过peripherals实现端口数据观察实验。
程序流程图:将P0到P3端口先赋值为0,调用延迟后,再赋1,然后循环执行。
源代码:ORG 0000H ;程序入口地址LJMP MAIN ;跳转到主程序ORG 0300H ;主程序地址MAIN:MOV P0,#00H;MOV P1 ,#00H;MOV P2 ,#00H;MOV P3 ,#00H ;P0~P3均赋值为0ACALL DEL;调用延迟MOV P0 ,#0FFH;MOV P1 ,#0FFH;MOV P2 ,#0FFH;MOV P3 ,#0FFH;P0~P3均设为1MOV A,P0;将P0口值赋给累加器ACALL DEL;AJMP MAIN;跳转到主程序入口ORG 0200H;延迟程序入口地址DEL:MOV R5,#04H;寄存器实现延迟,F3:MOV R6,#0FFH;若主频为12MHZ则F2:MOV R7,#0FFH;延时为256*256*4F1:DJNZ R7,F1;0.26S,人眼可分辨DJNZ R6,F2;DJNZ R5,F3;RET;从延迟程序返回END;结束3.假设P0口外接一个数码管(共阴),如图,请在数码管上轮流显示数字0~9(采用软件延时)。
程序流程图:将数码管的真值编码0~9依次赋给P0并调用延迟,然后循环运行程序即可。
源代码:ORG 0000H; 程序入口SJMP MAIN; 跳转到主程序ORG 0300H; 主程序入口地址MAIN:MOV P0,#0FCH; 将数码管0的编码赋给P0口ACALL DELAY; 调用延迟,使数码管亮0持续0.33SMOV P0,#60H; show 1ACALL DELAY;MOV P0,#0DAH; show 2ACALL DELAY;MOV P0,#0F2H; show 3ACALL DELAY;MOV P0,#66H; show 4ACALL DELAY;MOV P0,#0B6H; show 5ACALL DELAY;MOVP0,#0BEH; show 6ACALL DELAY;MOV P0,#0E0H; show 7ACALL DELAY;MOV P0,#0FEH; show 8ACALL DELAY;MOV P0,#0F6H; show 9ACALL DELAY;AJMP LOOP; 跳转到主程序入口ORG 0200H; 延迟程序入口DEL:MOV R5,#05H; 采用软件延迟,若主频为12MHz,则DEL1:MOV R6,#0FFH; 定时时间为256*256*5*1uS=0.33S,DEL2:MOV R7,#0FFH; 人眼可分辨。
第一个实验:闪烁灯$regfile = "m16def.dat" '定义单片机型号$crystal = 8000000 '定义时钟频率8Mhz Config Portc.0 = OutputConfig Portc.1 = OutputDoPortc = 1 'portc=(01)2C0亮,C1不亮Wait 1 '延时1秒Portc = 2 'portc=(10)2C0不亮,C1亮Wait 1 '延时1秒Loop '循环End第二个实验:LED管跑马灯实验$regfile = "m16def.dat" '定义单片机型号$crystal = 8000000 '定义时钟频率8MhzConfig Portc = Output '定义端口portc为输出端口Dim I As Byte '定义计数变量IPortc = 1 ' 0000 0001 PC口最低位置高电平Wait 1DoFor I = 1 To 7Rotate Portc , Left ‘ PC口所有位循环左移一位Wait 1NextFor I = 1 To 7Rotate Portc , Right ‘ PC口所有位循环右移一位Wait 1NextLoopEnd第三个实验:6个数码管扫描实验$regfile = "m16def.dat" '明确工作芯片型号$crystal = 2000000 '定义时钟频率2Mhz Config Porta = Output 'PA口为数码管选通口Config Portc = Output 'PC口为数字显示段码输出口Dim A As Byte , X As Byte , I As ByteA = 0 : X = 0 : I = 0Dim B0 As Byte , B1 As Byte , B2 As Byte , B3 As Byte , B4 As Byte , B5 As ByteB0 = 0 : B1 = 0 : B2 = 0 : B3 = 0 : B4 = 0 : B5 = 0Dim C(16) As ByteRestore Duanma '让READ指针指向Duanma标号后的第一个数据For I = 1 To 10Read C(i) '让数组C(I)内依次存放共阴数码管的数字显示段码Next IDoX = X + 1B5 = B4 : B4 = B3 : B3 = B2 : B2 = B1 : B1 = B0 : B0 = C(x) '对即将在各位数码管显示的数字的设定,控制显示的数字的左移If X > 9 Then X = 0For I = 1 To 55 '数码管动态扫描的循环控制,循环的次数控制每个数字移动时间约为1秒左右Portc = B0 : Porta = &B01111111 : Waitms 3 '依次控制从右到左的6个数码管的显示,Portc送出显示段码,Porta从右到左依次选通各位数码管Portc = B1 : Porta = &B10111111 : Waitms 3Portc = B2 : Porta = &B11011111 : Waitms 3Portc = B3 : Porta = &B11101111 : Waitms 3Portc = B4 : Porta = &B11110111 : Waitms 3Portc = B5 : Porta = &B11111011 : Waitms 3Next ILoopEndDuanma: '定义数码管段码Data &HED , &H81 , &HF4 , &HB5 , &H99 '数字0,1,2,3,4的段码Data &H3D , &H7D , &H85 , &HFD , &HBD '数字5,6,7,8,9的段码第四个程序:8通道AD转换+LCD显示实验'不连4.2伏时,可以短路一下R13,再次观察Channel 0 的采集值,并调节WE1,观察有没有反应。
实验二:带电子表的直流电动机控制器班级:姓名:学号:#include <reg51.h>#define LEDLen 6#define PB1 2 // 164 时钟位#define PB0 1 // 164 数据位xdata unsigned char OUTBIT _at_ 0x8002; // 位控制口xdata unsigned char OUTSEG _at_ 0x8004; // 段控制口xdata unsigned char IN _at_ 0x8001; // 键盘读入口#define mode 0x82xdata unsigned char CTL _at_ 0xA003; //8255并行口xdata unsigned char status _at_ 0xA001;xdata unsigned char CS0832 _at_ 0x9000; //数模转换unsigned int count;#define DC_P 1void Delay(unsigned char CNT){unsigned char i;while (CNT-- !=0)for (i=100; i !=0; i--);}code unsigned char KeyTable[] = { // 键码定义0x16, 0x15, 0x14, 0xff,0x13, 0x12, 0x11, 0x10,0x0d, 0x0c, 0x0b, 0x0a,0x0e, 0x03, 0x06, 0x09,0x0f, 0x02, 0x05, 0x08,0x00, 0x01, 0x04, 0x07};unsigned char TestKey(){OUTBIT = 0; // 输出线置为0return (~IN & 0x0f); // 读入键状态(高四位不用) }unsigned char InKey(){unsigned char Pos;unsigned char i;unsigned char k;i = 6;Pos = 0x20; // 找出键所在列do {OUTBIT = ~ Pos;Pos >>= 1;k = ~IN & 0x0f;} while ((--i != 0) && (k == 0)); // 键值= 列x 4 + 行if (k != 0){i *= 4;if (k & 2)i += 1;else if (k & 4)i += 2;else if (k & 8)i += 3;OUTBIT = 0;do Delay(20); while (TestKey()); // 等键释放return(KeyTable[i]); // 取出键码}else return(0xff);}unsigned char LEDBuf[LEDLen]; // 显示缓冲unsigned char shu[11]={0}; // 显示缓冲code unsigned char LEDMAP[] = { // 八段管显示码0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};void DisplayLED(){unsigned char i;unsigned char Pos;unsigned char LED;Pos = 0x20; // 从左边开始显示for (i = 0; i < LEDLen; i++) {OUTBIT = 0; // 关所有八段管LED = LEDBuf[i];OUTSEG = LED;OUTBIT = Pos; // 显示一位八段管Delay(1);Pos >>= 1; // 显示下一位}}#define Tick 10000 // 10000 x 100us = 1s#define T100us (256-50) // 100us时间常数(6M)记忆周期2us,所以2X50=100usunsigned char Hour, Minute, Second;unsigned int C100us; // 100us记数单元void T0Int() interrupt 1{C100us--;if (C100us == 0) {C100us = Tick; // 100us 记数器为0, 重置记数器Second++;if (Second == 60) {Second = 0;Minute++;if (Minute == 60) {Minute = 0;Hour++;if (Hour == 24) Hour = 0;}}}}//电机程序--------------------------------------------------------unsigned int read(){TMOD = 0x12; // 16位计时TR1 = 0;TH1 = 0;TL1 = 0;while(!(status & DC_P)); // 等待低电平完while(status & DC_P); // 等待高电平完TR1 = 1;while(!(status & DC_P)); // 等待低电平完while(status & DC_P); // 等待高电平完TR1 = 0;return (TH1*0x100+TL1);}//电机开关程序unsigned int dianjikai(){CTL = mode;CS0832 = 0xf0; // 产生电压控制电机// Delay(500); // 等待电机运转稳定count = read(); // 读取电压值}unsigned int dianjiting( ){CTL = mode;CS0832 = 128; // 产生电压使电机停止运转//Delay(500); // 等待电机运转稳定//count = read(); // 读取电压值}//主程序-------------------------------------------------------------void main(){ unsigned char i=0;TMOD = 0x02; // 方式2, 定时器TH0 = T100us;TL0 = T100us;IE = 0x82; // EA=1, IT0 = 1 中断允许控制寄存器IE Hour = 0;Minute = 0;Second = 0;C100us = Tick;TR0 = 1; // 启动定时器0CS0832 = 128; // 电机初始化,停止运转while(i<=11){if (TestKey()){shu[i]=InKey();i++;}} //键盘读入数据while (1){ unsigned char a,b,c;LEDBuf[0] = LEDMAP[Hour/10];LEDBuf[1] = LEDMAP[Hour%10] | 0x80;LEDBuf[2] = LEDMAP[Minute/10];LEDBuf[3] = LEDMAP[Minute%10] | 0x80;LEDBuf[4] = LEDMAP[Second/10];LEDBuf[5] = LEDMAP[Second%10];a=((Hour*60)+Minute)*60+Second;//b=((shu[0]*10+shu[1])*60+(shu[2]*10+shu[3]))*60+shu[4]*10+shu[5];//c=((shu[6]*10+shu[7])*60+(shu[8]*10+shu[9]))*60+shu[10]*10+shu[11];b=shu[0]*10+shu[1];c=shu[2]*10+shu[3];// b=shu[4]*10+shu[5];//c=shu[10]*10+shu[11];DisplayLED();if(a>=b&&a<=c){dianjikai();}if(a>c){dianjiting();} //控制电机开与停}}。
单片机实验指导书(实验源程序)实验二、三 I/O接口实验1、输出实验例1:ORG 0000HAJMP START ;跳转到初始化程序ORG 0033H;----- 主程序开始 -----START: MOV P1,#0FFH ;是所有LED熄灭ACALL DELAY ;调用延时子程序CLR P1.0 ;P1.0输出低电平,使LED3点亮ACALL DELAY ;调用延时子程序SETB P1.0 ;P1.0输出高电平,使LED3熄灭CLR P1.1 ;P1.1输出低电平,使LED4点亮ACALL DELAY ;调用延时子程序SETB P1.1 ;P1.1输出高电平,使LED4熄灭CLR P1.2 ;P1.2输出低电平,使LED5点亮ACALL DELAY ;调用延时子程序SETB P1.2 ;P1.2输出高电平,使LED5熄灭CLR P1.3 ;P1.3输出低电平,使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亮的数据(二进制的11111110) 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 p3.2,$jnb p3.2,$cpl p1.0sjmp st1end例2:;****************************************************************************** ;* 按压实验板上的按钮K1,控制P1.0的LED亮灭 * ;* 按压K1,LED点亮,再次按压K1,LED熄灭 * ;* 程序没有进行按键消抖动处理,控制结果会因为按键抖动而出错 * ;* 按压K1十次,大概有3~5次输出会因为按键抖动而发生错误 * ;* 实验时请多按几次,观察一下效果,加深对按键消抖动重要性的认识 * ;******************************************************************************ORG 0000HAJMP START ;跳转到初始化程序ORG 0033HSTART: MOV SP,#60H ;SP初始化MOV P3,#0FFH ;端口初始化MAIN: JB P3.2,MAIN ;检测按键K1有没有按下CPL P1.0 ;执行按键命令,改变P1.0指示灯状态JNB P3.2,$ ;等待按键K1释放AJMP MAIN ;返回重新检测按键END例3:;****************************************************************************** ;* 按压实验板上的按钮K1,控制P1.0的LED亮灭 * ;* 按压K1,LED点亮,再次按压K1,LED熄灭 * ;* 程序进行了按键消抖动处理,不会出现控制结果出错的现象 * ;* 由此可以看出按键软件消抖动的功效 * ;******************************************************************************ORG 0000HAJMP START ;跳转到初始化程序ORG 0033HSTART: MOV SP,#60H ;SP初始化MOV P3,#0FFH ;端口初始化MAIN: JB P3.2,MAIN ;检测按键P3.2有没有按下ACALL YS20ms ;消前沿抖动延时,实现软件去抖动JB P3.2,MAIN ;再次检测按键,如果为高电平,则是抖动CPL P1.0 ;执行按键命令,改变P1.0指示灯状态JNB P3.2,$ ;等待按键释放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的执行。
单片机原理及应用实验二报告实验二:单片机IO口的输入输出实验一、实验目的:1.理解并掌握单片机IO口的输入输出原理;2.掌握基础的输入输出编程技巧;3.熟悉单片机实验的基本流程和实验报告格式。
二、实验器材:1.STM32F103C8T6开发板2.LED灯3.电阻(220Ω)4.面包板、杜邦线等。
三、实验原理:单片机的IO口是实现与外部器件进行通信的重要接口,通过编程,我们可以控制IO口的状态(低电平或高电平)来实现对外部器件的控制或检测。
IO口的输入输出原理主要有两种:1.三态输出方式:通过设置IO口的DDR寄存器来将IO口设置为输出模式(推挽输出),并通过设置IO口的ODR寄存器来控制IO口的输出状态为低电平或高电平;2.上拉输入方式:通过设置IO口的DDR寄存器来将IO口设置为输入模式,同时设置IO口的CR寄存器的PUPD位为上拉使能,通过读取IO口的IDR寄存器可以获取IO口的输入状态。
四、实验步骤:1.连接电路:将STM32F103C8T6开发板的VDD和VSS(即5V和GND)分别连接到面包板的3V3和GND,将LED的阳极(长脚)连接到STM32F103C8T6开发板的PA0引脚,将LED的阴极(短脚)通过一个220Ω的电阻连接到GND。
2. 打开Keil uVision5软件,创建一个新的工程,并选择适合的芯片型号(STM32F103C8T6)。
3.编写代码实现将PA0引脚设置为输出模式,并控制LED的亮灭。
五、实验代码:```c#include "stm32f10x.h"void GPIO_Configuration(void)GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);int main(void)GPIO_Configuration(;while (1)GPIO_SetBits(GPIOA, GPIO_Pin_0); // 点亮LEDGPIO_ResetBits(GPIOA, GPIO_Pin_0); // 关闭LED}```六、实验结果与分析:七、实验心得:本次实验主要学习了单片机IO口的输入输出原理,了解了三态输出方式和上拉输入方式,并通过实际编写代码的方式,在STM32F103C8T6开发板上实现了控制LED的亮灭。
单片机实验代码集合(by fangyuan)1.多字节累加程序:ORG 0000HLJMP MAINORG 0030H;将加数和被加数送到指定地址MAIN: MOV 20H,#45HMOV 21H,#74HMOV 30H,#67HMOV 31H,#28H;低位相加MOV A,21HADD A,31HDA AMOV 42H,A;高位相加MOV A,20HADDC A,30HDA AMOV 41H,ACLR AADDC A,#0MOV 40H,ASJMP $END2.数据交换实验编写程序,实现以下操作:【功能1】产生数组Hex1:0H、1H、2H、…0FH,存储到片内RAM区中,数组Hex1的首地址为30H。
【功能2】产生数组Hex2:0FH、0EH、0DH、…0H,存储到片外RAM区中,数组Hex2的首地址为3000H。
【功能3】将片内RAM数组Hex1与片外RAM数组Hex2交换内容。
代码:ORG 0000HHex1 EQU 30H ;定义内部RAM数组首地址Hex2 EQU 3000H ;定义外部RAM数组首地址LJMP MAINORG 0030HMAIN: MOV SP,#4FH ;定义栈顶地址MOV R7,#16MOV R0,#Hex1MOV DPTR,#Hex2LCALL HEX1DE ;调用内部送数据函数LCALL HEX2DE ;调用外部送数据函数LCALL XCHDE ;调用交换函数SJMP $ORG 0100H;内部送数据HEX1DE: PUSH 00HPUSH 07HMOV A,#0LOOP1: MOV @R0,AINC AINC R0DJNZ R7,LOOP1POP 07HPOP 00HRET;外部送数据HEX2DE: PUSH 07HPUSH DPLPUSH DPHMOV A,#0FHLOOP2: MOVX @DPTR,ADEC AINC DPTRDJNZ R7,LOOP2POP DPHPOP DPLPOP 07HRET;交换子程序XCHDE:LOOP3: MOVX A,@DPTRXCH A,@R0INC R0INC DPTRDJNZ R7,LOOP3RETEND3.查表实验1、《单片机原理及应用实验教程》(第2版)“第2章实验3”(P49)。
2 基本输入输出实验(蜂鸣器控制程序)/******************************************************* 名称:基本输入输出(I/O )程序说明:********************************************************/#include<STC12c5A32s2.h> //包含头文件#define uint unsigned int //宏定义#define uchar unsigned charsbit buzzer=P3A5;sbit Keyadd=P2A。
;sbit Keydec=P2A1;sbit Keycom=P2A2;void Delay(uint z){ uint x;uchar y;for(x=z;x>0;x--) //延时{for(y=250;y>0;y--);}} void main(void){ uchar voice;voice=3;while(1){if(Keyadd==0) voice=1;// 按键被按下时为0 if(Keydec==0) voice=2; if(Keycom==0)voice=3;if(voice==1) {buzzer=~buzzer; Delay(1);}else if(voice==2) {buzzer=~buzzer;Delay(20);}elsebuzzer=1;3 定时器中断实验/******************************************************* 名称: 实验三作业说 明:****************************************************** #include<STC12c5A32s2.h> #defineuint unsigned int #define ucharunsigned char uchar counter; uchar voice; sbit buzzer=P3A 5; sbit Keyadd=P2A 。
(作者注:程序仅供参考,虽然本人在实验时这些源程序是可以跑的。
用的板子是51单片机,软件是MDK4)1. 第一个发光管以间隔200ms闪烁2. 8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。
3.用8个发光管演示出8位二进制数累加过程,即用8个二极管表示8个二进制位(亮为1,灭为0),依次以二进制形式显示0,1,2,……255。
4.间隔300ms第一次一个管亮流动一次,第二次两个管亮流动,依次到8个管亮,然后重复整个过程。
1、#include "reg51.h"unsigned char Count;sbit P_1 =P1^0 ;void Time0_Init() //定时器0 初始化函数{TMOD = 0x01; //工作模式选择IE = 0x82; //中断设置TH0 = 0xD8; //装初值TL0 = 0xEF; //12MZ 晶振,10ms}void Time0_Int() interrupt 1 //定时器0 中断子函数{TH0 = 0xD8;TL0 = 0xEF;Count++; //长度加1if(Count==20){Count=0;P_1=~P_1;}}void main(){Time0_Init(); //定时器T0中断初始化TR0=1;while(1){}}2、#include "reg51.h"unsigned char Count;unsigned char i;sbit P_1 =P1^0 ;sbit P_2=P1^1;sbit P_3=P1^2;sbit P_4=P1^3;sbit P_5=P1^4;sbit P_6=P1^5;sbit P_7=P1^6;sbit P_8=P1^7;sbit P_9 =P2^3 ;void Time0_Init() //定时器0 初始化函数{TMOD = 0x01; //工作模式选择IE = 0x82; //中断设置TH0 = 0xD8; //装初值TL0 = 0xEF; //12MZ 晶振,10ms}void Time0_Int() interrupt 1 //定时器0 中断子函数{TH0 = 0xD8;TL0 = 0xEF;Count++; //长度加1if(Count==50){Count=0;if(i==0){P_1=0;P_9=0;}else if(i==1){P_1=1;P_9=1;}else if(i==2){P_2=0;P_9=0;}else if(i==3){P_2=1;P_9=1;}else if(i==4){P_3=0;P_9=0;}else if(i==5){P_3=1;P_9=1;}else if(i==6){P_4=0;P_9=0;}else if(i==7){P_4=1;P_9=1;}else if(i==8){P_5=0;P_9=0;}else if(i==9){P_5=1;P_9=1;}else if(i==10){P_6=0;P_9=0;}else if(i==11){P_6=1;P_9=1;}else if(i==12){P_7=0;P_9=0;}else if(i==13){P_7=1;P_9=1;}else if(i==14){P_8=0;P_9=0;}else if(i==15){P_8=1;P_9=1;}i=i+1;if(i==16){i=0;}}}void main(){Time0_Init(); //定时器T0中断初始化TR0=1;while(1){}}3、#include "reg51.h"unsigned char Count;unsigned char i;//sbit P_1 =P1;void Time0_Init() //定时器0 初始化函数{TMOD = 0x01; //工作模式选择IE = 0x82; //中断设置TH0 = 0xD8; //装初值TL0 = 0xEF; //12MZ 晶振,10ms}void Time0_Int() interrupt 1 //定时器0 中断子函数{TH0 = 0xD8;TL0 = 0xEF;Count++; //长度加1if(Count==100){Count=0;if(i<=255){P1=255-i;}else{i=0;}i=i+1;}}void main(){//P1=1;Time0_Init(); //定时器T0中断初始化TR0=1;while(1){}}4、#include "reg51.h"unsigned char Count;unsigned char i;sbit P_1 =P1^0 ;sbit P_2=P1^1;sbit P_3=P1^2;sbit P_4=P1^3;sbit P_5=P1^4;sbit P_6=P1^5;sbit P_7=P1^6;sbit P_8=P1^7;sbit P_9 =P2^3 ;void Time0_Init() //定时器0 初始化函数{TMOD = 0x01; //工作模式选择IE = 0x82; //中断设置TH0 = 0xD8; //装初值TL0 = 0xEF; //12MZ 晶振,10ms}void Time0_Int() interrupt 1 //定时器0 中断子函数{TH0 = 0xD8;TL0 = 0xEF;Count++; //长度加1if(Count==30){Count=0;if(i==0){P_1=0;}else if(i==1){P_1=1;}else if(i==2){P_1=0;P_2=0;}else if(i==3){P_1=1;P_2=1;}else if(i==4){P_1=0;P_2=0;P_3=0;}else if(i==5){P_1=1;P_2=1;P_3=1;}else if(i==6){P_1=0;P_2=0;P_3=0;P_4=0;}else if(i==7){P_1=1;P_2=1;P_3=1;P_4=1;}else if(i==8){P_1=0;P_2=0;P_3=0;P_4=0;P_5=0;}else if(i==9){P_1=1;P_2=1;P_3=1;P_4=1;P_5=1;}else if(i==10){P_1=0;P_2=0;P_3=0;P_4=0;P_5=0;P_6=0;}else if(i==11){P_1=1;P_2=1;P_3=1;P_4=1;P_5=1;P_6=1;}else if(i==12){P_1=0;P_2=0;P_3=0;P_4=0;P_5=0;P_6=0;P_7=0;} else if(i==13){P_1=1;P_2=1;P_3=1;P_4=1;P_5=1;P_6=1;P_7=1;}else if(i==14){P_1=0;P_2=0;P_3=0;P_4=0;P_5=0;P_6=0;P_7=0;P_8=0;} else if(i==15){P_1=1;P_2=1;P_3=1;P_4=1;P_5=1;P_6=1;P_7=1;P_8=1;} i=i+1;if(i==16){i=0;}}}void main(){Time0_Init(); //定时器T0中断初始化TR0=1;while(1){}}。
24c02单片机实验的代码使用24c02单片机进行实验的代码是一种用于存储和读取数据的电路。
这个芯片可以存储8个页面的数据,每个页面有256个字节。
通过I2C总线协议,我们可以通过单片机与24c02进行通信。
在实验中,我们首先需要设置I2C总线的通信参数,包括时钟频率和设备地址。
然后,我们可以使用写操作将数据写入24c02中的特定地址。
写操作的过程包括发送起始信号、设备地址、数据地址和数据。
写操作完成后,我们可以使用读操作来读取存储在特定地址的数据。
读操作的过程类似于写操作,但是在发送设备地址后,我们需要发送读命令,然后从24c02中读取数据。
为了简化代码,我们可以使用现成的库函数来实现I2C通信和数据读写。
这些库函数可以提供更高层次的抽象,使得代码更加易于理解和维护。
例如,我们可以使用Wire库函数来实现I2C通信,使用write函数和read函数来实现数据的写入和读取。
下面是一个使用24c02单片机进行实验的示例代码:```c#include <Wire.h>#define DEVICE_ADDRESS 0x50void setup() {Wire.begin();Serial.begin(9600);}void loop() {byte data = 0x55;// 写入数据到地址0x00Wire.beginTransmission(DEVICE_ADDRESS); Wire.write(0x00);Wire.write(data);Wire.endTransmission();delay(100);// 读取地址0x00的数据Wire.beginTransmission(DEVICE_ADDRESS); Wire.write(0x00);Wire.endTransmission();Wire.requestFrom(DEVICE_ADDRESS, 1);if (Wire.available()) {byte readData = Wire.read();Serial.print("Read data: ");Serial.println(readData, HEX);}delay(1000);}```在这个示例代码中,我们首先在setup函数中初始化I2C通信和串口通信。
实验二单片机定时器/计数器编程一、实验目的1、掌握单片机定时器/计数器的工作方式;2、掌握单片机定时器/计数器的编程方法。
二、实验内容1、学习单片机定时器/计数器的工作方式、初始化以及应用等;2、利用单片机定时器/计数器编写程序驱动开发板上的LED灯按一定规律工作。
基本要求:利用定时器1控制LEDB闪烁,闪烁频率为2Hz。
提高要求:读懂教材定时器/计数器的应用实例4和5,在实验室开发板上采用分模块设计的方法编程实现以下两个任务之一:1、控制LEDB闪烁,2.5秒一个周期,亮0.5s,灭2s,周而复始。
2、将教材例5对P1.0和P1.1的控制,改为对LEDB和LEDG的控制,时序不变。
三、实验设备1、STC单片机开发板;2、PC机以及串口线。
四、实验分析及关键代码(1)利用定时器1控制LEDB闪烁,闪烁频率为2Hz。
实验分析:控制LEDB闪烁,频率为2Hz,即0.5s。
解决思路:定时器工作方式选0x01,计数器初值为(65536-50000),循环10次即为0.5s。
代码如下:#include<reg51.h>#define uchar unsigned char sbit A=P2^4;uchar i=0;void main (){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;while(1){while(TF0){TF0=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256;i++;if(i==10){A=!A;i=0;}}}}(2)控制LEDB闪烁,2.5秒一个周期,亮0.5s,灭2s,周而复始。
解决思路:设置两个循环,计数器初值设为(65536-50000),亮灯循环10次,灭灯循环40次。
代码如下:#include<reg51.h>#define uchar unsigned charsbit A=P2^4;uchar i=0;void main (){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;while(1){while(TF0){TF0=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256;i++;if(i==10){A=1;}if(i==50){A=0;i=0;}}}}五、实验总结对软件及计数器的操作及代码不太熟悉,多次查询课本及上网查找资料后懂得计数器工作方式及计数操作,其他问题迎刃而解。
单片机实验代码文件排版存档编号:[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序列时,蜂鸣器响动,指示灯点亮。
电路图用张毅刚版教材里给的图!!!!1、流水灯#include<reg52.h>#include<intrins.h>void delay(){unsigned char i,j;for(i=0;i<255;i++)for(j=0;j<255;j++);}void main(){P2=0xfe;while(1){P2=_crol_(P2,1);delay();}}2、单个外部中断#include<reg52.h>#include<intrins.h>void delay(unsigned char delay_time){unsigned int i,j;for(i=0;i<=delay_time;i++)for(j=0;j<=100;j++);}void init_tx(){EA=1;EX0=1;IT0=0;}void main(){P1=0x00;init_tx();delay(200);while(1){P1=~P1;delay(200);}}void tx0() interrupt 0{P1=0xfe;while(!INT0){P1=_crol_(P1,1);delay(200);}P1=0xff;}3、定时器#include<reg52.h>unsigned char t=20;sbit button=P3^2;sbit yellowled=P1^0;/* 定义接口*/void main(){TMOD=0x01;/* 选择中断方式*/ EA=1;ET0=1;TH0=0x3c;TL0=0x0b;while(button==0){TR0=1;}yellowled=1;}void tx() interrupt 1{TH0=0x3c;TL0=0xb0;t--;if(t==0){yellowled=~yellowled;t=20;}}4、双机串行通信#include<reg51.h>#define uchar unsigned char#define uint unsigned int#define outk P1#define out1 P0#define out2 P2uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; uchar key,send,rec;uchar scan(void);void delay(unit);void main(void){TMOD=0X20; TH1=0XF2;/* 设置定时器T1 为方式/* 给定时器T1 赋初值 */2*/TH1=0XF2;TR1=1;/* 接通定时器T1*/SCON=0X50;/* 串行口方式1, REN=1允许接收*/ PCON=0X00;/* SMOD=0*/EA=1;ES=1;EX1=1;EX0=1;while(1){outk=0x07;out1=seg[send];out2=seg[rec];}}uchar scan(void){uchar k=10,m,n,in;delay(10);outk=0x07;if((outk&0x07)!=0x07){for(m=0;m<3;m++){outk=~(0x01<<(m+3));for(n=0;n<3;n++){in=outk;in=in>>n;if((in&0x01)==0){if((in&0x01)==0){k=n+m*3;break;}}}if(k!=10)break;}}return(k);}void delay(uint j){uchar i;for(;j>0;j--){i=250;while(--i);i=249;while(--i);}}void ext0()interrupt 0{EX0=0;key=scan();if(key!=10)send=key+1;EX0=1;}void ext1()interrupt 2{ES=0;SBUF=send;while(!TI);TI=0;ES=1;}void com()interrupt 4{RI=0;rec=SBUF;}5、单片机与PC 串行通信#include <reg51.h>void send(unsigned char dat) {SBUF=dat;while(TI==0);;TI=0;}void init_tx(){EA=1;EX0=1;}void delay(void){unsigned char m,n;for(m=0;m<250;m++)for(n=0;n<250;n++);}void main(void){init_tx();TMOD=0x20;SCON=0x40;PCON=0x00;TH1=0xfd;TL1=0xfd;TR1=1;while(1);}void tx0() interrupt 0{unsigned char i=0;send(0x01);delay();i++;}6、扩展 82c55 并行 IO 接口#include<reg51.h>#include<absacc.h>#define uchar unsigned char #define uint unsigned intsbit rst_8255=P3^5;#define con_8255XBYTE[0x7003] #define pa_8255XBYTE[0x7000] #define pb_8255XBYTE[0x7001] void reset_8255(void);void delay(uint);void main(void){/*0x7003 为 82C55 的控制寄存器地址/* 以下定义pa、pb 的端口地址 */*/uchar temp;rst_8255=1;delay(1);rst_8255=0;con_8255=0x82;while(1){/* 复位 */temp=pb_8255;pa_8255=temp;/* 锁存 */}}void delay(uint j)/* 延时函数*/{uchar i;for(;j>0;j--){i=250;while(--i);i=249;while(--i);}}7、矩阵键盘#include<reg51.h>unsigned char codetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; void delay(){unsigned char i,j;(延时)for(i=0;i<=25;i++)for(j=0;j<=25;j++);}unsigned char key_scan(){unsigned char key0,key1;unsigned char key_num=0;P1=0x0f; 先将 p1.0~P1.3 置高key0=P1;if(key0!=0x0f) 如果 P1.4~P1.7 不全为 1,可能有键按下{delay();key0=P1;if(key0!=0x0f){P1=0xf0;key1=P1;if(key0==0x0e){switch(key1){case 0xe0: key_num=0;break;case 0xd0: key_num=1;break;case 0xb0: key_num=2;break;case 0x70: key_num=3;break;default: key_num=0;break;}}else if(key0==0x0d){switch(key1){case 0xe0: key_num=4;break;case 0xd0: key_num=5;break; ( 处理 5 号键 )case 0xb0: key_num=6;break;case 0x70: key_num=7;break;default: key_num=0;break;(无效按键,如多个键同时按下)}}else if(key0==0x0b){switch(key1){case 0xe0: key_num=8;break;case 0xd0: key_num=9;break;case 0xb0: key_num=10;break;case 0x70: key_num=11;break;default: key_num=0;break;}}else if(key0==0x07){switch(key1){case 0xe0: key_num=12;break;case 0xd0: key_num=13;break;case 0xb0: key_num=14;break;case 0x70: key_num=15;break;default: key_num=0;break;}}}}return key_num;}void main(){unsigned char key_num;do{key_num=key_scan();P2=table[key_num];}while(1);}8、 1602 液晶显示#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define out P0sbit RS=P2^0;sbit RW=P2^1;sbit E=P2^2;void lcd_initial(void);void check_busy(void);void write_command(uchar com);void write_data(uchar dat);void string(uchar ad,uchar *s);void lcd_test(void);void delay(uint);void main(void){lcd_initial();while(1){string(0x82,"Hello Welcome");string(0xC2,"To China");delay(100);write_command(0x01);delay(100);}}void delay(uint j){uchar i=250;for(;j>0;j--){while(--i);i=249;while(--i);i=250;}}void check_busy(void){uchar dt;do{dt=0xff;E=0;RS=0;RW=1;E=1;dt=out;}while(dt&0x80);E=0;}void write_command(uchar com){check_busy();E=0;RS=0;RW=0;out=com;E=1;_nop_();E=0;delay(1);}void write_data(uchar dat){check_busy();E=0;RS=1;RW=0;out=dat;E=1;_nop_();E=0;delay(1);}void lcd_initial(void){write_command(0x3c);write_command(0x0C);write_command(0x14);write_command(0x01);delay(1);}void string(uchar ad,uchar *s) {write_command(ad);while(*s>0){write_data(*s++);delay(100);}}9、 DA 转换#include<reg51.h>#define uchar unsigned char#define uint unsigned int#define out P1sbit DAC_cs=P2^0;sbit DAC_wr=P2^1;void main(void){uchar temp,i=255;while(1){{out=temp;DAC_cs=0; DAC_wr=0;/* 片选端,芯片被选中/* 选通,并被锁存*/*/DAC_cs=1;/* 以下开始转换*/DAC_wr=1;temp++;while(--i);/* 延时函数!!,老师帮改的*/}}}10、 AD 转换#include<reg51.h>#define uchar unsigned char#define uint unsigned int#define LED P0#define out P1sbit start=P2^1;sbit OE=P2^7;sbit EOC=P2^3;sbit CLOCK=P2^0;sbit add_a=P2^4;sbit add_b=P2^5;sbit add_c=P2^6;void main(void){uchar temp;add_a=0;add_b=0;add_c=0;while(1){start=0;start=1;start=0;while(1){CLOCK=!CLOCK;if(EOC==1){break;}OE=1;temp=out;OE=0;LED=temp;}}}。
实验1 红黄绿灯控制ORG 0000HRED EQU P1.0YELLOW EQU P1.1GREEN EQU P1.2MAIN: CLR REDSETB YELLOWSETB GREENMOV R0,#40ACALL DELAYSETB REDCLR YELLOWSETB GREENMOV R0,#20ACALL DELAYSETB REDCLR YELLOWCLR GREENMOV R0,#10ACALL DELAYSETB REDSETB YELLOWCLR GREENMOV R0,#30ACALL DELAYAJMP MAIN DELAY: MOV A,R0MOV R7,ADEL0: MOV R6,#200DEL1: MOV R5,#250DEL2: DJNZ R5,DEL2DJNZ R6,DEL1DJNZ R7,DEL0RETEND实验2 LED、LCD显示LED:ORG 0000HAJMP MAINORG 0030HMAIN: CLR P2.4SETB P2.5LOOP: MOV R0,#00HMOV R4,#0AHLP: MOV A,R0MOV DPTR,#TABMOVC A,@A+DPTRMOV P0,ALCALL DELAYINC R0DJNZ R4,LPAJMP LOOPDELAY: MOV R7,#10DEL0: MOV R6,#200DEL1: MOV R5,#250DEL2: DJNZ R5,DEL2DJNZ R6,DEL1DJNZ R7,DEL0RETTAB:DB 0C0h,0F3h,98h,92h,0A3h,86H,84H,0D3H,80H,82H ENDLCD:ORG 0000HAJMP MAINDAT EQU P2.7CLK EQU P2.6MOV R1,#00MAIN: MOV 79H,#10MOV 78H,#10MOV 77H,#10MOV 76H,#10MOV 75H,R1LCALL DISPLAYLCALL DELAYINC R1CJNE R1,#10,MAINMOV R1,#00AJMP MAINDISPLAY: MOV R0,#79HSETB CLKMOV DPTR,#TABLOOP: MOV A,@R0MOVC A,@A+DPTRACALL DISDEC R0CJNE R0,#74H,LOOPSETB DATSETB CLKRETDIS: MOV R7,#8DIS1: CLR CLKRRC AMOV DA T,CSETB CLKDJNZ R7,DIS1CLR CLKSETB DAT实验3 键盘实验ORG 0000HAJMP MAINORG 0030HMAIN: MOV P0,#0C0HCLR P2.4SETB P2.5MOV R1,#00HKEY1: SETB P2.2JB P2.2,KEY2ACALL DELAYKEY11:SETB P2.2JNB P2.2,KEY11LCALL OPENLEDCLR P1.0SETB P1.1SETB P1.2KEY2: SETB P2.1JB P2.1,KEY3ACALL DELAYKEY22:SETB P2.1JNB P2.1,KEY22CLR P1.1SETB P1.0SETB P1.2KEY3: SETB P2.0JB P2.0,KEY1ACALL DELAYKEY33:SETB P2.0JNB P2.0,KEY33CLR P1.2SETB P1.0SETB P1.1AJMP KEY1OPENLED:INC R1MOV A,R1MOV DPTR,#TABMOVC A,@A+DPTRMOV P0,ACJNE R1,#0AH,LOOPMOV R1,#0LOOP: JNC MAINRETDELAY:MOV R2,#200;延时子程序,约10ms DEL0: MOV R3,#125DEL1: DJNZ R3,DEL1DJNZ R2,DEL0RET TAB:DB 0C0h,0F3h,98h,92h,0A3h,86H,84H,0D3H,80H,82H END实验4 定时器中断实验LED:0~9ORG 0000HDIGIT1 EQU P2.5DIGIT2 EQU P2.4AJMP MAINORG 000BHAJMP INTR0ORG 0030HMAIN: MOV R0,#00HMOV R2,#100 ;中断100次为1sMOV P0,#0FFHSETB DIGIT1 ;点亮右边的LEDCLR DIGIT2MOV TMOD,#01H ;T0定时,工作方式1MOV TH0,#0E0H ;T0计数初值MOV TL0,#80HSETB EASETB ET0SETB TR0AJMP $ ;等待中断INTR0: MOV TH0,#0E0H ;T0重赋初值MOV TL0,#80HDJNZ R2,LP ;是否中断100次MOV DPTR,#TABMOV A,R0MOVC A,@A+DPTRMOV P0,AMOV R2,#100INC R0CJNE R0,#0AH,LPMOV R0,#00HLP: RETITAB:DB 0C0H,0F3H,98H,92H,0A3H,86H,84H,0D3H,80H,82H ENDLED:00~99ORG 0000HDIGIT1 EQU P2.5DIGIT2 EQU P2.4LED_1 EQU 7FHLED_2 EQU 7EHAJMP MAINORG 000BHAJMP INTR0ORG 0030HMAIN: MOV R0,#00MOV R2,#100 ;中断100次为1sMOV P0,#0FFHMOV TMOD,#01H ;T0定时,工作方式1MOV TH0,#0E0H ;T0计数初值MOV TL0,#80HSETB EASETB ET0SETB TR0AJMP $ ;等待中断INTR0: MOV TH0,#0E0H ;T0重赋初值MOV TL0,#80HDJNZ R2,LP2 ;是否中断100次MOV R2,#100LP1: INC R0CJNE R0,#100,LP2MOV R0,#00LP2: MOV P0,#0FFHACALL DISPLAYRETIDISPLAY:ACALL INV16_10JB F0,DISLED1AJMP DISLED2DISLED1:MOV A,LED_1SETB DIGIT1CLR DIGIT2CLR F0AJMP DISDISLED2:MOV A,LED_2CLR DIGIT1SETB DIGIT2SETB F0DIS: MOV DPTR,#TABMOVC A,@A+DPTRMOV P0,ARETINV16_10:MOV A,R0MOV B,#10DIV ABMOV LED_2,AMOV LED_1,BRETTAB:DB 0C0H,0F3H,98H,92H,0A3H,86H,84H,0D3H,80H,82H ENDLCD:00~99ORG 0000HDAT EQU P2.7CLK EQU P2.6MOV 79H,#10MOV 78H,#10MOV 77H,#10MOV R1,#0FFHMAIN: INC R1CJNE R1,#100,NEXTMOV R1,#00NEXT: LCALL INV16_10LCALL DISPLAYLCALL DELAYAJMP MAINDISPLAY: MOV R0,#79HSETB CLKMOV DPTR,#TABLOOP: MOV A,@R0MOVC A,@A+DPTRACALL DISDEC R0CJNE R0,#74H,LOOPSETB DATSETB CLKRETDIS: MOV R7,#8DIS1: CLR CLKRRC AMOV DA T,CSETB CLKDJNZ R7,DIS1CLR CLKSETB DATRETDELAY: MOV R4,#10DEL0: MOV R6,#200DEL1: MOV R5,#250DEL2: DJNZ R5,DEL2DJNZ R6,DEL1DJNZ R4,DEL0RETINV16_10:MOV A,R1MOV B,#10DIV ABMOV 76H,AMOV 75H,BRETTAB: DB 90H,0F3H,89H,0A1H,0E2H,0A4H DB 84H,0F1H,80H,0A0H,0FFHEND实验5 计数器实验000~255:ORG 0000HDAT EQU P2.7CLK EQU P2.6AJMP MAINORG 0030HMAIN: CLR AMOV 79H,#10MOV 78H,#10MOV 77H,AMOV 76H,AMOV 75H,AMOV TMOD,#01100000BMOV TL1,#00HMOV TH1,#00HSETB TR1LOOP: ACALL INV16_10ACALL DISPLAYACALL DELAYAJMP LOOPINV16_10: MOV A,TL1MOV B,#100DIV ABMOV 77H,AMOV A,BMOV B,#10DIV ABMOV 76H,AMOV 75H,BRETDISPLAY: MOV R0,#79HSETB CLKMOV DPTR,#TAB LOOP1: MOV A,@R0MOVC A,@A+DPTRACALL DISDEC R0CJNE R0,#74H,LOOP1SETB DA TSETB CLKRETDIS: MOV R7,#8DIS1: CLR CLKRRC AMOV DAT,CSETB CLKDJNZ R7,DIS1CLR CLKSETB DA TRETDELAY: MOV R4,#3DEL0: MOV R6,#200 DEL1: MOV R5,#250DEL2: DJNZ R5,DEL2DJNZ R6,DEL1DJNZ R4,DEL0RETTAB: DB 90H,0F3H,89H,0A1H,0E2H,0A4H DB 84H,0F1H,80H,0A0H,0FFHEND00000~99999:实验6 A/D转换器实验ORG 0000HCK1 EQU P3.6DO1 EQU P3.7CS EQU P3.3V_1 EQU 77HV_10 EQU 76HAJMP MAINORG 0030HMAIN:ACALL ADACALL CAL_VOLACALL DISPLAYACALL DELAYAJMP MAINAD:MOV R5,#8CLR CSCLR CK1SETB CK1CLR CK1SETB CK1CLR CK1CLR DO1NOPNOPSETB CK1NOPNOPCLR CK1SETB DO1NOPNOPSETB CK1NOPNOPADA: CLR CK1MOV C,DO1RLC ASETB CK1DJNZ R5,ADASETB CSMOV 20H,ARETCAL_VOL:MOV A,20HMOV B,#50MUL ABMOV A,BMOV B,#10DIV ABADD A,#11MOV V_1,AMOV V_10,BRETDAT EQU P2.7CLK EQU P2.6DISPLAY:MOV 79H,#10MOV 78H,#10MOV 75H,#21MOV R0,#79HSETB CLKMOV DPTR,#TABLOOP:MOV A,@R0MOVC A,@A+DPTRACALL DISDEC R0CJNE R0,#74H,LOOPSETB DATSETB CLKRETDIS:MOV R7,#8DIS1:CLR CLKRRC AMOV DA T,CSETB CLKDJNZ R7,DIS1CLR CLKSETB DATRETTAB:DB 90H,0F3H,89H,0A1H,0E2H,0A4H,84H,0F1H,80H,0A0H,0FFH DB 10H,73H,09H,21H,62H,24H,02H,71H,00H,20H,0EAH DELAY:MOV R4,#0L1:MOV R6,#0DJNZ R6,$DJNZ R4,L1RETEND实验7 PC机与单片机的串行通讯实验ORG 0000HAJMP MAINORG 0023HAJMP RECORG 0030HMAIN:CLR P2.4SETB P2.5MOV TMOD,#00100000B;T1方式2MOV TH1,#0FDHMOV TL1,#0FDHMOV SCON,#11010011B;中断方式3,允许串口接收SETB EASETB ESSETB TR1AJMP $REC: JNB RI,$CLR RIMOV A,SBUFTRS: JNB TI,$CLR TIMOV SBUF,AMOV DPTR,#TABMOVC A,@A+DPTRMOV P0,ARETITAB:DB 0C0H,0F3H,98H,92H,0A3H,86H,84H,0D3H,80H,82H END实验8:LED_3 EQU 79HLED_2 EQU 7AHLED_1 EQU 7BHLED_0 EQU 7CHFLAG1 EQU 7FHDQ EQU P3.4TEMPER_L EQU 29HTEMPER_H EQU 28HTEMPER_P EQU 27HORG 0000HAJMP MAINORG 0030HMAIN: LCALL INIT_1820LCALL GET_TEMPERLCALL COV_TLCALL DISPLAYACALL DELAYAJMP MAINCLK EQU P2.6DAT EQU P2.7DISPLAY:MOV LED_3,#21MOV 7DH,#10MOV R0,#7DHSETB CLKMOV DPTR,#TABLOOP: MOV A,@R0MOVC A,@A+DPTRACALL DISDEC R0CJNE R0,#78H,LOOPSETB DA TSETB CLKRETDIS: MOV R7,#8DIS1: CLR CLKRRC AMOV DA T,CSETB CLKDJNZ R7,DIS1CLR CLKSETB DA TRETTAB:DB 90H,0F3H,89H,0A1H,0E2H,0A4HDB 84H,0F1H,80H,0A0H,0FFHDB 10H,73H,09H,21H,62H,24H,04H,71H,00H,20H,9CH DELAY: MOV R2,#5DELAY3: MOV R3,#0DELAY2: MOV R4,#0DELAY1: DJNZ R4,DELAY1DJNZ R3,DELAY2DJNZ R2,DELAY3RETCOV_T: MOV A,TEMPER_LMOV TEMPER_P,#00HMOV C,40HRRC AMOV 38H,CMOV C,41HRRC AMOV 39H,CMOV C,42HRRC AMOV 3AH,CMOV C,43HRRC AMOV 3BH,CMOV TEMPER_L,AMOV A,29HMOV B,#10DIV ABMOV LED_0,AMOV A,#11ADD A,BMOV LED_1,AMOV A,27HMOV DPTR,#POINTTABMOVC A,@A+DPTRMOV LED_2,ARETPOINTTAB:DB 00H,01H,01H,02H,03H,03H,04H,04HDB 05H,06H,06H,07H,08H,08H,09H,09H INIT_1820:SETB DQNOPCLR DQMOV R0,#06BHMOV R1,#03HTSR1:DJNZ R0,TSR1MOV R0,#6BHDJNZ R1,TSR1SETB DQNOPNOPNOPMOV R0,#25HTSR2:JNB DQ,TSR3DJNZ R0,TSR2LJMP TSR4TSR3:SETB FLAG1LJMP TSR5TSR4:CLR FLAG1LJMP TSR7TSR5:MOV R0,#06BHTSR6:DJNZ R0,TSR6TSR7:SETB DQRETGET_TEMPER:SETB DQLCALL INIT_1820JB FLAG1,TSS2RETTSS2:MOV A,#0CCHLCALL WRITE_1820MOV A,#44HLCALL WRITE_1820LCALL DISPLAYLCALL INIT_1820MOV A,#0CCHLCALL WRITE_1820MOV A,#0BEHLCALL WRITE_1820LCALL READ_18200RETWRITE_1820:MOV R2,#8CLR CWR1: CLR DQMOV R3,#6DJNZ R3,$RRC AMOV DQ,CMOV R3,#23DJNZ R3,$SETB DQNOPDJNZ R2,WR1SETB DQRETREAD_18200:MOV R4,#2MOV R1,#29HRE00:MOV R2,#8RE01:CLR CSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#07RE10:DJNZ R3,RE10MOV C,DQMOV R3,#23HRE20:DJNZ R3,RE20RRC ADJNZ R2,RE01MOV @R1,ADEC R1DJNZ R4,RE00RETEND。
电子系统综合设计报告学号201009120229姓名李文海年级专业2010级电子信息工程(二)指导教师刘怀强学院理学院走马灯实验论文--《嵌入式系统技术》1、实验目的1、学会DP-51PRO实验仪监控程序下载、动态调试等联机调试功能的使用;2、理解和学会单片机并口的作为通用I/O的使用;3、理解和学会单片机外部中断的使用;4、了解单片机定时器/计数器的应用。
2、实验设备z PC 机、ARM 仿真器、2440 实验箱、串口线。
3、实验内容z熟悉A RM 开发环境的建立。
z使用A RM 汇编和C语言设置G PIO 口的相应寄存器。
z编写跑马灯程序。
5、实验原理走马灯实验是一个硬件实验,因此要求使用DP-51PRO 单片机综合仿真实验仪进行硬件仿真,首先要求先进行软件仿真,排除软件语法错误,保证关键程序段的正确。
然后连接仿真仪,下载监控程序,进行主机与实验箱联机仿真。
为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序间的调用规定一定的规则。
ATPCS ,即ARM ,Thumb 过程调用标准(ARM/Thumb Procedure Call Standard),是A RM 程序和T humb 程序中子程序调用的基本规则,它规定了一些子程序间调用的基本规则,如子程序调用过程中的寄存器的使用规则,堆栈的使用规则,参数的传递规则等。
下面结合实际介绍几种A TPCS 规则,如果读者想了解更多的规则,可以查看相关的书籍。
1.基本A TPCS基本A TPCS 规定了在子程序调用时的一些基本规则,包括下面3方面的内容:(1)各寄存器的使用规则及其相应的名称。
(2)数据栈的使用规则。
(3)参数传递的规则。
相对于其它类型的A TPCS,满足基本A TPCS 的程序的执行速度更快,所占用的内存更少。
但是它不能提供以下的支持:ARM 程序和T humb 程序相互调用,数据以及代码的位置无关的支持,子程序的可重入性,数据栈检查的支持。
而派生的其他几种特定的ATPCS 就是在基本ATPCS 的基础上再添加其他的规则而形成的。
其目的就是提供上述的功能。
2.寄存器的使用规则寄存器的使用必须满足下面的规则:(1) 子程序间通过寄存器R0~R3 来传递参数。
这时,寄存器R0~R3 可以记作A0~A3。
被调用的子程序在返回前无需恢复寄存器R0~R3 的内容。
(2) 在子程序中,使用寄存器R4~Rll 来保存局部变量。
这时,寄存器R4~R11 可以记作V1~V8。
如果在子程序中使用到了寄存器V1~V8 中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;对于子程序中没有用到的寄存器则不必进行这些操作。
在T humb 程序中,通常只能使用寄存器R4~R7 来保存局部变量。
(3) 寄存器R12 用作子程序间s cratch 寄存器,记作I P。
在子程序间的连接代码段中常有这种使用规则。
(4) 寄存器R13 用作数据栈指针,记作S P。
在子程序中寄存器R13 不能用作其他用途。
寄存器S P 在进入子程序时的值和退出子程序时的值必须相等。
(5) 寄存器R14称为连接寄存器,记作LR。
它用于保存子程序的返回地址。
如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。
(6) 寄存器R15 是程序计数器,记作P C。
它不能用作其他用途。
3.参数传递规则根据参数个数是否固定可以将子程序分为参数个数固定的(nonvariadic)子程序和参数个数可变的(variadic)子程序。
这两种子程序的参数传递规则是不同的。
(1)参数个数可变的子程序参数传递规则对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器R0~R3 来传递参数;当参数超过4个时,还可以使用数据栈来传递参数。
在参数传递时,将所有参数看作是存放在连续的内存字单元中的字数据。
然后,依次将各字数据传送到寄存器R0、R1、R2、R3 中,如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。
按照上面的规则,一个浮点数参数可以通过寄存器传递,也可以通过数据栈传递,也可能一半通过寄存器传递,另一半通过数据栈传递。
(2)参数个数固定的子程序参数传递规则对于参数个数固定的子程序,参数传递与参数个数可变的子程序参数传递规则不同。
如果系统包含浮点运算的硬件部件,浮点参数将按照下面的规则传递:·各个浮点参数按顺序处理。
·为每个浮点参数分配F P 寄存器。
·分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP 寄存器。
第一个整数参数,通过寄存器R0~R3 来传递。
其他参数通过数据栈传递。
(3)子程序结果返回规则子程序中结果返回的规则如下:·结果为一个32 位的整数时,可以通过寄存器R0 返回。
·结果为一个64 位整数时,可以通过寄存器R0 和R l 返回,依次类推。
·结果为一个浮点数时,可以通过浮点运算部件的寄存器f0、d0 或者s0 来返回。
·结果为复合型的浮点数(如复数)时,可以通过寄存器f0~fN 或者d0~dN 来返回。
·对于位数更多的结果,需要通过内存来传递。
4.C 语言函数和A RM 汇编语言函数间相互调用高级语言函数与汇编语言函数的混合调用也要遵循A TPCS 规则,保证程序调用时参数的正确传递。
在汇编程序中使用EXPORT 伪指令声明本子程序,使其它程序可以调用此子程序,而在C语言程序中使用ex tern 关键字声明外部函数(声明要调用的汇编子程序),即可调用此汇编子程序。
下面给出两个例子来介绍函数相互调用。
6、实验步骤1.编写一段程序,用P1口作为控制端口,使D1区的LED 轮流点亮。
原理图如下图。
图3-1 走马灯实验原理图①仿照实验一的过程,编写程序、汇编、连接、软件仿真,基本达到功能要求。
ORG 0000HLJMP MAINORG 0100HMAIN: MOV A,#0FEH ;准备点亮第一只发光管NEXT: MOV P1,AACALL DELAYRL A ; 准备点亮下一只发光管SJMP NEXT; 延时子程序DELAY: MOV R2,#5DELAY2: MOV R3,#100DELAY3: MOV R4,#100DJNZ R4,$DJNZ R3,DELAY3DJNZ R2,DELAY2RETEND调试成功以后,将程序中的ORG部分的偏移地址再加上8000H,重新编译。
②按照原理图,将A1区P1口的引线分别连接到D1区J52上。
③下载监控程序到实验仪上。
短接A1区的JP15,连接实验仪串口和主机的串口,将MOD-SW1拨到LOAD一边,FLASH-E和SRAM-E断开,运行主机上DPFLASH,下载MON51.HEX到实验仪上。
④在Keil系统上,完成程序的动态调试。
在主菜单DEBUG下的Options for Target ‘Target 1’,点击Debug,选择Use Keil Monitor-51 Driver,并且设置其他参数,将MOD-SW1拨到RUN一边,按复位键,再按DEBUG下的全速运行命令运行监控程序后,就可以进行动态调试了。
观察和记录各个寄存器内容的变化,端口P1的内容变化,以及对应的LED的变化。
全速运行时,观察LED的变化和闪烁速度。
7、实验相关寄存器GPBCON――端口配置寄存器GPBDAT――端口数据寄存器GPBUP――端口上拉电阻使能寄存器8、实验电路图2.编写一段程序,用P1 口作为控制端口,使D1 区的LED 轮流点亮。
用外部中断0控制走马灯的暂停/继续。
(此实验也可脱机运行)ORG 0000HLJMP MAINORG 0003LJMP ZEX0ORG 0100HMAIN: MOV SP,#60HSETB IT0SETB EX0SETB EAMOV A,#0FEH ;准备点亮第一只发光管MOV R5,#00HNEXT: CJNE R5,#00H,NEXT ;00表示继续,FF表示暂停MOV P1,AACALL DELAYRL A ;准备点亮下一只发光管SJMP NEXT; 延时子程序DELAY: MOV R2,#5DELAY2: MOV R3,#100DELAY3: MOV R4,#100DJNZ R4,$DJNZ R3,DELAY3DJNZ R2,DELAY2RET;外部中断0服务子程序ZEX0: PUSH ACCMOV A,R5XRL A,#0FFHMOV R5,APOP ACCRETIEND将A1区P1口的引线分别连接到D1区J52上,将D1区的J53的KEY1连接到A1区的外部中断0上。
◆观察实验结果,解释如何实现走马灯的暂停和继续。
◆比较电平触发和边沿触发时走马灯控制的难易程度。
3.编写一段程序,用P1 口作为控制端口,使D1 区的LED 轮流点亮。
用定时/计数器0控制走马灯的闪烁速度。
(此实验也可脱机运行)ORG 0000HLJMP MAINORG 000BHLJMP ZIT0ORG 0100HMAIN: MOV SP,#60HMOV TMOD,#01HMOV TH0,#3CHMOV TL0,#0B0HMOV R6,#20 /循环次数MOV R7,#0FEH ;准备点亮第一只发光管SETB ET0SETB EASETB TR0SJMP $;定时中断0服务子程序ZIT0: DJNZ R6,ZRET /为零时,跳转!MOV A,R7MOV P1,ARL AMOV R7,AMOV R6,#20 /循环次数ZRET: MOV TH0,#3CHMOV TL0,#0B0HRETIEND◆修改R6=0或1时,观察走马灯的速度快慢。
◆ZRET:处没有重置初值时的走马灯的速度与ZRET处有重置初值时的走马灯的速度的比较。
◆R6=50时,改变T0的初值,设为最大、最小时,比较走马灯的速度。
◆去掉R6的软件辅助延时,是否可以,速度怎样?9、实验记录第一个程序走马灯逐步地闪亮第二个程序当按下D1区k1时, 走马灯暂停, 再按下时就又开始了!第三个程序把 R6值改大了,那间隔时间就增大 ! 走马灯越来越慢!10、实验结果分析程序运行后,LED 灯D3、D4不断闪烁,跑马灯程序运行。
11、实训分析与总结:1、简述LED灯点亮的原理2、观察并描述实验现象,尝试修改参数,使得LED灯变化的更快或者更慢。
3、实验的体会。
实验现象:1号灯亮→ 2号灯亮→ 1、2号灯亮→ 3号灯亮→ 1、2、3号灯亮→ 4号灯亮→ 4个灯全亮→ 4个灯全灭→ 4号灯亮→ 3号灯亮→2号灯亮→ 1号灯亮→ 1、2号灯亮→ 1、2、3号灯亮→ 4个灯全亮→4个灯全灭→ 4号灯亮→ 3、4号灯亮→ 2、3、4号灯亮→ 4个灯全亮→全灭→ 1、2号灯亮→ 1、2、3号灯亮→全亮→全灭。