STC12LE5A60S2
- 格式:doc
- 大小:63.50 KB
- 文档页数:8
ADC#include<STC12C5A60S2.H>#include<intrins.h>//51基本运算(包括_nop_空函数)#include"ad.h"#include"uart.h"unsigned char code dispcode[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};void AD_Configurate (uchar ChannelNum){uchar AD_FLAG=0; //存储A/D转换标志ChannelNum &= 0x0f; //选择ADC的个接口中的一个(0111 清高位)ADC_CONTR = 0x40; //ADC转换的速度(XX0 0000 其中XX控制速度,请根据数据手册设置)_nop_();ADC_CONTR |= ChannelNum; //选择A/D当前通道_nop_();ADC_CONTR |= 0x80; //启动A/D电源delay(1); //使输入电压达到稳定(ms即可)}unsigned int ReadADV alue (void){unsigned char AD_FLAG=0; //存储A/D转换标志ADC_CONTR |= 0x08; //启动A/D转换(1000 令ADCS = 1)_nop_();_nop_();_nop_();_nop_();while (AD_FLAG ==0)//等待A/D转换结束{AD_FLAG = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否}ADC_CONTR &= 0xE7; //1111 0111 清ADC_FLAG位, 关闭A/D转换,return(ADC_RES*4+ADC_RESL);//返回A/D转换结果(位ADC数据高位在ADC_RES中,低位在ADC_RESL中)}void DigitalTube(unsigned long number){P2=0xef; //1110 1111P0=dispcode[number%10]; //显示number的个位delay(7);P2=0xdf; //1101 1111P0=(dispcode[number/10%10]); //显示number的十位delay(7);P2=0xbf; //1011 1111P0=(dispcode[number/100%10]); //显示number的百位delay(7);P2=0x7f; //1011 1111P0=(dispcode[number/1000]); //显示number的千位delay(7);}void delay (unsigned int a ){unsigned int i;while (--a != 0){for (i = 0; i < 600; i++);}}void GPIO_init (void){P2M0 = 0x0F; //0000 1111 //I/O接口的设置P2M1 = 0x00; //0000 0000 //I/O接口的设置P1M1 = 0x01; //P1.0作为ad功能}PWM#include<STC12C5A60S2.H>#include"pwm.h"#include"uart.h"unsigned int xdata FirstData=0; //上升沿捕捉数据unsigned int xdata SeconedData=0; //下降沿捕捉数据高电平时间=SeconedData-FirstData unsigned int xdata HighLevel=0; // 保存被测波形高电平时间对于测方波即使半个周期//采用半个周期的测法主要是提高可被测波形的频率范围unsigned int xdata Frequency=0; // 保存频率的变量bit Capture_over = 0; //捕获完成标志位void pwm_init(void){CMOD=0x80; //0000 0010 PCA工作模式寄存器系统时钟/12 计数器溢出中断CF CCAP0H =(CCAP0L = 254); //PCA捕捉/比较寄存器127 高低点CCAPM0=0x42; //0100 0010// CCAP1H =(CCAP1L = 0x7f);// CCAPM1=0x42;CCAPM1 = 0x21;//16位捕获模式,上升沿触打开捕获中断CCF1CCAP1L = 0x00;CCAP1H = 0x00;EA = 1;CCON=0x40; //0100 0000 PCA控制寄存器CR=1 启动PCA计数器阵列计数}void SetPwm0DutyCycle(unsigned int x) //占空比设置函数{unsigned int h=0,l=0;l=x&0xff;h=x>>8;CCAP0L=l;CCAP0H=h; //设置比较值}void PCA_Interrupt(void) interrupt 7{if (CCF1) //PCA模块中断{CCF1 = 0;if(FirstData == 0) // 上升沿中断{FirstData = CCAP1H; //获得捕捉数据的高位//高位<<8+低位构成位整数FirstData = (FirstData << 8) + CCAP1L;CCAPM1 = 0x11;// 下降沿捕获}else// 下降沿中断{CCF1 = 0; // 清CCF中断标志SeconedData = CCAP1H; //获得捕捉数据的高位//高位<<8+低位构成位整数SeconedData = (SeconedData << 8) + CCAP1L;HighLevel = SeconedData - FirstData; //计数值单位为usFrequency = (long)456000/ HighLevel; // 得到周期CR = 0;//停止PCA计数器计数CCAPM1 = 0x10;//停止捕获中断CCF0产生FirstData=0; // 为下一次捕捉设定初始条件CCAP1L = 0x00;//清零CCAP1H = 0x00;CL = 0x00; //清PCA计数器CH = 0x00;CCAPM1 = 0x21;Capture_over = 1;//捕获完成标志位}}// if(CF == 1) //PCA溢出中断// {// USART_Send_Str(" ;;;;;;;");// CF = 0; //清PCA溢出中断标志// CCAPM1 = 0x21;// FirstData=0; // 为下一次捕捉设定初始条件// CCAP1L = 0x00;//清零// CCAP1H = 0x00;// }}UART#include<STC12C5A60S2.H>#include<stdio.h>#include<string.h>#include"uart.h"//void uartinit(void)//{//// SCON = 0x50; //REN=1允许串行接受状态,串口工作模式// TMOD|= 0x20; //定时器工作方式// PCON|= 0x80;// //TH1 = 0xFD; //baud*2 /* reload value 19200、数据位、停止位。
1.PCA工作模式寄存器CMODPCA工作模式寄存器的格式如下:CMOD:PCA工作模式寄存器CIDL:空闲模式下是否停止PCA计数的控制位当CIDL=0时,空闲模式下PCA计数器继续工作;当CIDL=1时,空闲模式下PCA计数器停止工作;CPS2、CPS1、CPS0:PCA计数脉冲源选择控制位。
PCA计数脉冲选择如下表所示:例如,CPS2/CPS1/CPS0=1/0/0时,PCA/PWM的时钟源是SYSclk,不是定时器0,PWM 的频率为SYSclk/265如果要用系统时钟/3来作为PCA的时钟源,应让T0工作在1T模式,计数3个脉冲即产生溢出。
如果此时使用内部RC作为系统时钟(室温情况下,5V单片机为11MHZ~15.5MHZ),可以输出14K~19K频率的PWM。
用T0的溢出可对系统时钟进行1~256级分频。
ECF:PCA计数溢出中断使能位。
当ECF=0时,禁止寄存器CCON中CF位的中断;当ECF=1时,允许寄存器CCON中CF位的中断。
2. 2. PCA控制寄存器CCONPCA控制寄存器的格式如下:CCON:PAC控制寄存器CF:PCA计数阵列溢出标志位。
当PCA计数器溢出时,CF由硬件位置。
如果CMOD 寄存器的ECF位置位,则CF标志可用来产生中断。
CF位可通过硬件或软件置位,但通过软件清零。
CR:PCA计数阵列运行控制位。
该位通过软件置位,用来起动PCA计数器阵列计数。
该位通过软件清零,用来关闭PCA计数器。
CCF1:PCA模块1中断标志。
当出现匹配或捕获时该位由硬件置位。
该位必须通过软件清零。
CCF0:PCA模块0中断标志。
当出现匹配或捕获时该位由硬件置位。
该位必须通过软件清零。
3. 3.PCA比较/捕获寄存器CCAPM0和CCAPM1PCA模块0的比较/捕获寄存器的格式如下:CCAPM0:PCA模块0的比较/捕获寄存器B7:保留位将来之用。
ECOM0:允许比较器功能控制位。
基于STC12C5A60S2单片机的水弹感应靶【摘要】本文介绍了基于STC12C5A60S2单片机的水弹感应靶系统的设计与研究。
在分析了研究背景和目的意义,明确了本文的研究重点。
接着,详细介绍了STC12C5A60S2单片机的特点和功能,为后续实现水弹感应靶提供了技术支持。
设计原理部分解析了水弹感应靶的工作原理和实现方法,系统硬件设计和软件设计部分展示了系统的具体实现过程。
在系统性能分析中,评估了系统的稳定性和准确性。
结论部分展望了水弹感应靶在射击训练和娱乐领域的应用前景,提出了存在问题与展望,总结了本文的研究工作。
通过本文的研究,为水弹感应靶的进一步发展提供了参考和指导。
【关键词】STC12C5A60S2单片机、水弹感应靶、硬件设计、软件设计、系统性能分析、应用前景、存在问题、展望、研究工作总结。
1. 引言1.1 研究背景水弹感应靶是一种新型的靶射击设备,它能够通过感应水弹的命中情况来实现自动计分和反馈。
随着射击运动的普及和发展,人们对射击训练的需求也越来越大。
传统的靶射击方式存在着固定目标、无法实时反馈等问题,严重制约了射击训练的效果和乐趣。
开发一种能够提高射击训练效果、增加趣味性的新型靶射击设备就显得尤为重要。
目前市面上已经有一些智能靶射击系统,但大多数价格昂贵,且功能繁杂,操作复杂。
基于STC12C5A60S2单片机的水弹感应靶正是针对这一问题而设计的,它采用了简单而稳定的单片机控制技术,具有低成本、易操作、高精度等特点,可以很好地满足射击训练的需求。
利用STC12C5A60S2单片机设计水弹感应靶具有重要的研究意义和应用价值。
通过本研究,将为射击训练提供一种新的解决方案,有望推动射击运动的发展,提高射击爱好者的训练效果,为靶射击领域的发展做出贡献。
1.2 目的和意义水弹感应靶是一种用于射击训练和娱乐活动的设备,能够感知水弹击中靶子的位置并进行准确计数。
本文旨在利用STC12C5A60S2单片机作为控制核心,设计一款高性能的水弹感应靶系统。
STC12C5A60S2单片机寄存器头文件STC12C5A.H内容/**************** 8051内核特殊功能寄存器******************/sfr ACC = 0xE0; //累加器sfr B = 0xF0; //B寄存器sfr PSW = 0xD0; //程序状态字寄存器sbit CY = PSW^7; //进位标志位sbit AC = PSW^6; //辅助进位标志位sbit F0 = PSW^5; //用户标志位0sbit RS1 = PSW^4; //工作寄存器组选择控制位sbit RS0 = PSW^3; //工作寄存器组选择控制位sbit OV = PSW^2; //溢出标志位sbit F1 = PSW^1; //用户标志位1sbit P = PSW^0; //奇偶标志位sfr SP = 0x81; //堆栈指针寄存器sfr DPL = 0x82; //数据指针0低字节sfr DPH = 0x83; //数据指针0高字节/**************** 系统管理特殊功能寄存器******************/sfr PCON = 0x87; //电源控制寄存器sfr AUXR = 0x8E; //辅助寄存器sfr AUXR1 = 0xA2; //辅助寄存器1sfr WAKE_CLKO = 0x8F; //时钟输出和唤醒控制寄存器sfr CLK_DIV = 0x97; //时钟分频控制寄存器sfr BUS_SPEED = 0xA1; //总线速度控制寄存器/**************** 中断控制特殊功能寄存器******************/sfr IE = 0xA8; //中断允许寄存器sbit EA = IE^7; //总中断允许位sbit ELVD = IE^6; //低电压检测中断控制位sbit EADC = IE^5; //ADC中断允许控制位sbit ES = IE^4; //串口1中断允许位sbit ET1 = IE^3; //定时器1溢出中断允许位sbit EX1 = IE^2; //外部中断1允许位sbit ET0 = IE^1; //定时器0溢出中断允许位sbit EX0 = IE^0; //外部中断0允许位sfr IE2 = 0xAF; //中断允许寄存器2sfr IP = 0xB8; //中断优先级寄存器sbit PPCA = IP^7; //PCA中断优先级控制位sbit PLVD = IP^6; //低电压检测中断优先级控制位sbit PADC = IP^5; // ADC中断优先级控制位sbit PS = IP^4; //串口1中断优先级控制位sbit PT1 = IP^3; //定时器1中断优先级控制位sbit PX1 = IP^2; //外部中断1优先级控制位sbit PT0 = IP^1; //定时器0中断优先级控制位sbit PX0 = IP^0; //外部中断0优先级控制位sfr IPH = 0xB7; //中断优先级高位寄存器sfr IP2 = 0xB5; //第二中断优先级寄存器低字节sfr IPH2 = 0xB6; //第二中断优先级寄存器高字节/**************** I/O口特殊功能寄存器******************/sfr P0 = 0x80; //P0口寄存器sfr P0M1 = 0x93; //P0口工作模式寄存器1sfr P0M0 = 0x94; //P0口工作模式寄存器0sfr P1 = 0x90; //P1口寄存器sfr P1M1 = 0x91; //P1口工作模式寄存器1sfr P1M0 = 0x92; //P1口工作模式寄存器0sfr P1ASF = 0x9D; //P1口模拟量功能设置寄存器sfr P2 = 0xA0; //P2口寄存器sfr P2M1 = 0x95; //P2口工作模式寄存器1sfr P2M0 = 0x96; //P2口工作模式寄存器0sfr P3 = 0xB0; //P3口寄存器sbit T1 = P3^5; //定时器1外部输入sbit T0 = P3^4; //定时器0外部输入sbit INT1 = P3^3; //外部中断1sbit INT0 = P3^2; //外部中断0sbit TXD = P3^1; //串行输入通道sbit RXD = P3^0; //串行输出通道sfr P3M1 = 0XB1; //P3口工作模式寄存器1sfr P3M0 = 0xB2; //P3口工作模式寄存器0sfr P4 = 0xC0; //P4口寄存器sfr P4M1 = 0xB3; //P4口工作模式寄存器1sfr P4M0 = 0xB4; //P4口工作模式寄存器0sfr P4SW = 0xBB; //P4口功能切换寄存器sfr P5 = 0xC8; //P5口(只有P5.3、P5.2、P5.1、P5.0)sfr P5M1 = 0xC9; //P5口工作模式寄存器1sfr P5M0 = 0xCA; //P5口工作模式寄存器0/**************** 定时器特殊功能寄存器******************/sfr TCON = 0x88; //定时/计数控制寄存器sbit TF1 = TCON^7; //定时器1溢出中断标志sbit TR1 = TCON^6; //定时器1运行控制位sbit TF0 = TCON^5; //定时器0溢出中断标志sbit TR0 = TCON^4; //定时器0运行控制位sbit IE1 = TCON^3; //外部中断1请求标志sbit IT1 = TCON^2; //选择外部中断请求1为边沿触发方式的控制位sbit IE0 = TCON^1; //外部中断0请求标志sbit IT0 = TCON^0; //选择外部中断请求0为边沿触发方式的控制位sfr TMOD = 0x89; //定时/计数模式控制寄存器sfr TL0 = 0x8A; //定时/计数器0低字节sfr TH0 = 0x8C; //定时/计数器0高字节sfr TL1 = 0x8B; //定时/计数器1低字节sfr TH1 = 0x8D; //定时/计数器1高字节/**************** 串行口特殊功能寄存器******************/sfr SCON = 0x98; //串行口控制寄存器sbit SM0 = SCON^7; //串行口工作方式设定控制位0(与FE功能复用)sbit FE = SCON^7;sbit SM1 = SCON^6; //串行口工作方式设定控制位1sbit SM2 = SCON^5; //UART的SM2设定sbit REN = SCON^4; //接收允许位sbit TB8 = SCON^3; //发送数据的第九位sbit RB8 = SCON^2; //接收数据的第九位sbit TI = SCON^1; //发送中断标志sbit RI = SCON^0; //接收中断标志sfr SBUF = 0x99; //串口数据缓冲器sfr SADEN = 0xB9; //从机地址掩码寄存器sfr SADDR = 0xA9; //从机地址寄存器sfr S2CON = 0x9A; //串行口2控制寄存器sfr S2BUF = 0x9B; //串行口2数据缓冲器sfr BRT = 0x9C; //独立波特率定时器/**************** 看门狗定时器寄存器******************/sfr WDT_CONTR = 0xC1; //看门狗定时器控制寄存器/******************** PCA寄存器**********************/sfr CCON = 0xD8; //PCA控制寄存器sbit CF = CCON^7; //PCA计数器溢出(CH,CL由FFFF变为0000H)标志sbit CR = CCON^6; //PCA计数器计数允许控制位sbit CCF1 = CCON^1; //PCA模块1中断标志sbit CCF0 = CCON^0; //PCA模块0中断标志sfr CMOD = 0xD9; //PCA 工作模式寄存器sfr CL = 0xE9; //PCA 计数器低8位sfr CH = 0xF9; //PCA 计数器高8位sfr CCAPM0 = 0xDA; //PCA 模块0的工作模式寄存器sfr CCAPM1 = 0xDB; //PCA 模块1的工作模式寄存器sfr CCAP0L = 0xEA; //PCA 模块0捕捉/比较寄存器低8位sfr CCAP0H = 0xFA; //PCA 模块0捕捉/比较寄存器高8位sfr CCAP1L = 0xEB; //PCA 模块1捕捉/比较寄存器低8位sfr CCAP1H = 0xFB; //PCA 模块1捕捉/比较寄存器高8位sfr PCA_PWM0 = 0xF2; //PCA 模块0 PWM寄存器sfr PCA_PWM1 = 0xF3; //PCA 模块1 PWM寄存器/******************** ADC寄存器**********************/sfr ADC_CONTR = 0xBC; //ADC控制寄存器,本寄存器不支持位操作sfr ADC_RES = 0xBD; //ADC转换结果高8位寄存器sfr ADC_RESL = 0xBE; //ADC转换结果低2位寄存器/******************** SPI寄存器**********************/sfr SPSTAT = 0xCD; //SPI状态寄存器,本寄存器不支持位操作sfr SPCTL = 0xCE; //SPI控制寄存器sfr SPDAT = 0xCF; //SPI数据寄存器/***************** ISP_IAR_EEPROM寄存器*******************/sfr IAP_DATA = 0xC2; //ISP/IAP Flash数据寄存器sfr IAP_ADDRH = 0xC3; // ISP/IAP Flash地址高字节sfr IAP_ADDRL = 0xC4; // ISP/IAP Flash地址低字节sfr IAP_CMD = 0xC5; // ISP/IAP Flash命令寄存器sfr IAP_TRIG = 0xC6; // ISP/IAP Flash命令触发器sfr IAP_CONTR = 0xC7; //ISP/IAR控制寄存器。
数字电压表的设计第1章引言在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。
而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。
数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。
由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用。
传统的指针式刻度电压表功能单一,精度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要。
采用单片机的数字电压表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。
数字电压表是诸多数字化仪表的核心与基础。
以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。
目前,由各种单片机和A/D转换器构成的数字电压表作全面深入的了解是很有必要的。
目前,数字电压表的部核心部件是A/D转换器,转换的精度很大程度上影响着数字电压表的准确度,因而,以后数字电压表的发展就着眼在高精度和低成本这两个方面。
本文是以简易数字直流电压表的设计为研究容,本系统主要包括三大模块:转换模块、数据处理模块及显示模块。
第2章系统总体方案设计选择与说明2.1 设计要求1、增强型MCS-51系列单片机STC12C5A60S2为核心器件,组成一个简单的直流数字电压表。
2、采用1路模拟量输入,能够测量0-10V之间的直流电压值。
3、电压显示采用LCD1602显示。
4、尽量使用较少的元器件。
2.2 设计思路1、根据设计要求,选择STC12C5A60S2单片机为核心控制器件。
2、A/D转换采用STC12C5A60S2部自带A/D实现。
3、电压显示采用LCD1602显示。
2.3 设计方案硬件电路设计由7个部分组成:STC12C5A60S2单片机系统,数码管显示系统、时钟电路、复位电路档位调节电路以及测量电压输入电路。
#include <STC12C5A60S2.h>#include <Uart.h>#define uchar unsigned char#define uint unsigned int//=====================void delay(void){uint j,g;for(j=0;j<500;j++)for(g=0;g<500;g++);}//============================void main(){Uart_Two_Init();Uart_One_Init();while(1){Uart_One_Send('z');delay();Uart_Two_Send('z');UART_One_Printf("sb123456789\n");delay();UART_Two_Printf("sb123456789\n");delay();}}//======================================#ifndef __UART_H__#define __UART_H__#define uchar unsigned char#define uint unsigned int//=====================================//#define RELOAD 0xFA//#define RELOAD_TWO 0xfa//#define BRTx12_enable() AUXR |= 0x04 //BRT 独立波特率发生器的溢出率快12 倍//#define BRT_start() AUXR |= 0x10 //启动独立波特率发生器BRT 计数。
//=========================================uchar c = 0 ;uint d = 0 ;//=========================================//=======baud 9600=======================void Uart_One_Init() //串口1初始化函数,波特率9600TMOD=0x20;//设置定时器1为工作方式2TH1=0xfd; //设置波特率为9600TL1=0xfd;TR1=1;REN=1;SM0=0;SM1=1;EA=1;ES=1;// AUXR|=0X40; //T1*12;}//========================================void Uart_One_Send(char k) //串口1发送一个字符{ES = 0 ;SBUF=k;while(TI!=1);TI = 0 ;ES = 1 ;}//=========baud 9600=======================void Uart_Two_Init() //串口2初始化函数,波特率9600{S2CON= 0x50 ; //方式2,允许接收// BRT = RELOAD_TWO ;BRT = 0xfd; //设置波特率9600 AUXR = AUXR |0X10 ; //允许独立波特率发生器运行// BRTx12_enable();AUXR1 = AUXR1&0xef ; //S2_P4=0,将uart2切换到P1口IE2 = IE2|0X01; //允许串口2中断}//=========================================void Uart_Two_Send(uchar k) //串口2发送一个字符{ES = 0 ;S2BUF = k ;while((S2CON&0x02)!=0x02);S2CON &= ~0x02;ES = 1 ;}//=============================================void UART_One_Printf(uchar *p)while(* p!='\0') Uart_One_Send(*p++);}//============================================ void UART_Two_Printf(uchar *p){while(* p!='\0') Uart_Two_Send(*p++);}//=========================================== void Uart_One_Receive() interrupt 4{uint k = 0 ;if(RI==1){RI = 0 ;k = SBUF;}}//========================================void Uart_Two_Receive() interrupt 8{uchar a ;uint k = 0 ;// a = S2CON ;a = S2CON & 0x01;if(a==1){k = S2BUF ;S2CON = S2CON & 0xfe; //清0 S2RI }}//=====================================#endifLTC1605 - 16-Bit, 100ksps, Sampling ADC特点•Sample Rate: 100ksps 采样100K次/S•Single 5V Supply 单5V供电•Bipolar Input Range: ±10V 双极输入-10V----+10V•Power Dissipation: 55mW Typ 电源55MW•Integral Nonlinearity: ±2.0LSB Max •Guaranteed No Missing Codes•Signal-to-Noise Ratio: 86dB Typ •Operates with Internal or External Reference •Internal Synchronized Clock•Improved 2nd Source to ADS7805 and AD976 •28-Pin 0.3” PDIP, SSOP and SW Packages。
目录第一章实习的目的及意义 (1)1.1生产实习的目的 (1)1.2生产实习的意义 (1)第二章单片机的最小系统 (2)2.1部分芯片介绍 (2)2.1.1A T89S52 (2)2.1.2 MAX232芯片 (3)2.1.3 LCD1602液晶显示器 (3)第三章单片机电路板焊接 (5)3.1单片机的焊接 (5)3.2焊接原件清单 (5)3.3焊接注意事项 (7)第四章c语言应用程序 (8)4.1 Keil uVision的使用 (8)4.2 流水灯程序 (8)4.3流水灯高低位循环闪烁 (9)4.4 AD转换测温度 (11)4.5 串口通信程序 (18)4.6 按键控制1602 (42)第五章单片机开发板的应用 (49)5.1任务及要求 (49)第六章实习体会 (53)第一章实习的目的及意义1.1生产实习的目的此次生产实习的目的是在理论学习的基础上,通过完成一个设计51单片机的多种资源应用并具有综合功能的最小系统目标板的设计与编程应用。
锻炼我们的动手动脑能力,进一步理解课本中所学的知识,巩固和深化对单片机的认识。
同时有助于我们对理论知识的理解,帮助我们学习专业知识 为以后的学习打好基础。
实习要求我们了解单片机原理和各元器件的主要作用。
还要掌握焊接的技术。
独立编程序下到实验板中实现所需功能。
1.2生产实习的意义通过对实习基地进行有针对性的参观、学习,提高学习对本专业真的了解和认识,增加学习兴趣和增强专业自豪感,为日后专业知识的学习打下良好的基础。
同时,实习对我们了解社会、接触生产实际、加强劳动观念、培养动手能力和理论与实践相结合的能力等方面亦具有重要的意义。
1.3生产实习的重要性生产实习是电子信息工程专业教学计划的一个重要部分,是培养学生理论学习与实践相结合的重要实践性教学环节。
通过生产实习使学生了解实习单位的工作方式和工作流程;对以后大单片机课程设计,帝业设计做基础,了解一个开发板的开发制作的整个过程以及元器件的采购;对生产现场、生产过程中的电子信息设备、计算机设备的应用状况有较为深刻的认识,掌握常规电子信息设备的使用维护方法;在实践中进一步加强专业教育,了解本专业工程技术岗位和生产劳动岗位的工作情况和工作内容,培养团队精神和吃苦耐劳的精神;同时可以使学生学到企业的管理经验和工人师傅的艰苦创业精神,激励学生奋发向上的开拓精神。
//===================================================== ===============//工程:STC12LE5A60S2单片机最小系统模块程序集//硬件配置:单片机STC12LE5A60S2、液晶显示MZLH04、矩阵键盘、数模转换芯片///TL V5638 、模数转换芯片ADS7883///完成功能:1、键盘输入:(1)利用STC内部ADC测量电压按键;(2)矩阵键盘按键;2、///液晶显示;3、ADC;4、DAC。
//编程需要的头文件:1、铭正同创官网MZLH04显示例程LCD_Dis.h;2、stc12c5a.h。
//北京交通大学电气工程学院//作者:徐国金//创建时间:2011年8月10日星期三晚11:00//===================================================== ================#include "LCD_Dis.h"#include "stc12c5a.h"#include <intrins.h>#define uint unshigned int#define uchar unsigned charunsigned char key;unsigned char adckey;unsigned char getad(void);unsigned char getkey(void);void delay(unsigned int ms) //延时函数{unsigned char i;while(ms--){for(i=0;i<250;i++){_nop_();_nop_();_nop_();_nop_();}}}//////AD按键程序unsigned char getad(){ unsigned char channel;unsigned char AD_finished=0;ADC_RES = 0;channel &= 0x01; //AD通道选择2ADC_CONTR |=0x40; //转换速度选择sppd1=1ADC_CONTR &=0xDF; //转换速度选择sppd0=0_nop_();ADC_CONTR |= channel; //AD通道选择赋值_nop_();ADC_CONTR |= 0x80; //开AD转换电源delay(1);ADC_CONTR |= 0x08; //启动AD转换AD_finished = 0;while (AD_finished ==0 ) ///转换是否结束判断{AD_finished = (ADC_CONTR & 0x10);}ADC_CONTR &= 0xE7; ////转换标志位清0 ,关闭AD转换电源return (ADC_RES);}//////////////矩阵按键程序unsigned char getkey(){unsigned char jp,temp=16;//////TEMP复位为非键扫描数char column[]={0xEF,0xDF,0xBF,0x7F};char keycode[]={0xEE,0xED,0xEB,0xE7,0xDE,0xDD,0xDB,0xD7,0xBE,0xBD,0xBB,0xB7,0 x7E,0x7D,0x7B,0x77};//0 1 2 3 4 5 6 7 8 9 10.......do{for(jp=0;jp<4;jp++){P2=column[jp];if(P2!=column[jp]){TimeDelay(20);if(P2!=column[jp]) //按键在此列temp=P2;}}for(jp=0;jp<16;jp++){if(temp==keycode[jp])return jp; //退出getkey()函数}}while(1);}//////////////主函数///////////////////////////////////////////////// //////////void main(void){////////////////////////////////////////////显示初始化////////////////////////////////////////////// /////////////LCD_Init();SetBackLight(0); //设置背光的亮度等级为0SetBackLight(unsigned char Grade) Grade 0~127的等级ClrScreen();FontSet(0,1); ////////ASCII字符字体设置FontSet_cn(0,1); ///汉字库字符字体设置FontMode(1,0);SetBackLight(100); //设置背光打开PutString_cn(0,0," 数控脉冲信号发生器");PutString_cn(36,13,"频率");//PutString_cn(0,13,"周期");while(1){/////////////////////////////////////////////////////////矩阵键盘//// ////////////////////////////////////////////////////////key=getkey();switch(key){case 12: //C键PutChar(2,28,'C');case 13: //D键PutChar(2,28,'D');break;case 14: //E键PutChar(2,28,'E');break;case 15: //F键PutChar(2,28,'F');delay(700);break;case 8: //9键//PutChar(2,28,'9');delay(700);break;case 9: //0键PutChar(2,28,'0');delay(700);break;case 10: //A键PutChar(2,28,'A');delay(700);break;case 11: //B键PutChar(2,28,'B');delay(700);break;case 4: //5键PutChar(2,28,'5');delay(700);break;PutChar(2,28,'6'); delay(700);break;case 6://7键PutChar(2,28,'7');delay(700);break;case 7://8键PutChar(2,28,'8');delay(700);break;case 0://1键PutChar(2,28,'1'); delay(700);break;case 1://2键PutChar(2,28,'2');delay(700);break;case 2://3键delay(700);break;case 3:///4键delay(700);default:break;}}////while}////main////AD转换程序:ADS7883sbit sdo =P0^3;sbit sclk=P0^4;sbit cs=P0^5;unsigned short ads7883(void);unsigned short ad;float adc;//////AD转换读数unsigned short ads7883(){unsigned short ad_conv=0;////////////关闭掉电模式,开启芯片/*sclk=1;cs=0;for(i=0;i<10;i++){_nop_();sclk=0;_nop_();sclk=1;}//cs=1;////////////////CS至少在10个时钟下降沿以后拉高关闭掉电模式*////////////cs=1;sclk=1;_nop_();cs=0;for(i=1;i<=14;i++){sclk=0;ad_conv|=sdo;ad_conv<<=1;//////////第2个至第14个下降沿取数,第一个数为0无效//_nop_();sclk=1;_nop_();}/////进入掉电模式,降低功耗/*cs=1;sclk=1;_nop_();_nop_();_nop_();cs=0;for(i=0;i<3;i++){sclk=0;_nop_();sclk=1;_nop_();}cs=1;////////////cs在第2个和第10个时钟下降沿时拉高,进入掉电模式*/ad_conv>>=2;return (ad_conv);}////////////DA转换程序:TLV5638unsigned int value_a;unsigned int value_b;unsigned int value;sbit di=P0^0;sbit clk=P0^1;sbit ss=P0^2;extern void tlv5638write(unsigned int bitstream);//////////// TLV5638写函数////////////////void tlv5638write(unsigned int bitstream){clk=1;ss=0;_nop_();for(i=0;i<16;i++){di=(bitstream<<i)&0x8000;//_nop_();clk=0;//_nop_();clk=1;}ss=1;}///////////TLV5638在主函数中调用用法//////////////////////////////////// //////////第一步,写CONTROL寄存器、快慢方式、参考电压tlv5638write (0xd001);///// 选择快速模式、1.024V参考电压///////第二步,选择输出电压通道和输出更新value_a=0xc000+value;value_b=0x5000+value;/////////////////value为输出电压值,VOUT=2.048*N/4096 ////单通道输出,A通道输出tlv5638write(value_a);////////////双通道输出,先赋B通道,后A通道tlv5638write (value_b);tlv5638write (value_a);。