单片机测试程序

合集下载

L3G4200D 51单片机IIC 测试程序

L3G4200D  51单片机IIC 测试程序

//这是L3G4200D 51单片机IIC 测试程序//这是1602 头文件保存为1602.h#define DataPort P0 //LCD1602数据端口sbit LCD_RS=P2^4; //LCD1602命令端口sbit LCD_RW=P2^5; //LCD1602命令端口sbit LCD_EN=P2^6; //LCD1602命令端口#include <INTRINS.H>#define uchar unsigned charvoid WaitForEnable(void){DataPort=0xff;LCD_RS=0;LCD_RW=1;_nop_();LCD_EN=1;_nop_();_nop_();while(DataPort&0x80);LCD_EN=0;}void WriteCommandLCD(uchar CMD,uchar Attribc) {if(Attribc)WaitForEnable();LCD_RS=0;LCD_RW=0;_nop_();DataPort=CMD;_nop_();LCD_EN=1;_nop_();_nop_();LCD_EN=0;}void WriteDataLCD(uchar dataW){WaitForEnable();LCD_RS=1;LCD_RW=0;_nop_();DataPort=dataW;_nop_();LCD_EN=1;_nop_();_nop_();LCD_EN=0;}void InitLcd(){WriteCommandLCD(0x38,1);WriteCommandLCD(0x08,1);WriteCommandLCD(0x01,1);WriteCommandLCD(0x06,1);WriteCommandLCD(0x0c,1);}void DisplayOneChar(uchar X,uchar Y,uchar DData) {Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;WriteCommandLCD(X,0);WriteDataLCD(DData);}//下面是主程序部分//*************************************** // L3G4200D三轴陀螺仪IIC测试程序// 使用单片机STC89C51// 晶振:11.0592M// 显示:LCD1602// 编译环境Keil uVision2// 参考宏晶网站24c04通信程序// 时间:2011年3月1日//**************************************** #include <reg52.h>#include "1602.h"#include <math.h>#include <stdio.h>#include <INTRINS.H>#define uchar unsigned char#define uint unsigned intsbit SCL=P1^0 ; //IIC时钟引脚定义sbit SDA=P1^1 ; //IIC数据引脚定义//********************#define WHO_AM_I 0x0F#define CTRL_REG1 0x20 // 0010 0000#define CTRL_REG2 0x21#define CTRL_REG3 0x22#define CTRL_REG4 0x23#define CTRL_REG5 0x24#define OUT_X_L 0x28#define OUT_X_H 0x29#define OUT_Y_L 0x2A#define OUT_Y_H 0x2B#define OUT_Z_L 0x2C#define OUT_Z_H 0x2D#define SlaveAddress 0xD2 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改typedef unsigned char BYTE;typedef unsigned short WORD;BYTE BUF[8]; //接收数据缓存区long temp;uchar ge,shi,bai,qian,wan; //显示变量int dis_data;//变量//int temp;void delay(unsigned int k);void InitL3G4200D(uchar ); //初始化L3G4200Dvoid conversion(uint temp_data);void Single_WriteL3G4200D(uchar REG_Address,uchar REG_data); //单个写入数据uchar Single_ReadL3G4200D(uchar REG_Address); //单个读取内部寄存器数据void Delay5ms();//void Multiple_readL3G4200D(void);//------------------------------------void Delay5us();void L3G4200D_Start();void L3G4200D_Stop();void L3G4200D_SendACK(bit ack);void L3G4200D_RecvACK();void L3G4200D_SendByte(BYTE dat);BYTE L3G4200D_RecvByte();void display_x();void display_y();void display_z();//-----------------------------------//********************************************************* void conversion(uint temp_data){temp_data*=0.875;wan=temp_data/10000+0x30 ;temp_data=temp_data%10000; //取余运算qian=temp_data/1000+0x30 ;temp_data=temp_data%1000; //取余运算bai=temp_data/100+0x30 ;temp_data=temp_data%100; //取余运算shi=temp_data/10+0x30 ;temp_data=temp_data%10; //取余运算ge=temp_data+0x30;}/*******************************/void delay(unsigned int k){unsigned int i,j;for(i=0;i<k;i++){for(j=0;j<121;j++){;}}}/*****************************************************************延时5微秒(STC90C52RC@12M)不同的工作环境,需要调整此函数,注意时钟过快时需要修改当改用1T的MCU时,请调整此延时函数**************************************/void Delay5us(){_nop_();_nop_();_nop_();_nop_();}/**************************************延时5毫秒(STC90C52RC@12M)不同的工作环境,需要调整此函数当改用1T的MCU时,请调整此延时函数**************************************//*void Delay5ms(){WORD n = 560;while (n--);}*//**************************************起始信号**************************************/ void L3G4200D_Start(){SDA = 1; //拉高数据线SCL = 1; //拉高时钟线Delay5us(); //延时SDA = 0; //产生下降沿Delay5us(); //延时SCL = 0; //拉低时钟线}/**************************************停止信号**************************************/ void L3G4200D_Stop(){SDA = 0; //拉低数据线SCL = 1; //拉高时钟线Delay5us(); //延时SDA = 1; //产生上升沿Delay5us(); //延时}/**************************************发送应答信号入口参数:ack (0:ACK 1:NAK)**************************************/void L3G4200D_SendACK(bit ack){SDA = ack; //写应答信号SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线Delay5us(); //延时}/**************************************接收应答信号**************************************/void L3G4200D_RecvACK(){SCL = 1; //拉高时钟线Delay5us(); //延时while(SDA==1);SCL = 0; //拉低时钟线Delay5us(); //延时}/**************************************向IIC总线发送一个字节数据**************************************/void L3G4200D_SendByte(BYTE dat){BYTE i;for (i=0; i<8; i++) //8位计数器{SDA = dat&0x80; //送数据口dat=dat<<1;SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线Delay5us(); //延时}L3G4200D_RecvACK();}/**************************************从IIC总线接收一个字节数据**************************************/BYTE L3G4200D_RecvByte(){BYTE i;BYTE dat = 0;SDA = 1; //使能内部上拉,准备读取数据,for (i=0; i<8; i++) //8位计数器{dat <<= 1; //这里的1是00000001SCL = 1; //拉高时钟线Delay5us(); //延时dat |= SDA; //读数据SDA 00000000 or 00000001SCL = 0; //拉低时钟线Delay5us(); //延时}return dat;}//单字节写入*******************************************void Single_WriteL3G4200D(uchar REG_Address,uchar REG_data){L3G4200D_Start(); //起始信号L3G4200D_SendByte(SlaveAddress); //发送设备地址+写信号L3G4200D_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页L3G4200D_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页L3G4200D_Stop(); //发送停止信号}//单字节读取*****************************************uchar Single_ReadL3G4200D(uchar REG_Address){ uchar REG_data;L3G4200D_Start(); //起始信号L3G4200D_SendByte(SlaveAddress); //发送设备地址+写信号L3G4200D_SendByte(REG_Address); //发送存储单元地址,从0开始L3G4200D_Start(); //起始信号L3G4200D_SendByte(SlaveAddress+1); //发送设备地址+读信号REG_data=L3G4200D_RecvByte(); //读出寄存器数据L3G4200D_SendACK(1);L3G4200D_Stop(); //停止信号return REG_data;}//*************************************************/*void Multiple_readL3G4200D(void){ uchar i;L3G4200D_Start(); //起始信号L3G4200D_SendByte(SlaveAddress); //发送设备地址+写信号L3G4200D_SendByte(0x28); //发送存储单元地址L3G4200D_Start(); //起始信号L3G4200D_SendByte(SlaveAddress+1); //发送设备地址+读信号for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF{BUF[i] = L3G4200D_RecvByte()&0xFF; //BUF存储数据if (i == 5){L3G4200D_SendACK(1); //最后一个数据需要回NOACK}else{L3G4200D_SendACK(0); //回应ACK}}L3G4200D_Stop(); //停止信号Delay5ms();}*///*****************************************************************//初始化L3G4200D,根据需要请参考pdf,第27页,进行修改************************void InitL3G4200D(){Single_WriteL3G4200D(CTRL_REG1, 0x4f); // 0x0f=00001111 200hz普通模式X Y Z 启用。

单片机热电偶测温程序详解

单片机热电偶测温程序详解

引言概述:本文是关于单片机热电偶测温程序的详解第二部分。

在本文中,我们将继续深入探讨单片机热电偶测温程序的工作原理、设计方法和实施步骤。

热电偶是一种常用的温度测量传感器,具有高精度和广泛的应用范围。

通过本文的阐述,读者将能够深入了解如何在单片机系统中使用热电偶进行温度测量,并能够通过程序实现温度数据的读取和处理。

正文内容:一、热电偶工作原理1.热电效应的基本原理2.热电偶的结构和组成3.热电偶的工作原理4.热电偶的温度电压关系二、单片机热电偶测温程序设计基础1.单片机的基本概念和应用2.单片机与热电偶的接口原理3.单片机测温程序设计的基本要求4.温度测量精度的考虑因素三、程序实施步骤详解1.硬件电路的设计与搭建2.硬件接口的连接与配置3.软件开发环境的选择与配置4.温度测量算法的选择与实现5.温度测量数据的读取与显示四、热电偶测温程序的优化与改进1.传感器放大电路的设计与优化2.温度补偿算法的引入与优化3.程序运行效率的优化与改进4.温度数据的误差分析与校正5.程序的拓展与应用五、实验验证与结果分析1.实验环境与设备准备2.程序功能的验证与测试3.实验数据的分析与对比4.结果的可行性评估5.实验结果的优化与改进总结:本文详细阐述了单片机热电偶测温程序的设计和实施步骤。

通过对热电偶的工作原理、单片机接口原理和程序设计基础的介绍,读者能够了解到如何在单片机系统中应用热电偶进行温度测量。

本文还对程序实施步骤进行了详细介绍,包括硬件电路的设计与搭建、硬件接口的连接与配置、软件开发环境的选择与配置、温度测量算法的选择与实现以及温度测量数据的读取与显示。

本文也提出了热电偶测温程序的优化与改进方法,包括传感器放大电路的设计与优化、温度补偿算法的引入与优化、程序运行效率的优化与改进、温度数据的误差分析与校正以及程序的拓展与应用。

通过实验验证与结果分析,本文验证了所设计的单片机热电偶测温程序的功能和可行性,并提出了进一步优化和改进的建议。

单片机管脚短路断路测试程序

单片机管脚短路断路测试程序
eor #ffh
sta led_data
pla
rti
p0_isr:
rti
tm0_isr:
pha
phx
lda ch1
eor #ffh
sta ch1
plx
pla
rti
div0_isr:
rti
nmib_isr:
rti
.org 0000h
;=============================================
; INTERRUPT VECTOR SECTION
;=============================================
.org ffeeh
.dw div1_isr ;IV OF DIVIDER 1
nop
ora #$04
sta p0
nop
and #$fb
sta p0
dec cont_pin
lda cont_pin
cmp #$00
bne dr_595
lda p0
nop
ora #$02
sta p0
nop
and #$fd
jsr dy1ms
lda #80h
sta wdt_clr
lda P0
eor #efh;#ffh; ;读IO口,?
cmp p0_rl
bne err
lda P1
eor #$ff
cmp p1_rl
bne err
lda P2
eor #$ff
cmp p2_rl
bne err

[整理]单片机6个必做实验

[整理]单片机6个必做实验

第一部分软件实验实验一二进制到BCD码转换一、实验目的1、掌握简单的数值转换算法2、基本了解数值的各种表达方法二、实验说明单片机中的数值有各种表达方式,这是单片机的基础。

掌握各种数制之间的转换是一种基本功。

我们将给定的一个二进制数,转换成二十进制(BCD)码。

将累加器A的值拆为三个BCD码,并存入RESULT开始的三个单元,例程A赋值#123。

三、实验内容及步骤1、启动计算机,打开伟福仿真软件,进入仿真环境。

首先进行仿真器的设置,选择使用伟福软件模拟器。

2、打开TH2.ASM源程序进行编译,编译无误后,全速运行程序,打开数据窗口(DATA),点击暂停按钮,观察地址30H、31H、32H的数据变化,30H更新为01,31H更新为02,32H更新为03。

用键盘输入改变地址30H、31H、32H的值,点击复位按钮后,可再次运行程序,观察其实验效果。

修改源程序中给累加器A的赋值,重复实验,观察实验效果。

3、打开CPU窗口,选择单步或跟踪执行方式运行程序,观察CPU窗口各寄存器的变化,可以看到程序执行的过程,加深对实验的了解。

四、流程图及源程序1.源程序RESULT EQU 30HORG 0000HLJMP 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 $END2.流程图实验四程序跳转表一、实验目的1、了解程序的多分支结构2、掌握多分支结构程序的编程方法二、实验说明多分支结构是程序中常见的结构,在多分支结构的程序中,能够按调用号执行相应的功能,完成指定操作。

若给出调用号来调用子程序,一般用查表方法,查到子程序的地址,转到相应子程序。

单片机整套实验及程序(交通灯_跑马灯等)

单片机整套实验及程序(交通灯_跑马灯等)

实验1 跑马灯实验一、实验目的●初步学会Proteus ISIS和uVision2单片机集成开发环境的使用;●初步掌握采用汇编语言与C语言开发单片机系统的程序结构;●掌握80C51单片机通用I/O口的使用;●掌握单片机内部定时/计数器的使用及编程方法以及中断处理程序的编写方法。

二、实验设备及器件●硬件:PC机,HNIST-1型单片机实验系统●软件:Proteus ISIS单片机仿真环境,uVision2单片机集成开发环境三、实验内容●编写一段程序,采用P1口作为控制端口,使与P1口相接的四个发光二极管〔D1、D2、D3、D4〕按照一定的方式点亮。

如点亮方式为:先点亮D1,延时一段时间,再顺序点亮D2……D4,然后又是D4……D1,同时只能有一个灯亮;然后每隔一段时间一次使相邻两个灯亮,三个灯亮,四个灯亮,最后闪烁三次,接着循环变化。

●基于Proteus ISIS仿真环境完成上述功能的仿真。

●基于uVision2单片机集成开发环境与硬件平台完成程序的脱机运行。

四、实验原理图图3.1 跑马灯实验电路原理图电路原理图如上图3.1所示,AT89S52的P1.0~P1.3控制4个发光二极管,发光二极管按照一定次序发光,相邻发光二极管的发光时间间隔可以通过定时器控制,还可以通过软件延时实现。

五、软件流程图与参考程序●主程序流程图如下:●参考程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar aa,num,speed,flag;uchar code table[]={0x0e,0x0d,0x0b,0x07};uchar code table1[]={0x0a,0x05,0x09,0x06};uchar codetable2[]={0x0c,0x09,0x03,0x08,0x01,0x0e,0x0c,0x08,0x00};void delay(uint z)//延时函数{uint x;uchar y;for(x=z;x>0;x--)for(y=200;y>0;y--);}void init()//条件初始化函数{ flag=0;speed=10;//控制跑马灯流水速度TMOD=0x01;//中断方式TH0=(65535-50000)/256;TL0=(65536-50000)%256;//初值EA=1;//翻开总中断ET0=1;//翻开外中断0TR0=1;}void main(){init();//调用初始化函数while(1){if(flag){delay(2000);//调用延时函数for(num=0;num<4;num++)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);}for(num=3;num>0;num--)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);}for(num=0;num<4;num++)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=3;num>0;num--)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=0;num<6;num++)//两个,三个,四个跑马灯依次闪烁{P1=table2[num];delay(2000);}for(num=0;num<5;num++)//闪烁5次{P1=0xff;//全暗delay(2000);P1=0X00;//全亮delay(2000);}speed=speed-3;//变速if(speed==4){speed=10;}}}}void timer0() interrupt 1//中断函数{TH0=(65535-50000)/256;TL0=(65536-50000)%256;aa++;if(aa==speed){aa=0;flag=1;}}六、实验思考题●请用汇编指令完本钱实验内容,深刻理解汇编语言程序设计结构。

MSP430系列单片机16位ADC测试程序

MSP430系列单片机16位ADC测试程序
* 名 称:BT_ISR() BasicTimer 中断
* 功 能:1/16秒唤醒CPU一次。
* 入口参数:无
* 出口参数:无
****************************************************************************/
// W1 | |<----->| A1+ COM0-COM3|--->| 7.1Digit,4-Mux LCD |
// |_| | | +----------------------+
// +------->| A1- VREF |---+
以记录外部输入为0V和10.00V时,ADC2的实际读数,作为校准参考值。参
考《超低功耗电压表》程序。
本程序给出了多路ADC同时采样的程序处理方法,可供参考。
//=========================================================================
// 开启内部1.2V基准源, 开启缓冲器,ADC时钟选择为SMCLK/2(524KHz)
for (i = 0; i < 500; i++); // 略延迟,让基准电压稳定
SD16CCTL0 |= SD16DF+SD16GRP; // ADC0与ADC1编组,数据格式为有符号
{
while(ADC_Flag==0) LPM0; //CPU休眠,等待被采样结束唤醒
ADC_Flag=0;
ADC_Sum0+=ADC_Result0; //ADC0采样结果累加

单片机串口测试程序

单片机串口测试程序

//注意,如您使用的MCU没有那个功能,就不要操作相应的寄存器//注意,如您使用的MCU没有那那么大的扩展SRAM,就不要操作超过范围的SRAM#include<reg51.h>#include<intrins.h>sfr S2CON = 0x9A;//S2SM0,S2SM1,S2SM2,S2REN,S2TB8,SRB8,S2TI,S2RIsfr IE2 = 0xAF;//X,X,X,X,X,X,ESPI,ES2sfr S2BUF = 0x9B;sfr AUXR = 0x8e;sfr BRT = 0x9c;sfr IAP_CONTR = 0xC7;sfr CCON = 0xD8;sfr CMOD = 0xD9;sfr CL = 0xE9;sfr CH = 0xF9;sfr CCAP0L = 0xEA;sfr CCAP0H = 0xFA;sfr CCAPM0 = 0xDA;sfr CCAPM1 = 0xDB;sbit CR = 0xDE;sbit MCU_Start_Led = P1^7;sbit S2_Interrupt_Receive_Led = P1^4;//unsigned char self_command_array[4] = {0x22,0x33,0x44,0x55};#define Self_Define_ISP_Download_Command 0x22#define RELOAD_COUNT 0xfb //18.432MHz,12T,SMOD=0,9600bpsvoid serial_port_one_initial();void send_UART_one(unsigned char);void UART_one_Interrupt_Receive(void);void serial_port_two_initial();void send_UART_two(unsigned char);void UART_two_Interrupt_Receive(void);void soft_reset_to_ISP_Monitor(void);void delay(void);void display_MCU_Start_Led(void);void send_PWM(void);void main(void){unsigned int array_point = 0;unsigned char xdata Test_array_one[512] ={0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,0xef, 0xee, 0xed, 0xec, 0xeb, 0xea, 0xe9, 0xe8,0xe7, 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, 0xe1, 0xe0,0xdf, 0xde, 0xdd, 0xdc, 0xdb, 0xda, 0xd9, 0xd8,0xd7, 0xd6, 0xd5, 0xd4, 0xd3, 0xd2, 0xd1, 0xd0,0xcf, 0xce, 0xcd, 0xcc, 0xcb, 0xca, 0xc9, 0xc8,0xc7, 0xc6, 0xc5, 0xc4, 0xc3, 0xc2, 0xc1, 0xc0,0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8,0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0,0xaf, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xa9, 0xa8,0xa7, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1, 0xa0,0x9f, 0x9e, 0x9d, 0x9c, 0x9b, 0x9a, 0x99, 0x98,0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90,0x8f, 0x8e, 0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x88,0x87, 0x86, 0x85, 0x84, 0x83, 0x82, 0x81, 0x80,0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78,0x77, 0x76, 0x75, 0x74, 0x73, 0x72, 0x71, 0x70,0x6f, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x69, 0x68,0x67, 0x66, 0x65, 0x64, 0x63, 0x62, 0x61, 0x60,0x5f, 0x5e, 0x5d, 0x5c, 0x5b, 0x5a, 0x59, 0x58,0x57, 0x56, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50,0x4f, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48,0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41, 0x40,0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38,0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30,0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28,0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20,0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18,0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10,0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08,0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 };unsigned char i = 0;serial_port_one_initial(); //串口1初始化// serial_port_two_initial(); //串口2初始化display_MCU_Start_Led(); //点亮发光二极管表示单片机开始工作// send_UART_two(0x55); //串口2发送数据表示单片机串口正常工作// send_UART_two(0xaa); //串口2发送数据表示单片机串口正常工作/*for(array_point=0; array_point<512; array_point++){send_UART_two(Test_array_one[array_point]);}*/send_UART_one(0x34); //串口1发送数据表示单片机串口正常工作send_UART_one(0xa7); //串口1发送数据表示单片机串口正常工作for(array_point=0; array_point<512; array_point++){send_UART_one(Test_array_one[array_point]);}// send_PWM(); //6kHz PWM, 50% dutywhile(1);}void serial_port_one_initial(){SCON = 0x50; //0101,0000 8位可变波特率,无奇偶校验位// TMOD = 0x21; //0011,0001 设置顶时器1为8位自动重装计数器// TH1 = RELOAD_COUNT; //设置定时器1自动重装数// TL1 = RELOAD_COUNT;// TR1 = 1; //开定时器1BRT = RELOAD_COUNT;// BRTR = 1, S1BRS = 1, EXTRAM = 1 ENABLE EXTRAMAUXR = 0x11; // T0x12,T1x12,UART_M0x6,BRTR,S2SMOD,BRTx12,EXTRAM,S1BRSES = 1; //允许串口中断EA= 1; //开总中断}void serial_port_two_initial(){//sfr SCON = 0x98;//SM0,SM1,SM2,REN,TB8,RB8,TI,RI//sfr S2CON = 0x9A;//S2SM0,S2SM1,S2SM2,S2REN,S2TB8,S2RB8,S2TI,S2RI//sfr S2BUF = 0x9B;//sfr IE2 = 0xAF;//X,X,X,X,X,X,ESPI,ES2S2CON = 0x50; //0101,0000 8位可变波特率,无奇偶校验位,允许接收BRT = RELOAD_COUNT;// BRTR = 1, S1BRS = 1, EXTRAM = 0 ENABLE EXTRAMAUXR = 0x11; // T0x12,T1x12,UART_M0x6,BRTR,S2SMOD,BRTx12,EXTRAM,S1BRS// ES = 1; //允许串口1中断// ES2 = 1IE2 = 0x01; //允许串口2中断,ES2=1EA= 1; //开总中断}void send_UART_one(unsigned char i){ES = 0; //关串口中断TI = 0; //清零串口发送完成中断请求标志SBUF = i;while(TI ==0); //等待发送完成TI = 0; //清零串口发送完成中断请求标志ES = 1; //允许串口中断}void send_UART_two(unsigned char i){//sfr SCON = 0x98;//SM0,SM1,SM2,REN,TB8,RB8,TI,RI//sfr S2CON = 0x9A;//S2SM0,S2SM1,S2SM2,S2REN,S2TB8,S2RB8,S2TI,S2RI//sfr S2BUF = 0x9B;//sfr IE2 = 0xAF;//X,X,X,X,X,X,ESPI,ES2unsigned char temp = 0;// ES = 0; //关串口1中断IE2 = 0x00; //关串口2中断,es2=0// TI = 0; //清零串口1发送完成中断请求标志S2CON = S2CON & 0xFD; //B'11111101,清零串口2发送完成中断请求标志// SBUF = i;S2BUF = i;// while(TI ==0); //等待发送完成do{temp = S2CON;temp = temp & 0x02;}while(temp==0);// TI = 0; //清零串口发送完成中断请求标志S2CON = S2CON & 0xFD; //B'11111101,清零串口2发送完成中断请求标志// ES = 1; //允许串口1中断// ES2 = 1IE2 = 0x01; //允许串口2中断,ES2=1}void UART_one_Interrupt_Receive(void) interrupt 4{unsigned char k = 0;if(RI==1){RI = 0;k = SBUF;if(k==Self_Define_ISP_Download_Command) //是自定义下载命令{delay(); //延时1秒就足够了delay(); //延时1秒就足够了soft_reset_to_ISP_Monitor(); //软复位到系统ISP监控区}send_UART_one(k+1);}else{TI = 0;}}void UART_two_Interrupt_Receive(void) interrupt 8{//sfr SCON = 0x98;//SM0,SM1,SM2,REN,TB8,RB8,TI,RI//sfr S2CON = 0x9A;//S2SM0,S2SM1,S2SM2,S2REN,S2TB8,S2RB8,S2TI,S2RI//sfr S2BUF = 0x9B;//sfr IE2 = 0xAF;//X,X,X,X,X,X,ESPI,ES2unsigned char k = 0;k = S2CON ;k = k & 0x01;//if(S2RI==1)if(k==1){//RI = 0;S2CON = S2CON & 0xFE; //1111,1110S2_Interrupt_Receive_Led = 0;k = S2BUF;if(k==Self_Define_ISP_Download_Command) //是自定义下载命令{delay(); //延时1秒就足够了delay(); //延时1秒就足够了soft_reset_to_ISP_Monitor(); //软复位到系统ISP监控区}send_UART_two(k+1);}else{//TI = 0;S2CON = S2CON & 0xFD; //1111,1101}}void soft_reset_to_ISP_Monitor(void){IAP_CONTR = 0x60; //0110,0000 软复位到系统ISP监控区}void delay(void){unsigned int j = 0;unsigned int g = 0;for(j=0;j<5;j++){for(g=0;g<60000;g++){_nop_();_nop_();_nop_();_nop_();_nop_();}}}void display_MCU_Start_Led(void){//sbit MCU_Start_Led = P1^7;unsigned char i = 0;for(i=0;i<1;i++){MCU_Start_Led = 0; //顶亮MCU开始工作指示灯delay();MCU_Start_Led = 1; //熄灭MCU开始工作指示灯delay();MCU_Start_Led = 0; //顶亮MCU开始工作指示灯}}void send_PWM(void){CMOD = 0x00; // CIDL - - - - CPS1 CPS0 ECF Setup PCA Timer// CPS1 CPS0 = 00, Fosc/12 is PCA/PWM clock// 18432000/12/256 = 6000CL = 0x00;CH = 0x00;CCAP0L = 0x80; //Set the initial value same as CCAP0HCCAP0H = 0x80; //50% Duty CycleCCAPM0 = 0x42; //0100,0010 Setup PCA module 0 in 8BIT PWM, P3.7 CR = 1; //启动PCA/PWM 定时器}。

QMC5883L-IIC测试程序

QMC5883L-IIC测试程序

QMC5883L-IIC测试程序//******************************//QMC5883L IIC测试程序//使用单片机STC15W408AS//晶振频率:11.0592M//QMC5883是一款国产三轴磁阻传感器//其内部寄存器设置与霍尼韦尔公司生产的HMC5883 //不尽相同,不能直接套用HMC5883的测试程序,否//则无法获得角度数据。

//下面给出的测试程序可以通过串口助手//在PC机上直接读出QMC5883输出的角度数据。

//宜昌三峡电院电子科技创新协会//******************************#include "STC15F2K60S2.H"#include "intrins.h"#include "math.h"#include "stdio.h"#define Slave_Address 0x1a //HMC5883为0x3c typedef unsigned int u16;typedef unsigned char u8;u8 BUF[8]=0;sbit SCL=P1^2; //IIC时钟线sbit SDA=P1^3; //IIC数据线void Delay_5us();void Delay(u16 t);void InitUart();void QMC5883_Start();void QMC5883_Stop();void QMC5883_SendACK(bit ack);bit QMC5883_RecvACK();//void QMC5883_SendByte(u8 dat); //u8 QMC5883_RecvByte();//void Single_Write_QMC5883(u8 REG_Address,u8 REG_data);//u8 Single_Read_QMC5883(u8 REG_Address);void Multiple_Read_QMC5883(void);void Init_QMC5883();//STC15W408AS无定时器1,只能用定时器2作串口波特率发生器void InitUart(){SCON = 0x50;AUXR |= 0x01;AUXR &= 0xFB;T2L = 0xE8;T2H = 0xFF;AUXR |= 0x10;ES = 1;EA = 1;TI=1;}void Delay(u16 t){u16 i,j;for(i=t;i>0;i--)for(j=121;j>0;j--);}void Delay_5us(){u8 x;x = 20;while (--x);}/************************************** 起始信号/**************************************向IIC总线发送一个字节数据**************************************/void QMC5883_SendByte(u8 dat){u8 i;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位SDA = CY; //送数据口SCL = 1; //拉高时钟线Delay_5us(); //延时SCL = 0; //拉低时钟线Delay_5us(); //延时}QMC5883_RecvACK();}/**************************************从IIC总线接收一个字节数据**************************************/u8 QMC5883_RecvByte()u8 i;u8 dat = 0;SDA = 1; //使能内部上拉,准备读取数据,for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL = 1; //拉高时钟线Delay_5us(); //延时dat |= SDA; //读数据SCL = 0; //拉低时钟线Delay_5us(); //延时}return dat;}//************************写入单字节数据***************************void Single_Write_QMC5883(u8 REG_Address,u8 REG_data) {QMC5883_Start(); //起始信号QMC5883_SendByte(Slave_Address); //发送设备地址+写信号QMC5883_SendByte(REG_Address); //内部寄存器地址,请参考中文pdfQMC5883_SendByte(REG_data); //内部寄存器数据,请参考中文pdfQMC5883_Stop(); //发送停止信号}//************************读取单字节数据*************************//u8 Single_Read_QMC5883(u8 REG_Address)//{// u8 REG_data;// QMC5883_Start(); //起始信号// QMC5883_SendByte(Slave_Address); //发送设备地址+写信号// QMC5883_SendByte(REG_Address); //发送存储单元地址,从0开始// QMC5883_Start(); //起始信号// QMC5883_SendByte(Slave_Address+1); //发送设备地址+读信号// REG_data=QMC5883_RecvByte(); //读出寄存器数据// QMC5883_SendACK(1);// QMC5883_Stop(); //停止信号// return REG_data;//}//**************************************************** **//连续读出QMC5883内部角度数据,地址范围0x00~0x05//**************************************************** **void Multiple_Read_QMC5883(void){u8 i;QMC5883_Start(); //起始信号QMC5883_SendByte(Slave_Address); //发送设备地址+写信号QMC5883_SendByte(0x00); //发送存储单元地址,从0x00开始;HMC5883从0x03开始QMC5883_Start(); //起始信号QMC5883_SendByte(Slave_Address+1); //发送设备地址+读信号for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF{BUF[i] = QMC5883_RecvByte(); //BUF[0]存储数据if (i == 5){QMC5883_SendACK(1); //最后一个数据需要回非应答NOACK}else{QMC5883_SendACK(0); //应答ACK}}QMC5883_Stop(); //停止信号Delay(5);}//初始化QMC5883,注意与HMC5883的区别void Init_QMC5883(){Single_Write_QMC5883(0x09,0x0d); //控制寄存器配置Single_Write_QMC5883(0x0b,0x01); //设置清除时间寄存器Single_Write_QMC5883(0x20,0x40); //Single_Write_QMC5883(0x21,0x01); //}void main(){// u16 i;int X=0,Y=0,Z=0;double Angle_XY=0,Angle_XZ=0,Angle_YZ=0;InitUart();Delay(200);//Init_Lcd();Init_QMC5883();Delay(300);while(1){Multiple_Read_QMC5883();//连续读取三轴角度数据,存储在BUF中X=BUF[1] << 8 | BUF[0]; //Combine MSB and LSB of X Data output register 最高有效位Y=BUF[3] << 8 | BUF[2]; //Combine MSB and LSB of Y Data output registerZ=BUF[5] << 8 | BUF[4]; //Combine MSB and LSB of Z Data output registerif(X>0x7fff) X-=0xffff;if(Y>0x7fff) Y-=0xffff;if(Z>0x7fff) Z-=0xffff;//printf("X=%iV\n",X); //输出int型数据//Delay(2000);//printf("Y=%iV\n",Y); //输出int型数据//Delay(2000);// printf("Z=%iV\n",Z); //输出int型数据// Delay(2000);Angle_XY= atan2((double)Y,(double)X) * (180 / 3.14159265) + 180; //计算XY平面角度//Angle_XY*=10;printf("XY=%fD\n",Angle_XY); //输出float型数据Delay(1000);Angle_XZ= atan2((double)Z,(double)X) * (180 / 3.14159265) + 180; //计算XZ平面角度//Angle_XZ*=10;printf("XZ=%fD\n",Angle_XZ); //输出float型数据Delay(1000);Angle_YZ= atan2((double)Z,(double)Y) * (180 / 3.14159265) + 180; //计算YZ平面角度//Angle_YZ*=10;printf("YZ=%fD\n",Angle_YZ); //输出float型数据Delay(1000);}}。

单片机最小系统的测试

单片机最小系统的测试


2、误码仪的工作原理
时钟信号 发生器 码型发生发生器
(图案选择)
误码插入
接口电路
(a) 误码仪发送部分原理图
开 关
码型发生发生器
(图案选择)
比特误码检测
输出错误脉冲 同步检测 输入信号
(b) 误码仪接收部分原理图
图9.23
ቤተ መጻሕፍቲ ባይዱ
误码仪工作原理框图
• 3、误码仪的主要技术指标
• • • • • • • • • • • • • (1)发送机 •比特率:内部时钟的比特率。 •精度:≤±2×10-6(在室温下) •偏差:可发送±100×10-6的频偏。 •码型图案:包括伪随机序列、人工码和零码插入。 •插入误码:指bit或码字误码。 •输出码:CMI、RZ、NRZ、AMI、HDB3码。 •抖动调制:包括调制频率和灵敏度。 (2)接收机 •比特率:内部时钟的比特率。 •时钟输入:外部输入。 •码型图案:包括伪随机序列、人工码和零码插入。 •误码测量:包括测量方式和测量项目。如方式有比特误码、码组 误码、码块误码等;测量项目则有误码率、误码计数、误码秒、 不误码秒等 • •状态显示:通常有无信号、失步、AIS、<100误码等4种显示。 • •抖动测量:包括测量范围和测量内容。
限定条件
与门
限定条件 触发信号
触发 识别 数据流
图9.7 限定触发信号产生
• 6、逻辑分析仪的显示方式
• (1)状态表显示
(2)反汇编显示

• 6、逻辑分析仪的显示方式 • (3)定时图显示
• (4)图解显示
• 6、逻辑分析仪的显示方式 • (5)影射图显示 •
(6)分解模块显示 高层次的逻辑分析仪
现代逻辑分析仪还有其它一些触发方式,随着数字系 统及微机系统的发展,对逻辑分析仪的触发方式将提出了 越来越高的要求,新的触发方式也会出现。在使用时,应 注意正确选择触发方式。

QMC5883L-IIC测试程序文件

QMC5883L-IIC测试程序文件

//******************************//QMC5883L IIC测试程序//使用单片机STC15W408AS//晶振频率:11.0592M//QMC5883是一款国产三轴磁阻传感器//其部寄存器设置与霍尼韦尔公司生产的HMC5883//不尽相同,不能直接套用HMC5883的测试程序,否//则无法获得角度数据。

//下面给出的测试程序可以通过串口助手//在PC机上直接读出QMC5883输出的角度数据。

//三峡电院电子科技创新协会//******************************#include "STC15F2K60S2.H"#include "intrins.h"#include "math.h"#include "stdio.h"#define Slave_Address 0x1a //HMC5883为0x3ctypedef unsigned int u16;typedef unsigned char u8;u8 BUF[8]=0;sbit SCL=P1^2; //IIC时钟线sbit SDA=P1^3; //IIC数据线void Delay_5us();void Delay(u16 t);void InitUart();void QMC5883_Start();void QMC5883_Stop();void QMC5883_SendACK(bit ack);bit QMC5883_RecvACK();//void QMC5883_SendByte(u8 dat); //u8 QMC5883_RecvByte();//void Single_Write_QMC5883(u8 REG_Address,u8 REG_data);//u8 Single_Read_QMC5883(u8 REG_Address);void Multiple_Read_QMC5883(void);void Init_QMC5883();//STC15W408AS无定时器1,只能用定时器2作串口波特率发生器void InitUart(){SCON = 0x50;AUXR |= 0x01;AUXR &= 0xFB;T2L = 0xE8;T2H = 0xFF;AUXR |= 0x10;ES = 1;TI=1;}void Delay(u16 t){u16 i,j;for(i=t;i>0;i--)for(j=121;j>0;j--);}void Delay_5us(){u8 x;x = 20;while (--x);}/**************************************起始信号**************************************/ void QMC5883_Start(){SDA = 1; //拉高数据线SCL = 1; //拉高时钟线Delay_5us(); //延时SDA = 0; //产生下降沿Delay_5us(); //延时SCL = 0; //拉低时钟线}/**************************************停止信号**************************************/ void QMC5883_Stop(){SDA = 0; //拉低数据线SCL = 1; //拉高时钟线Delay_5us(); //延时SDA = 1; //产生上升沿Delay_5us(); //延时}/**************************************发送应答信号入口参数:ack (0:ACK 1:NAK)**************************************/ void QMC5883_SendACK(bit ack){SCL = 0; //拉低时钟线Delay_5us(); //延时}/**************************************接收应答信号**************************************/bit QMC5883_RecvACK(){SCL = 1; //拉高时钟线Delay_5us(); //延时CY = SDA; //进位标志读应答信号SCL = 0; //拉低时钟线Delay_5us(); //延时return CY;}/**************************************向IIC总线发送一个字节数据**************************************/void QMC5883_SendByte(u8 dat){u8 i;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位SDA = CY; //送数据口SCL = 1; //拉高时钟线Delay_5us(); //延时SCL = 0; //拉低时钟线Delay_5us(); //延时}QMC5883_RecvACK();}/**************************************从IIC总线接收一个字节数据**************************************/u8 QMC5883_RecvByte(){u8 i;u8 dat = 0;SDA = 1; //使能部上拉,准备读取数据, for (i=0; i<8; i++) //8位计数器{dat |= SDA; //读数据SCL = 0; //拉低时钟线Delay_5us(); //延时}return dat;}//************************写入单字节数据***************************void Single_Write_QMC5883(u8 REG_Address,u8 REG_data){QMC5883_Start(); //起始信号QMC5883_SendByte(Slave_Address); //发送设备地址+写信号QMC5883_SendByte(REG_Address); //部寄存器地址,请参考中文pdfQMC5883_SendByte(REG_data); //部寄存器数据,请参考中文pdfQMC5883_Stop(); //发送停止信号}//************************读取单字节数据*************************//u8 Single_Read_QMC5883(u8 REG_Address)//{// u8 REG_data;// QMC5883_Start(); //起始信号// QMC5883_SendByte(Slave_Address); //发送设备地址+写信号// QMC5883_SendByte(REG_Address); //发送存储单元地址,从0开始// QMC5883_Start(); //起始信号// QMC5883_SendByte(Slave_Address+1); //发送设备地址+读信号// REG_data=QMC5883_RecvByte(); //读出寄存器数据// QMC5883_SendACK(1);// QMC5883_Stop(); //停止信号// return REG_data;//}//******************************************************//连续读出QMC5883部角度数据,地址围0x00~0x05//******************************************************void Multiple_Read_QMC5883(void){u8 i;QMC5883_Start(); //起始信号QMC5883_SendByte(Slave_Address); //发送设备地址+写信号QMC5883_SendByte(0x00); //发送存储单元地址,从0x00开始;HMC5883从0x03开始QMC5883_Start(); //起始信号QMC5883_SendByte(Slave_Address+1); //发送设备地址+读信号for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF{BUF[i] = QMC5883_RecvByte(); //BUF[0]存储数据QMC5883_SendACK(1); //最后一个数据需要回非应答NOACK }else{QMC5883_SendACK(0); //应答ACK}}QMC5883_Stop(); //停止信号Delay(5);}//初始化QMC5883,注意与HMC5883的区别void Init_QMC5883(){Single_Write_QMC5883(0x09,0x0d); //控制寄存器配置Single_Write_QMC5883(0x0b,0x01); //设置清除时间寄存器Single_Write_QMC5883(0x20,0x40); //Single_Write_QMC5883(0x21,0x01); //}void main(){// u16 i;int X=0,Y=0,Z=0;double Angle_XY=0,Angle_XZ=0,Angle_YZ=0;InitUart();Delay(200);//Init_Lcd();Init_QMC5883();Delay(300);while(1){Multiple_Read_QMC5883();//连续读取三轴角度数据,存储在BUF中X=BUF[1] << 8 | BUF[0]; //Combine MSB and LSB of X Data output register 最高有效位Y=BUF[3] << 8 | BUF[2]; //Combine MSB and LSB of Y Data output registerZ=BUF[5] << 8 | BUF[4]; //Combine MSB and LSB of Z Data output registerif(X>0x7fff) X-=0xffff;if(Y>0x7fff) Y-=0xffff;if(Z>0x7fff) Z-=0xffff;//printf("X=%iV\n",X); //输出int型数据//printf("Y=%iV\n",Y); //输出int型数据//Delay(2000);// printf("Z=%iV\n",Z); //输出int型数据// Delay(2000);Angle_XY= atan2((double)Y,(double)X) * (180 / 3.14159265) + 180; //计算XY平面角度//Angle_XY*=10;printf("XY=%fD\n",Angle_XY); //输出float型数据Delay(1000);Angle_XZ= atan2((double)Z,(double)X) * (180 / 3.14159265) + 180; //计算XZ平面角度//Angle_XZ*=10;printf("XZ=%fD\n",Angle_XZ); //输出float型数据Delay(1000);Angle_YZ= atan2((double)Z,(double)Y) * (180 / 3.14159265) + 180; //计算YZ平面角度//Angle_YZ*=10;printf("YZ=%fD\n",Angle_YZ); //输出float型数据Delay(1000);}}。

单片机课程设计测速

单片机课程设计测速

单片机课程设计测速一、课程目标知识目标:1. 理解单片机的基本原理和功能,掌握测速系统的设计方法。

2. 学会使用单片机及相关传感器进行速度检测,并完成数据采集与处理。

3. 掌握单片机编程技术,实现测速系统的实时显示与控制。

技能目标:1. 能够运用已学知识,独立设计并搭建单片机测速系统。

2. 培养学生动手实践能力,熟练操作单片机及相关设备,解决实际测速问题。

3. 提高学生的编程能力,使其能够编写出高效、稳定的测速程序。

情感态度价值观目标:1. 培养学生对单片机及测速技术的兴趣,激发其探索精神和创新意识。

2. 培养学生团队合作精神,提高沟通与协作能力。

3. 强化学生对工程实践的责任感,使其认识到测速技术在现实生活中的应用价值。

本课程针对单片机课程设计测速,结合学生年级特点,注重理论与实践相结合,旨在提高学生的知识水平、动手能力和创新能力。

课程目标具体、可衡量,既符合教学实际,又与课本内容紧密相关,为后续的教学设计和评估提供明确方向。

二、教学内容本章节教学内容主要包括以下三个方面:1. 单片机原理与测速系统设计基础- 理解单片机的工作原理、内部结构及功能。

- 学习测速系统的基本组成、原理及分类。

- 掌握测速传感器的工作原理及其在单片机测速系统中的应用。

2. 单片机编程与测速程序设计- 学习单片机编程语言(如C语言)的基本语法和编程技巧。

- 掌握中断、定时器等单片机资源在测速程序中的应用。

- 设计并编写测速程序,实现速度的实时显示与控制。

3. 实践操作与项目实施- 学习搭建单片机测速系统的硬件电路。

- 实践操作,调试并优化测速程序。

- 分组合作,完成单片机测速项目的设计、实施与展示。

教学内容与课本章节紧密结合,按照教学大纲安排和进度,系统地组织教学活动。

通过本章节学习,使学生全面掌握单片机测速技术的相关知识,提高实际操作和编程能力。

三、教学方法本章节将采用以下多样化的教学方法,以激发学生的学习兴趣和主动性:1. 讲授法:通过教师系统的讲解,使学生掌握单片机原理、测速系统设计和编程基础等理论知识。

单片机的测试与验证方法与工具推荐

单片机的测试与验证方法与工具推荐

单片机的测试与验证方法与工具推荐概述:单片机(Microcontroller,缩写为MCU)是嵌入式系统中广泛使用的一种基本组件。

它集成了微处理器、存储器和各种输入输出接口,用于控制电子设备的各个功能。

在单片机的设计和开发过程中,测试和验证是至关重要的环节,旨在确保单片机的功能正常、性能稳定并符合设计要求。

本文将介绍单片机的测试与验证方法,并推荐一些测试工具,以帮助开发人员提高开发效率和产品质量。

一、测试方法1.静态测试静态测试主要通过对单片机的硬件设计进行分析和验证,以确保电路设计的正确性和可靠性。

主要包括以下几种方法:-电路图分析:仔细分析电路设计图,检查元件的连接、选型和布局是否符合要求。

-仿真测试:使用仿真软件模拟电路工作情况,验证电路的功能和性能参数是否符合设计要求。

-PCB布局分析:对PCB板的布局进行分析,检查电源和信号线的走向是否合理,是否存在潜在的干扰问题。

-电磁兼容性(EMC)测试:通过EMC测试验证单片机设计是否满足电磁兼容性要求,防止设备之间的电磁干扰。

2.动态测试动态测试主要通过对单片机的软件和固件进行验证,以确保单片机的功能和性能符合设计要求。

主要包括以下几种方法:-功能测试:通过加载和运行测试程序,验证单片机的各项功能是否正常工作,包括输入输出、定时器、通信接口等。

-性能测试:对单片机进行压力测试,测试其在不同负载和运行条件下的性能表现,如处理速度、响应时间等。

-电源测试:测试单片机在不同电源供电条件下的稳定性和功耗情况,包括静态功耗和动态功耗。

-通信测试:利用通信接口,与外部设备进行通信测试,验证单片机与外部设备的数据传输是否正常。

3.可靠性测试可靠性测试旨在验证单片机在长时间运行和各种环境下的稳定性和可靠性。

主要包括以下几种方法:-温度测试:将单片机置于不同温度环境下,测试其在不同温度条件下的性能和稳定性。

-湿度测试:将单片机置于高湿度环境下,测试其在高湿度条件下的可靠性和防护性能。

QMC5883L-IIC测试程序

QMC5883L-IIC测试程序

//******************************//QMC5883L IIC 测试程序//使用单片机STC15W408AS//晶振频率:11.0592M//QMC5883 是一款国产三轴磁阻传感器//其内部寄存器设置与霍尼韦尔公司生产的HMC5883//不尽相同,不能直接套用HMC5883 的测试程序,否//则无法获得角度数据。

//下面给出的测试程序可以通过串口助手//在PC 机上直接读出QMC5883 输出的角度数据。

//宜昌三峡电院电子科技创新协会//******************************#include "STC15F2K60S2.H"#include "intrins.h"#include "math.h"#include "stdio.h"#define Slave_Address 0x1a //HMC5883 为0x3c typedef unsigned int u16;typedef unsigned char u8;u8 BUF[8]=0;sbit SCL=P1A2; 〃IIC 时钟线sbit SDA=P1A3; //IIC 数据线void Delay_5us();void Delay(u16 t);void InitUart();void QMC5883_Start();void QMC5883_Stop();void QMC5883_SendACK(bit ack);bit QMC5883_RecvACK();//void QMC5883_SendByte(u8 dat); //u8 QMC5883_RecvByte();//void Single_Write_QMC5883(u8 REG_Address,u8 REG_data);//u8 Single_Read_QMC5883(u8 REG_Address);void Multiple_Read_QMC5883(void);void Init_QMC5883();//STC15W408AS 无定时器1,只能用定时器2作串口波特率发生器void InitUart(){SCON = 0x50;AUXR |= 0x01;AUXR &= 0xFB;T2L = 0xE8;T2H = 0xFF;AUXR |= 0x10;ES = 1;EA = 1;TI=1;void Delay(u16 t){u16 i,j; for(i=t;i>0;i--) for(j=121;j>0;j--); }void Delay_5us(){u8 x;x = 20; while (--x);}/**************************************起始信号**************************************/void QMC5883_Start(){SDA = 1;SCL = 1;Delay_5us();SDA = 0;Delay_5us();SCL = 0;}//拉高数据线//拉高时钟线//延时//产生下降沿//延时//拉低时钟线停止信号************************************ void QMC5883_Stop(){SDA = 0;SCL = 1;Delay_5us();SDA = 1;Delay_5us(); }//拉低数据线//拉高时钟线//延时//产生上升沿//延时/**************************************发送应答信号入口参数:ack (0:ACK 1:NAK)**************************************/void QMC5883_SendACK(bit ack){SDA = ack; //写应答信号/************************************** 向 IIC 总线发送一个字节数据**************************************/ void QMC5883_SendByte(u8 dat) {u8 i;/**************************************从 IIC 总线接收一个字节数据**************************************/u8 QMC5883_RecvByte(){u8 i;u8 dat = 0;SDA = 1;//使能内部上拉 ,准备读取数据 for (i=0; i<8; i++) //8 位计数器{dat <<= 1;SCL = 1;Delay_5us();SCL = 0;Delay_5us();}//拉高时钟线 //延时 //拉低时钟线 //延时 ************************************接收应答信号 ************************************bit QMC5883_RecvACK(){SCL = 1;Delay_5us();CY = SDA;SCL = 0;Delay_5us();return CY;}//拉高时钟线 //延时 // 进位标志 读应答信号 //拉低时钟线 //延时 for (i=0; i<8; i++){ dat <<= 1; SDA = CY; SCL = 1; Delay_5us();SCL = 0;Delay_5us();}QMC5883_RecvACK();//8 位计数器//移出数据的最高位 //送数据口 //拉高时钟线 //延时 //拉低时钟线 //延时SCL = 1; Delay_5us(); dat|= SDA;SCL = 0;Delay_5us(); } return dat;}void Single_Write_QMC5883(u8 REG_Address,u8 REG_data){QMC5883_Start();QMC5883_SendByte(Slave_Address);QMC5883_SendByte(REG_Address);QMC5883_SendByte(REG_data);QMC5883_Stop();}//起始信号 // 发送设备地址 +写信号 //内部寄存器地址,请参考中文 pdf //内部寄存器数据,请参考中文 pdf //发送停止信号//* *********************** 写入单字节数据 ***************************//* *********************** 读取单字节数据 ************************* //u8 Single_Read_QMC5883(u8 REG_Address) //{ // u8 REG_data;// QMC5883_Start(); // QMC5883_SendByte(Slave_Address); // QMC5883_SendByte(REG_Address); // QMC5883_Start(); // QMC5883_SendByte(Slave_Address+1);// REG_data=QMC5883_RecvByte();// QMC5883_SendACK(1); // QMC5883_Stop(); // return REG_data; //} //起始信号 // 发送设备地址 +写信号 //发送存储单元地址,从 0 开始 //起始信号 // 发送设备地址 +读信号 //读出寄存器数据 //停止信号//* *****************************************************//连续读出 QMC5883 内部角度数据,地址范围 0x00~0x05 //* *****************************************************void Multiple_Read_QMC5883(void) { u8 i;QMC5883_Start();QMC5883_SendByte(Slave_Address); QMC5883_SendByte(0x00); QMC5883_Start();QMC5883_SendByte(Slave_Address+1); for (i=0; i<6; i++) //起始信号 // 发送设备地址 +写信号 //发送存储单元地址,从 0x00开始;HMC5883从0x03开始 //起始信号 //发送设备地址 +读信号 // 连续读取 6 个地址数据,存储中 BUF { BUF[i] = QMC5883_RecvByte();//BUF[0] 存储数据if (i == 5) //拉高时钟线 //延时 //读数据 //拉低时钟线 //延时{}else{QMC5883_SendACK(0); // 应答 ACK}}QMC5883_Stop(); // 停止信号Delay(5);}//初始化 QMC5883 ,注意与 HMC5883 的区别void Init_QMC5883(){Single_Write_QMC5883(0x09,0x0d); //控制寄存器配置Single_Write_QMC5883(0x0b,0x01); //设置清除时间寄存器Single_Write_QMC5883(0x20,0x40); //Single_Write_QMC5883(0x21,0x01); //}void main(){// u16 i;int X=0,Y=0,Z=0;double Angle_XY=0,Angle_XZ=0,Angle_YZ=0;InitUart();Delay(200);//Init_Lcd();Init_QMC5883();Delay(300);while(1){Multiple_Read_QMC5883();// 连续读取三轴角度数据,存储在 BUF 中X=BUF[1] << 8 | BUF[0]; //Combine MSB and LSB of X Data output registerY=BUF[3] << 8 | BUF[2]; //Combine MSB and LSB of Y Data output registerZ=BUF[5] << 8 | BUF[4]; //Combine MSB and LSB of Z Data output registerif(X>0x7fff) X-=0xffff;if(Y>0x7fff) Y-=0xffff;if(Z>0x7fff) Z-=0xffff;//printf("X=%iV\n",X); // 输出 int 型数据//Delay(2000);//printf("Y=%iV\n",Y); // 输出 int 型数据//Delay(2000);// printf("Z=%iV\n",Z); // 输出 int 型数据// Delay(2000); QMC5883_SendACK(1); // 最后一个数据需要回非应答 NOACK 最高有效位Angle_XY= atan2((double)Y ,(double)X) * (180 / 3.14159265) + 180; // 计算XY 平面角度//Angle_XY*=10;printf("XY=%fD\n",Angle_XY); //输出float 型数据Delay(1000);Angle_XZ= atan2((double)Z,(double)X) * (180 / 3.14159265) + 180; // 计算XZ 平面角度//Angle_XZ*=10;printf("XZ=%fD\n",Angle_XZ); //输出float 型数据Delay(1000);Angle_YZ= atan2((double)Z,(double)Y) * (180 / 3.14159265) + 180; // 计算YZ 平面角度//Angle_YZ*=10;printf("YZ=%fD\n",Angle_YZ); //输出float 型数据Delay(1000);}}。

51单片机夏普第二代PM测试程序

51单片机夏普第二代PM测试程序

#include <reg52.h>#include<intrins.h>#include<stdio.h>#define uchar unsigned char#define uint unsigned intuchar TxBuf[32];sbit RS = P3^5;//并行指令,数据选择信号sbit RW = P3^6;//读写信号sbit EN = P3^4;//并行使能信号sbit PSB = P3^7;//并串口选择信号sbit wela=P2^6;sbit dula=P2^7;sbit LED=P3^0;//粉尘传感器控制接口sbit AD0832_CLK=P2^1; //时钟置低平//时钟12Mhz,整个转换时间为224us //使用芯片准备(参考PDF时序图)sbit AD0832_DI=P2^2; //开始信号为高电平sbit AD0832_CS=P2^0 ;sbit SET=P2^3;//按键接口sbit ADD=P2^4;sbit DEC=P2^5;sbit RST=P3^1;sbit LED1=P1^0;//绿sbit LED2=P1^1;//黄sbit LED3=P1^2;//红sbit BEEP=P1^3;//蜂鸣器接口uchar set_st,mm=0,count=0;uint DUST_SET=35;//固体颗粒物的阀值uchar Flag=0;//定义标志float DUST_Value;uint DUST;uchar abc;uchar ADC_Get[10]={0};//定义AD采样数组uchar code tab0[]="pm2.5:";//6uchar code tab1[]="报警阀值:";//9void delay(uint z)//ms延时{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*******12864操作*******/bit check_busy(){bit temp;RS = 0;RW = 1;EN = 1;delay(5);temp = (bit)(P0&0x80); //按位与操作EN = 0;return (temp);}void write_data(uchar dat){while(check_busy()); //temp==0时不忙,则跳出执行下面程序RS = 1;RW = 0;EN = 0;P0 = dat;delay(5);EN = 1;delay(5);EN = 0;}void write_cmd(uchar cmd){while(check_busy()); //temp==0时不忙,则跳出执行下面程序RS = 0;RW = 0;EN = 0;delay(5);P0 = cmd;delay(5);EN = 1;delay(5);EN = 0;}/*void lcd_pos(uchar X,uchar Y){uchar pos;if (X==1){X=0x80;}else if (X==2 ){X=0x90;}else if (X==3 ){X=0x88;}else if (X==4 ){X=0x98;}pos=X+Y;write_cmd(pos); //显示地址}*/void lcd_write(){uchar i,j;write_cmd(0x88);for(i=0;i<7;i++){write_data(tab0[i]);delay(1);}write_cmd(0x98);for(j=0;j<10;j++){write_data(tab1[j]);delay(1);}}void LCD_init(){PSB = 1;delay(5);write_cmd(0x34);//扩充指令delay(5);write_cmd(0x30);//基本指令delay(5);write_cmd(0x0c);//显示开关光标delay(5);write_cmd(0x01);//清屏delay(5);}/****************显示函数********************/ void disp(uint Data)//PM2.5值显示{uint Temp;Temp=Data;TxBuf[1]=Temp/1000+0x30;//千位Temp%=1000;TxBuf[2]=Temp/100+0x30;//百位Temp%=100;TxBuf[3]=Temp/10+0x30;//十位TxBuf[4]=Temp%10+0x30;//个位,分离出四位显示write_cmd(0x8b);write_data(TxBuf[1]);write_data(TxBuf[2]);write_cmd(0x8c);write_data(TxBuf[3]);write_data(TxBuf[4]);write_cmd(0x8d);write_data('u');write_data('g');write_cmd(0x8e);write_data('/');write_data('m');write_cmd(0x8f);write_data('3');//ug/m3}/*********报警值显示**********/void baojing(){write_cmd(0x9d);write_data(TxBuf[12]+0x30);write_data(TxBuf[13]+0x30);}/*******按键检测********/void checkkey(){if(SET==0){delay(10);do{}while(SET==0);set_st++;if(set_st>1)set_st=0;}if(set_st==0){ set_st=0; }else if(set_st==1){if(DEC==0){delay(10);do{}while(DEC==0);if(DUST_SET>0)DUST_SET--;if(DUST_SET==0)DUST_SET=0;}if(ADD==0){delay(10);do{}while(ADD==0);DUST_SET++;if(DUST_SET>80)DUST_SET=80;}}TxBuf[12]=DUST_SET%100/10;TxBuf[13]=DUST_SET%100%10;}/******报警子程序*******/void Alarm(){if(count>=9){count=0;if(DUST>=0&&DUST<=DUST_SET){LED1=0;LED2=1;LED3=1;}if(DUST>DUST_SET&&DUST<300){LED1=1;LED2=0;BEEP=0;delay(1000);LED2=1;BEEP=1;LED3=1;}if(DUST>=300){LED1=1;LED2=1;LED3=0;BEEP=0;delay(100);LED3=1;BEEP=1;}}}/*******AD0832转换程序**********/uchar AD0832(bit Channel){uchar i=0 , Data1 =0 , Data2 = 0 ;AD0832_CLK = 0 ; //时钟置低平//时钟12Mhz,整个转换时间为224us //使用芯片准备(参考PDF时序图)AD0832_DI = 1 ; //开始信号为高电平AD0832_CS = 0 ; //片选信号置低,启动AD转换芯片AD0832_CLK = 1 ; //输入开始信号(构成一个正脉冲),时钟上升沿,输入开始信号_nop_();_nop_();AD0832_CLK = 0 ; //时钟下降沿//模拟信号输入模式选择(1:单模信号,0:双模差分信号)_nop_();_nop_();AD0832_DI = 1 ;AD0832_CLK = 1 ; //时钟上升沿,输入开始信号_nop_();_nop_();AD0832_CLK = 0 ; //时钟下降沿//模拟信号输入通道选择(1:通道CH1,0:通道CH0)_nop_();_nop_();AD0832_DI = Channel ; //选择通道0AD0832_CLK = 1 ; //时钟上升沿,输入开始信号_nop_();_nop_();AD0832_CLK = 0 ; //时钟下降沿_nop_();_nop_();AD0832_DI = 1 ; //数据线置高,准备接收数据for(i=0;i<8;i++) //从高位移入数据{AD0832_CLK = 1 ;_nop_();_nop_();AD0832_CLK = 0 ; //时钟下降沿,AD0832输出数据,高位(MSB)先_nop_();_nop_();Data1 = Data1<<1; //数据左移位,补0if(AD0832_DI ==1){Data1 = Data1 | 0x01;} //如果数据为"1",移入1,} //如果数据为"0",移入0,for(i=0;i<8;i++) //从低位移入数据{Data2 = Data2>>1; //数据左移位,补0if(AD0832_DI ==1){Data2 = Data2 | 0x80;} //如果数据为"1",移入1如果数据为"0",移入0,AD0832_CLK = 1 ;_nop_();_nop_();AD0832_CLK = 0 ; //时钟下降沿,AD0832输出数据,高位(MSB)先_nop_();_nop_();}//数据线置高,释放总线,完成一次转换AD0832_CLK = 1 ;AD0832_DI = 1 ;AD0832_CS = 1 ;if(Data1==Data2) //输出{return Data2;}}/**************************************************************中值滤波算法:先进行排序,然后将数组的中间值作为当前值返回**************************************************************/uint Error_Correct(uchar *str,uchar k){uchar i,j,Temp=0;uint sum=0;for(i=0;i<k-1;i++){for(j=i+1;j<k;j++){if(str[i]<str[j]){Temp=str[i];str[i]=str[j];str[j]=Temp;}}}for(i=1;i<9;i++)sum+=str[i];sum=sum/8;return sum;}/*******主函数*********/void main(){uint i,j,k;wela=0;dula=0;LCD_init(); //12864 液晶初始化delay(100);lcd_write();delay(155);while(1){checkkey(); //按键检测baojing(); //显示报警值if(set_st==0){LED=1;for(i=0;i<19;i++);//延时0.28msabc=AD0832(0);//开启ADC采集for(j=0;j<5;j++);//延时0.04msLED=0;for(k=0;k<1482;k++);//延时9.68msmm++;count++;ADC_Get[mm]=abc;if(mm>9){mm=0;DUST=Error_Correct(ADC_Get,10);DUST_Value=(DUST/256.0)*5; //转化成电压值vDUST_Value=(DUST_Value*0.17-0.1)*1000; //固体悬浮颗粒浓度计算if(DUST_Value<0) DUST_Value=0;if(DUST_Value>=520) DUST_Value=520; //限位DUST=(uint)DUST_Value;delay(100);disp(DUST); //显示粉尘浓度值Alarm();//报警检测}}//Alarm();//报警检测}/*write_cmd(0x80+0x4f);write_data('3');if(set_st==1) //报警值闪动{write_cmd(0xca);write_cmd(0x0d);delay(150);}*/}。

单片机测试程序

单片机测试程序

单片机测试程序 Prepared on 22 November 2020实习步骤本单片机最小系统是以AT89S51单片机为控制核心,由驱动芯片ZLG7289与16键的键盘矩阵实现对两个4位一体共阴数码管LED的驱动显示,由LCD1602实现液晶显示,再通过电平转换芯片MAX232并连接到232接口实现串口通信,系统还包含有蜂鸣器,USB及适配器供电接口,JTAG程序下载接口,总线扩展等。

首先,用protel99se 软件制作硬件电路原理图及绘制PCB板;其次,安装焊接单片机最小系统开发板及下载线,并且进行电路调试;再次,在Keil uVision2软件环境下调试单片机汇编程序或C 语言程序,用单片机下载软件ISPLAY或STC-ISP V31实现程序下载,从而用编程实现最小系统的基本功能;最后,编写综合程序以实现系统功能的综合以及拓展功能,其中串口通信用到电脑自带的超级终端或AccessPort软件。

单片机最小系统板焊接首先对照元件清单和电路图,检查器件是否完整,型号﹑规格﹑安装是否正确。

然后将各器件根据焊接规则焊接到电路板上,其中对于器件的摆放方向和位置需十分注意。

先焊发热器件电阻和较低的电容,再焊较大的器件,焊接JTAG线,JTAG线里面的芯片电阻,电阻电容均为贴片封装,焊接时需小心谨慎,对于各条线引的焊接也需谨慎,按照其对应的顺序进行焊接,焊接结束后,自行组装。

检查已经焊好的电路板和JTAG下载线是否无误:⑴先用万用表检查电路板焊接是否都正确。

⑵当检查没有短路,断路,虚焊,漏焊等错误后,给电路板供电,看二极管是否亮,是否有器件过热,有可能二极管或三极管会在焊接的过程中被烧坏,那样的话就要重新焊器件。

⑶再用Keil软件给板子拷正确的程序,检查是否能按功能正常工作。

单片机系统的硬件调试和软件调试是不能分开的,许多硬件错误是在软件调试中被发现和纠正的。

软件设计在Keil软件环境下对照相关资料编写单片机最小系统开发板的有用程序,使设计好的程序编译无误,得到hex格式文件,用程序下载软件加载到单片机芯片中,实现仿真电路,在板上得出效果。

单片机测试程序

单片机测试程序

本单片机最小系统是以AT89S51单片机为控制核心,由驱动芯片ZLG7289与16键的键盘矩阵实现对两个4位一体共阴数码管LED的驱动显示,由LCD1602实现液晶显示,再通过电平转换芯片MAX232并连接到232接口实现串口通信,系统还包含有蜂鸣器,USB及适配器供电接口,JTAG程序下载接口,总线扩展等。

首先,用protel99se软件制作硬件电路原理图及绘制PCE板;其次,安装焊接单片机最小系统开发板及下载线,并且进行电路调试;再次,在Keil uVision2软件环境下调试单片机汇编程序或C语言程序,用单片机下载软件ISPLAY或STC-ISP V31实现程序下载,从而用编程实现最小系统的基本功能;最后,编写综合程序以实现系统功能的综合以及拓展功能,其中串口通信用到电脑自带的超级终端或AccessPort 软件。

单片机最小系统板焊接首先对照元件清单和电路图,检查器件是否完整,型号、规格、安装是否正确。

然后将各器件根据焊接规则焊接到电路板上,其中对于器件的摆放方向和位置需十分注意。

先焊发热器件电阻和较低的电容,再焊较大的器件,焊接JTAG线,JTAG线里面的芯片电阻,电阻电容均为贴片封装,焊接时需小心谨慎,对于各条线引的焊接也需谨慎,按照其对应的顺序进行焊接,焊接结束后,自行组装。

检查已经焊好的电路板和JTAG下载线是否无误:⑴先用万用表检查电路板焊接是否都正确。

⑵当检查没有短路,断路,虚焊,漏焊等错误后,给电路板供电,看二极管是否亮,是否有器件过热,有可能二极管或三极管会在焊接的过程中被烧坏,那样的话就要重新焊器件。

⑶再用Keil软件给板子拷正确的程序,检查是否能按功能正常工作。

单片机系统的硬件调试和软件调试是不能分开的,许多硬件错误是在软件调试中被发现和纠正的。

软件设计在Keil 软件环境下对照相关资料编写单片机最小系统开发板的有用程序,使设计好的程序编译无误,得到hex 格式文件,用程序下载软件加载到单片机芯片中,实现仿真电路,在板上得出效果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

测试一基础部分#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit D17=P3^0;sbit D18=P3^1;sbit D19=P3^2;sbit D20=P3^3;uchar a,b,c,d;void main()if(D17==0)//当P3^0按下,P0.0,P0.1亮{P0=0xfc;}if(D18==0)//当P3.1按下时,P0.0,P0.1,P0.2,P0.3{P0=0xf0;}if(D19==0){P0=0xc0;}if(D20==0){P0=0x00;}} 发挥部分#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit D17=P3^0;sbit D18=P3^1;sbit D19=P3^2;sbit D20=P3^3;uchar a,b,c,d;void main(){if(D17==0)//当P3^0按下,P0.0,P0.1亮{P0=0x55;}if(D18==0)//当P3.1按下时,P0.0,P0.1,P0.2,P0.3{P0=0xf0;}if(D19==0){P0=0xc0;}if(D20==0){P0=0x0c;}}测试二基础#include<reg52.h>#include<intrins.h>#define uchar unsigned char #define uint unsigned int void delay(uchar z){uint y=5000;while(z--)while(y--);}void zd1(){ uchar i;P0=0x7f;delay(2);for(i=7;i>0;i--){P0=_cror_(P0,1);delay(2);}}void zd0()//右循环{ uchar j;P0=0xfe;delay(2);for(j=1;j<8;j++){P0=_crol_(P0,1);delay(2);}}void main(){EA=1;//打开总中断EX0=1;//打开外部中断0EX1=1;//打开外部中断1IT0=0;//设置外部中断0为电平触发方式IT1=1;//设置外部中断1为边沿触发方式IP=0X01;//外部中断1为高优先级,外部中断0为低优先级while(1){P0=0x0f;delay(2);//P0=_crol_(P0,1); //流水灯P0=0xf0;delay(2);}}void INT_1() interrupt 2//外部中断1{uchar a;a=P0;zd1() ;delay(10);P0=a;}void INT_0() interrupt 0//外部中断0{uchar b;b=P0;zd0() ;delay(10);P0=b;}实验二发挥#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid delay(uchar z){uint y=5000;while(z--)while(y--);}void zd1(){ uchar i;P0=0x7f;delay(2);for(i=7;i>0;i--){P0=_cror_(P0,1);delay(2);}}void zd0()//右循环{ uchar j;P0=0xfe;delay(2);for(j=1;j<8;j++){ P0=_crol_(P0,1);delay(2);}}void main(){EA=1;//打开总中断EX0=1;//打开外部中断0EX1=1;//打开外部中断1IT0=0;//设置外部中断0为电平触发方式IT1=1;//设置外部中断1为边沿触发方式IP=0X01;//外部中断1为高优先级,外部中断0为低优先级while(1){P0=0x0f;delay(2);//P0=_crol_(P0,1); //流水灯P0=0xf0;delay(2);}}void INT_1() interrupt 2//外部中断1{uchar a;a=P0;zd1() ;delay(10);P0=a;}void INT_0() interrupt 0//外部中断0{uchar b;b=P0;zd0() ;delay(10);P0=b;}测试五#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit LED=P0^7;uint i=0;uchar j=0,flag=0;void main(){ P0=0xff;TMOD=0x16; //定时器0为计数方式,模式2;定时器1为定时方式,模式1TH0=253;TL0=253;TH1=(65536-10000)/256;TL1=(65536-10000)%256;//定时器1初值,10msET0=1;ET1=1;EA=1;TR0=1;TR1=1;while(1);}void T0_int() interrupt 1{flag=1;i=0;TH1=(65536-10000)/256;TL1=(65536-10000)%256;//定时器1初值,10ms}void T1_time() interrupt 3{TH1=(65536-10000)/256;TL1=(65536-10000)%256;//重装初值,10msi++;if(!flag){ if(i<50)LED=0; //0.5秒内亮else if(50<=i<250)LED=1; //0.5到2.5秒之间灭if(i==250)i=0;}else{ if(i<100)LED=0; //1s之内亮灯else if(100<=i<400)LED=1; //1到4s之间灯灭if(i==400){i=0;j++; //一次循环结束,i清零,循环次数j加1}if(j==4){flag=0; //循环够4次,flag=0j=0;i=0;TH0=253;TL0=253;}}}测试六基础部分#include<reg51.h>#define uint unsigned int#define uchar unsigned char uchar receive[5];uchar rec[]={"HELLO"}; uchar send[]={"goodbey"}; uchar i=1,j=0;void main(){SCON=0x50;TMOD=0x20;TH1=0xfa;//波特率4800TL1=0xfa;TR1=1;EA=1;//开中断ES=1;while(1);//等待接收中断}void serve() interrupt 4{if(TI){TI=0;if(i<7){SBUF=send[i];i++;}else i=1;}else{RI=0;receive[j]=SBUF;if(receive[j]==rec[j]){j++;if(j==5){SBUF=send[0];j=0;}}else j=0;}}测试六基础发挥#include<reg51.h>#define uint unsigned int#define uchar unsigned char uchar i=0,temp;uchar arry[3]={0x00,0x00,0x00}; void main(){SCON=0x50;TMOD=0x20;TH1=0xfa;//波特率4800TL1=0xfa;TR1=1;EA=1;ES=1;while(1);//等接收中断}void serve() interrupt 4{if(RI){RI=0;ACC=SBUF;if(ACC==0X44){temp=arry[0]*100+arry[1]*10+ arry[2];arry[0]=0;arry[1]=0;arry[2]=0;SBUF=temp;}else{arry[0]=arry[1];arry[1]=arry[2];arry[2]=ACC-0X30;}}elseTI=0;}测试三基础部分#include<reg51.h>unsigned char code discode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};sbit s20=P3^3;unsigned char m,buf[4];//定义显示缓冲区unsigned int shu;void delay(unsigned char z) //延时函数{unsigned char x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display(unsigned int temp) //显示函数{unsigned char i;buf[0]=temp/1000;buf[1]=temp%1000/100;buf[2]=temp%100/10;buf[3]=temp%10;for(i=0;i<4;i++){P1=(0x01<<i);P0=discode[buf[i]];delay(5);P0=0xff;}}void main(){while(1){shu=2015;display(shu);}}测试三发挥部分#include<reg52.h>#include<intrins.h>sbit key=P3^3;unsigned char code LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };//建立数字0~9的七段码表unsigned char m, buf[4];//定义显示缓冲区unsigned int shu;void delay(unsigned char x){unsigned char y;for(;x>0;x--)for(y=110;y>0;y--);}void dis(unsigned int temp)//显示子程序{unsigned char i;buf[0]=temp/1000;buf[1]=temp%1000/100;buf[2]=temp%100/10;buf[3]=temp%10;for(i=0;i<4;i++)//4位轮流显示{P1=(0x01<<i);//送位选信号P0=LED[buf[0+i]];//送段选信号delay(5);//延时一段时间P0=0xff;//消隐} }void main()//主程序{while(1){shu=2015;dis(shu); //显示数值2015if(key==0)//如果按键按下{shu++;//数值加1while(1){for(m=0;m<180;m++)//循环显示一段时间dis(shu);shu++;//数值加1if(shu==2030)//如果数值加为2030while(1) dis(shu);//循环显示2030}}}}实验四基础部分#include<reg52.h>#include<intrins.h>unsigned char k,n=0;unsigned char code TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82 ,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x8 6,0x8e};void delay20ms(){ unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<20;j++);}void delay(){ unsigned int i,j;for(i=0;i<100;i++)for(j=0;j<5;j++);}unsigned char keyscan(){ unsigned char row,col=0,m=0xff; P2=0xf0;if((P2&0xf0)==0xf0)return m;delay20ms();if((P2&0xf0)==0xf0)return m;for(row=0;row<4;row++){ P2=~(1<<row);m=P2&0xf0;if(m!=0xf0){while(m&(1<<(col+4)))col++;m=row*4+col;P2=0xf0;while((P2&0xf0)!=0xf0);break;}}return m;}void display(unsigned char a) {P0=TAB[0];P1=0x01;delay();P0=0xff;P0=TAB[a];P1=0x02;delay();P0=0xff;}void main(){P0=TAB[0];P1=1;while(1){k=keyscan();if(k!=0xff)n=k;display(n);}}实验四发挥部分#include<reg52.h>#include<intrins.h>unsigned char k,kk=100,n=0; unsigned char code TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x 92,0x82,0xf8,0x80,0x90,0x88,0x83,0 xc6,0xa1,0x86,0x8e};void delay1ms(unsigned int b) {unsigned int x,y;for(x=b;x>0;x--)for(y=110;y>0;y--);}void delay20ms(){ unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<20;j++);}void delay(){ unsigned int i,j;for(i=0;i<100;i++)for(j=0;j<5;j++);}unsigned char keycan(){ unsigned char row,col=0,m=0xff; P2=0xf0;if((P2&0xf0)==0xf0)return m;delay20ms();if((P2&0xf0)==0xf0)return m;for(row=0;row<4;row++){ P2=~(1<<row);m=P2&0xf0;if(m!=0xf0){while(m&(1<<(col+4)))col++;m=row*4+col;P2=0xf0;while((P2&0xf0)!=0xf0);break;}}return m;}void display(unsigned char a) { unsigned char ge;ge=a;P0=TAB[ge];P1=0x01;delay();P0=0xff;}void main(){ unsigned char z;P0=TAB[0];P1=3;while(1){ k=keycan();if(k!=0xff){ if(k!=kk)kk=k;elsefor(z=0;z<k;z++){display(k);P0=0xff;delay1ms(1000);}n=k;}display(n);}}测试七基础部分#include <reg52.h>sbit start=P1^6;sbit eoc=P1^7;sbit clk=P1^5;sbit oe=P2^6;sbit P10=P1^0;sbit P11=P1^1;unsigned char adcdata=0; unsigned char code led[16]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0x88,0x8 3,0xa7,0xa1,0x86,0x8e};//0-9,A-Fvoid delay(unsigned char a){unsigned char b;for(;a>0;a--)for(b=110;b>0;b--);}void dis(unsigned char temp){unsigned char ge,shi;ge=temp&0x0f;shi=(temp>>4)&0x0f;P0=led[ge];P10=1;delay(5);P10=0;P0=led[shi];P11=1;delay(5);P11=0; }void main(){TMOD=0X02;TH0=255;TL0=255;EA=1;ET0=1;TR0=1;while(1){start=0;start=1;start=0;while(!eoc) dis(adcdata);oe=1;P3=0xff;adcdata=P3;}}void T0int() interrupt 1{clk=~clk;}。

相关文档
最新文档