基于STC12C5A60S2单片机测电压的c代码

合集下载

STC12C5A60S2编程

STC12C5A60S2编程

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、数据位、停止位。

STC12C5A60S2AD采集12864显示程序

STC12C5A60S2AD采集12864显示程序

STC12C5A60S2AD采集12864显示程序/************************************************************** *************** 文件名:AD_CAIYANG.C* 功能:使用AD采集电压显示在LCD* 说明:本程序是STC12C5A60S2单片机自带AD的采集数据并通过12864液晶串行模式显示的程序*************************************************************** *************/#include//#include#define uint unsigned int#define uchar unsigned charsbit CS=P2^4; //LCD12864串行通信片选sbit SID=P2^5; //LCD12864串行通信数据口sbit SCLK=P2^6; //LCD12864串行通信同步时钟信号sbit PSB=P2^3; //LCD12864并/串选择:H并行 L串行sbit jd1=P2^0; //继电器1控制引脚sbit jd2=P2^1; //继电器2控制引脚sbit fengming=P2^7; //蜂鸣器控制引脚sbit start=P1^0; //开始信号控制引脚unsigned int temp1,sh1,ge1,n1,m1;unsigned char ad_result_data[10]; //AD转换高八位unsigned char ad_result_low2[10]; //AD转换低八位unsigned char ad_result_total[10]; //AD转换总十位unsigned char ad_average_result; //AD转换十次的平均值unsigned char Ain,Vin;unsigned char b,t,R;char tp=0;unsigned char code ma1[6]={0xb5,0xe7,0xd1,0xb9,0xa1,0xc3}; //电压:unsigned char code ma2[]={"."};uchar code disp1[]={" LG "};uchar code disp2[]={" 电压采集 "};uchar code disp3[]={"超级电容检测工装"};unsigned char code num0[]={0xa3,0xb0};unsigned char code num1[]={0xa3,0xb1};unsigned char code num2[]={0xa3,0xb2};unsigned char code num3[]={0xa3,0xb3};unsigned char code num4[]={0xa3,0xb4};unsigned char code num5[]={0xa3,0xb5};unsigned char code num6[]={0xa3,0xb6};unsigned char code num7[]={0xa3,0xb7};unsigned char code num8[]={0xa3,0xb8};unsigned char code num9[]={0xa3,0xb9};//-------模块延时程序---------------------------- 1msvoid delay1ms(uint delay1ms) //STC11F60XE,22.1184M,延时1ms{uint i,j;for(;delay1ms>0;delay1ms--)for(i=0;i<7;i++)for(j=0;j<210;j++);}void delay(uint delay) //STC11F60XE,22.1184M,延时170us{uint i,j;for(;delay>0;delay--)for(i=0;i<124;i++);for(j=0;j<124;j++);}/*******************************************************AD转换程序*******************************************************/void AD_initiate() //初始化函数{ES=0;TMOD=0x21; //定时计数器方式控制寄存器,"自动重装,16位计数器".SCON=0x50; //串行控制寄存器,方便在串口助手那观察TH1=0xfa;TL1=0xfa;TR1=1;}void ADC_Power_On() //AD转换电{ADC_CONTR|=0x80; //打开AD转换电源delay(5); //必要的延时延时一会儿等待AD供电电源稳定}void get_ad_result() //取AD结果函数,它是十位AD转换,每十次平均,最后取低八位作为AD采样数据{uint i,q=0;for(i=0;i<10;i++){tp=0;ADC_RES=0; //高八位数据清零,STC12C5A60S2 AD数据寄存名与STC12C54××系列不同ADC_RESL=0; //低两位清零ADC_CONTR|=0x08; //启动AD转换while(!tp) //判断AD转换是否完成{tp=0x10;tp&=ADC_CONTR;}ADC_CONTR&=0xe7;ad_average_result=ADC_RES;q=q+ad_average_result;}ad_average_result=q/10;//ad_average_result=ad_average_result*4*5000/1024;}/************************AD转换结束***********************/void send_ad_result() //取AD结果函数发送到串口,方便调试{SBUF=n1;while(TI==0) ;TI=0;delay1ms(100);//SBUF=R>>4;}//---------------------电压采样程序-------------------------void caiyangP10() //测电压{P1M0|=0x01; //设P1_0为开漏模式如: P1_0= #00000000B P1M1|=0x01;ADC_CONTR=0xe0; //设置P1.0为输入AD转换口delay(2);get_ad_result(); //取转换数据Vin=ad_average_result;// R=Vin;}/*-----------写控制字到LCD12864------------*/void write_cmd(uchar cmd){uchar i;uchar i_data;i_data=0xf8; //命令控制字:11111000写指令11111010写数据11111100读状态 11111110读数据CS=1; //片选置高,才能进行读写操作SCLK=0;/*----------写命令控制字-----------------*/for(i=0;i<8;i++) //循环八次,每次读取一位数据{SID=(bit)(i_data&0x80); //bit表示取其最高位SCLK=0;SCLK=1; //正跳变写入指令i_data=i_data<<1; //左移一位}/*---------------------------------------*//*----------写指令高四位-----------------*/i_data=cmd;i_data=i_data&0xf0; //把低四位置0for(i=0;i<8;i++) //循环八次,每次读取一位数据{SID=(bit)(i_data&0x80); //bit表示取其最高位SCLK=0;SCLK=1; //正跳变写入指令i_data=i_data<<1; //左移一位}/*---------------------------------------*//*----------写指令低四位-----------------*/i_data=cmd;i_data=i_data<<4; //左移四位,把低四位的数据移到高四位,再把低四位置0for(i=0;i<8;i++) //循环八次,每次读取一位数据{SID=(bit)(i_data&0x80); //bit表示取其最高位SCLK=0;SCLK=1; //正跳变写入指令i_data=i_data<<1; //左移一位}/*-----------------------------------------*/CS=0; //把片选置低delay1ms(5); //延时是因为没有进行忙检测,适当的延时可以不进行忙检测}/*-----------------------------------------*//*------------写数据到LCD12864-------------*/void write_dat(uchar dat){uchar i;uchar i_data;i_data=0xfa;CS=1;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=dat;i_data=i_data&0xf0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=dat;i_data=i_data<<4;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}CS=0;delay1ms(5);}/*-----------------------------------------*//*--------------显示坐标-------------------*/void lcd_pos(uchar x,uchar y) //汉字显示坐标,x为哪一行,y 为哪一列{uchar pos;if(x==0)x=0x80; //第一行else if(x==1)x=0x90; //第二行else if(x==2)x=0x88; //第三行else if(x==3)x=0x98; //第四行pos=x+y; //显示哪一行(总共有4行)哪一竖(总共有8竖,每16列为1竖)write_cmd(pos);}/*-----------------------------------------*//*--------------显示8个汉字-------------------*/void disp_hanzi(uchar code *chn){uchar i;write_cmd(0x30); //基本指令操作方式for(i=0;i<16;i++) //16列*8个汉字=128(刚好)write_dat(chn[i]);}/*-----------------------------------------*//*--------------显示数字-------------------*/void disp_num(uchar code *chn){uchar i;write_cmd(0x30); //基本指令操作方式for(i=0;i<2;i++) //1个数字write_dat(chn[i]);}void disp_number(uchar num){switch(num){case 0: disp_num(num0);break;case 1: disp_num(num1);break;case 2: disp_num(num2);break;case 3: disp_num(num3);break;case 4: disp_num(num4);break;case 5: disp_num(num5);break;case 6: disp_num(num6);break;case 7: disp_num(num7);break;case 8: disp_num(num8);break;case 9: disp_num(num9);break;default: break;}}/*----------- --LCD初始化------------------*/ void lcd_init(){PSB=0;write_cmd(0x30); //基本指令write_cmd(0x02); //地址归位write_cmd(0x06); //游标右移write_cmd(0x0c); //整体显示write_cmd(0x01); //清屏}/*-----------------------------------------*/ void displayP10(){float ad1;//unsigned int temp1,sh1,ge1,n1,m1;//uchar code dis2[]={0x01,0x02,0x00};//ad1=x*7.8125; //电压修正uchar i;// ad1=Vin*3.9608; //具体线性参数由输入电压值调整,该值的测量范围为0-10.00V,5V左右的测量比较准确,//两端的最大误差为70mv,其他一般在40mv以内ad1=Vin*2;temp1=(int)ad1;/* sh1=temp1/1000; //十位ge1=(temp1%1000)/100; //个位n1=((temp1%1000)%100)/10; //小数点后一位m1=((temp1%1000)%100)%10; //小数点后二位 */sh1=temp1/1000; //十位ge1=(temp1%1000)/100; //个位n1=(temp1%100)/10; //小数点后一位m1=temp1%10; //小数点后二位//write_cmd(0x01);write_cmd(0x30); //基本指令操作方式lcd_pos(0,0);for(i=0;i<6;i++)write_dat(ma1[i]);lcd_pos(0,3);disp_number(sh1);lcd_pos(0,4);disp_number(ge1);lcd_pos(0,5);for(i=0;i<2;i++) write_dat(ma2[i]);lcd_pos(0,6);disp_number(n1);lcd_pos(0,7);disp_number(m1);lcd_pos(1,0);disp_hanzi(disp1); lcd_pos(2,0);disp_hanzi(disp2);lcd_pos(3,0);disp_hanzi(disp3); delay1ms(5);}init ()start=1;jd1=0;jd2=0;fengming=0;}void main(){EA=1;AD_initiate(); //初始化ADC_Power_On(); //开AD电源init();lcd_init();delay(10);while(1){caiyangP10(); //测电压if(start==0){delay(10)if(start==0){if(Vin*2>1)jd1=1;else if(Vin*2<1)jd2=1;}send_ad_result(); //Vin=Vin*4007; displayP10(); delay(10);}}。

STC12C5A60S2自带10位AD测量电压值LCD1602显示(C程序)教学文稿

STC12C5A60S2自带10位AD测量电压值LCD1602显示(C程序)教学文稿
void lcd_char_write(uint x_pos,y_pos,lcd_dat);//LCD1602字符写入
void lcd_bad_check();//LCD1602坏点检查
void Num_to_Disp(uchar i, uint Num);//显示数据处理
void LcdDisp(uchar j, uint num);//液晶显示函数
/*--************************芯片:【STC12C5A60S2】******************************--*/
/*--************************液晶:【LCD1602】***********************************--*/
sfr ADC_RESL = 0xBE; //ADC low 2-bit result register
sfr P1ASF = 0x9D; //P1口功能控制寄存器P1ASF
/************定义相应操作位***************/
#define ADC_POWER 0x80 //ADC电源控制位,0:关闭,1:打开
typedef unsigned char uchar;
typedef unsigned int uint;
#define _Nop() _nop_()
/*------------------------以下为LCD1602显示模块定义-----------------------*/
unsigned char data_char_table[]= {"0123456789ABCDEF"};//LCD数据
/*---------------------------------------------------------------------------------------------------------------------------*/

STC12C5A60S2单片机数字电压表的设计 精品

STC12C5A60S2单片机数字电压表的设计 精品

基于STC12C5A60S2单片机数字电压表的设计实训目的:1、对安全用电知识的基本了解1) 了解一般情况下对人体的安全电流和电压,了解触电事故的发生原因及安全用电的原则。

2) 掌握用电安全操作技术。

3) 培养严谨的科学作风和良好的。

2、常用工具的基本使用1) 了解常用电工电子工具的用途、规格;2) 掌握常用电工电子工具的使用方法和注意事项。

3 、数字电压表的组装1) 了解电路的原理,掌握数字电压表的作用。

2) 注意安全,先接线,在通电。

4、一般室内电气线路的安装1) 了解室内电路的原理,掌握各个元件的作用。

2) 注意电器间的连接,注意安全。

3) 增强动手、合作能力。

5、常用电子仪器的使用1) 了解直流稳压电源、万用表、信号发生器、示波器等常用电子仪器的功能。

2) 掌握直流稳压电源、万用表、信号发生器、示波器的基本操作方法,为后续实习打下基础。

6、常用电子元器件的认识和检测1) 通过实物认识各种常用的电子元器件。

2) 掌握常用电子元器件参数的识读方法。

3) 掌握使用万用表测量常用电子元器件参数的方法。

4) 通过简单的实验,了解常用电子元器件的功能。

7、常用工具的使用(二)1) 了解常用电工电子工具的用途、规格;2) 掌握常用电工电子工具的使用方法和注意事项。

8、焊接工艺焊接训练1) 掌握焊接工艺的方法,了解焊接工具的原理。

2) 安全用电和注意事项9、电子整机产品装配(数字电压表的制作)1) 掌握数字电压表的电路原理、元件的作用。

2) 学会检测各个元件的好坏、3) 独立动手能力10、印制电路板(PCB)的制作1) 了解印制电路板的功能和种类。

2) 了解PCB板的快速制作方法。

3) 简单了解专业电路板厂PCB板制作的流程和工艺。

11、电路组装及调试1) 了解热转印法制作PCB板的工艺流程;2) 掌握使用热转印法来制作PCB板的技能。

实训时间、地点:第十七周,第十八周工程训练中心实训内容:第1章引言在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。

STC单片机内部ADC采集电压用数码管显示

STC单片机内部ADC采集电压用数码管显示

STC单片机内部ADC采集电压用数码管显示////////////////////////////////////////////////////////////////////////////////////////////////////// ///特点:/// ///1、数码管显示用中断方式/// ///2、STC12C5A60S2内ADC采样电压值,先采样30次然后去掉上下10个再取平均值/// ///3、采集数据用串口发送到PC /// ///------------------------------------------------------------------------shenzhen---iqss----2011/02/23--------/// //////////////////////////////////////////////////////////////////////////////////////////////////////#include <reg51.h>#define uchar unsigned char#define uint unsigned int#define segp P0#define scanp P2uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //不带点段驱动信号uchar code tab_d[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带点段驱动uchar code scan[]={0xfe,0xfd,0xfb,0xf7}; //位扫描驱动信号uint display[4]={0,0,0,0}; //初始显示数字uint con=0, _data=0,data2=0; //con显示循环变量_data为ADC采样值临时变量data显示数据临时变量sfr P1ASF=0x9d; //下面五行为ADC定义sfr ADC_CONTR=0xbc;sfr ADC_RES=0xbd;sfr ADC_RESL=0xbe;sfr AUXR1=0xa2;void t0_t1_init(); //t0显示扫描定时器和t1串口比特率定时器初始化函数void adc_init(); //adc初始化函数void uart_out(uchar byte); //串口发送字节函数uint average(uint buffer[30]); //采样数据处理函数void AD(); //电压采样30次函数void delay1ms(uchar x); //延时函数void main(){t0_t1_init();adc_init();while(1){AD();}}/////////定时器初始化///////void t0_t1_init(){ SCON=0x50;PCON=0;TMOD=0x21;TH1=TL1=0xe6;TH0=0xf0;TL0=0x60;EA=ET0=1;// ES=1;TR1=1;TR0=1;}/////ADC初始化///////void adc_init(){ P1ASF=0x01; //启动P10为ADC模拟输入口把内部上拉电阻断开AUXR1 &= 0xfb; //adrj_0 高8位在ADC_RESADC_RES=0; //初值ADC_CONTR=0x80; //开启ADC电源SPEED_1_1,chs000(选择AD采样通道p10) delay1ms(2);// IE|=0xa0;}//////采集30次电压值//////void AD(){ char i;uint temp_buf[30]={0};for(i=0;i<30;i++){ ADC_CONTR |=0x08; //开启转换while((ADC_CONTR&0x10)==0);ADC_CONTR &=0xe7; //清除标志temp_buf[i]=ADC_RES; //取出数值到temp_buf}_data=average(temp_buf); //采样30次后的数据代入处理函数处理后返回处理后的数值,给下面用串口发送出去uart_out(_data);}/////先对整个数组的三十个值进行从小到大的排列,/////////再去掉最大5个和最少5个再求平均值;函数返回temp值///uint average(uint buffer[30]){uchar i,j;uint temp;for(i=1; i<30; i++)for(j=29; j>=i; --j){if(buffer[j-1] > buffer[j]){temp = buffer[j-1];buffer[j-1] = buffer[j];buffer[j] = temp;}}temp = 0;for(i=5; i<25; i++){temp += buffer[i];}temp = (uint)(((float)temp) / 20 + 0.5);return(temp);}///显示数据处理及扫描显示中断服务函数//// void t0_4ms(void) interrupt 1{data2=_data;data2=_data*19.53;display[3]=tab_d[data2/1000];display[2]=tab[(data2/100)%10];display[1]=tab[(data2/10)%10];display[0]=tab[data2%10];TH0=0xf0;TL0=0x60;if(++con==5) con=1;// segp=0xff;segp=display[con-1];scanp=scan[con-1];}///串口发送节字函数////void uart_out(uchar byte){ SBUF=byte;while(TI==0);TI=0;}///1ms延时////void delay1ms(uchar x){ uchar i,j;for(i=0;i<x;i++)for(j=0;j<250;j++); }。

基于STC12C5A60S2单片机数字电压表的设计

基于STC12C5A60S2单片机数字电压表的设计

基于STC12C5A60S2单片机数字电压表的设计专业班级:电子信息工程二班学号:xxx姓名:xxx指导教师:xxx基于STC12C5A60S2单片机数字电压表的设计实训目的:1、对安全用电知识的基本了解1) 了解一般情况下对人体的安全电流和电压,了解触电事故的发生原因及安全用电的原则。

2) 掌握用电安全操作技术。

3) 培养严谨的科学作风和良好的工作作风。

2、常用工具的基本使用1) 了解常用电工电子工具的用途、规格;2) 掌握常用电工电子工具的使用方法和注意事项。

3 、数字电压表的组装1) 了解电路的原理,掌握数字电压表的作用。

2) 注意安全,先接线,在通电。

4、一般室内电气线路的安装1) 了解室内电路的原理,掌握各个元件的作用。

2) 注意电器间的连接,注意安全。

3) 增强动手、合作能力。

5、常用电子仪器的使用1) 了解直流稳压电源、万用表、信号发生器、示波器等常用电子仪器的功能。

2) 掌握直流稳压电源、万用表、信号发生器、示波器的基本操作方法,为后续实习打下基础。

6、常用电子元器件的认识和检测1) 通过实物认识各种常用的电子元器件。

2) 掌握常用电子元器件参数的识读方法。

3) 掌握使用万用表测量常用电子元器件参数的方法。

4) 通过简单的实验,了解常用电子元器件的功能。

7、常用工具的使用(二)1) 了解常用电工电子工具的用途、规格;2) 掌握常用电工电子工具的使用方法和注意事项。

8、焊接工艺焊接训练1) 掌握焊接工艺的方法,了解焊接工具的原理。

2) 安全用电和注意事项9、电子整机产品装配(数字电压表的制作)1) 掌握数字电压表的电路原理、元件的作用。

2) 学会检测各个元件的好坏、3) 独立动手能力10、印制电路板(PCB)的制作1) 了解印制电路板的功能和种类。

2) 了解PCB板的快速制作方法。

3) 简单了解专业电路板厂PCB板制作的流程和工艺。

11、电路组装及调试1) 了解热转印法制作PCB板的工艺流程;2) 掌握使用热转印法来制作PCB板的技能。

用stc12c5a60s2单片机采集交流电压并计算其有效值(普中科技hc6800为硬件)

用stc12c5a60s2单片机采集交流电压并计算其有效值(普中科技hc6800为硬件)

while(TF1==0); //因为步长大于ad采集时间,所以此处会进入ad中断取!!ADC_RES》bus!!等待定时器控制步长完再把数bus>>zhi[i]
TF1=0;//软件查询,需软件清中断申请位
TR1=0;//此处关闭为了不让它再计时***定时器计满溢出回零之后(方式0、1、3) 会重新开始从零计数 所以要先关闭再说 ****
#define ADC_SPEEDHH 0X60
unsigned char CH2=2;//通道 p1^2
unsigned char CH7=7;//通道 p1^7
//***步长所用变量
int Gbuchang,Lbuchang;
//***遍数,取数个数,开断及等待控制部分所用变量
char N=qshu,M=bianshu;
kd=0;//开断标志位
flag1=1;//用“1”符合逻辑!控制开始与结束标志位
CH2=2;//通道 p1^2 辅助置ADC_CONTR的通道位
CH7=7;//通道 p1^2 辅助置ADC_CONTR的通道位
//***取数部分所用变量
bus=0;//数据传输 媒介(实数) 数据区
TH1=Gbuchang;
TL1=Lbuchang;
cankao=bus;//cankao为标准电压的数字量
bus=0;//清零
}
EA=0;
flag1=1;
zhi3[geshu+2]=geshu;//显示个数
//******P1^7为参考电压,P1^2为待测电压接口
#include<reg51.h>
#include<math.h>

STC12C5A60S2-AD电压高级采集

STC12C5A60S2-AD电压高级采集

STC12C5A60S2-AD电压高级采集/*使用STC单片机内置10AD(仅用高八位,分辨率为5mV)做的简易电压表*//*本程序AD部分使用了深圳宏晶公司官方AD转换示范程序修改, 特此鸣谢*//*使用STC12C5A60S2 1T单片机,12M外部晶振,Keil V3编译通过,AD转换脚定义为P1.1, *//*使用芯片本身5V电源为基准,在深圳精创电子的51/AVR开发板实现。

8位共阳LED字符码*//*接P0口,位线接在P2口,均为低电平显示,使用右4位。

本显示程序摘自网上,一并感谢。

*//*----2010.07.04 written by autopccopy() */#include <intrins.H>#include <stc12c5a60s2.H> //STC的新头文件0X6D,/*5*/0X7D,/*6*/0X07,/*7*/0X7F,/*8*/0X6F,/*9*/0xFF};void led(int n) //数码管显示及数据处理程序{P0 = 0xFF;P0 = DATA_LED[n % 10]; //个位P20 = 0;delay(1);P20 = 1;P0 = 0xFF;P0 = DATA_LED[n / 10 % 10]; //十位P21 = 0;delay(1);P21 = 1;P0 = 0xFF;P0 = DATA_LED[n / 100 % 10]; //百位 P22 = 0;delay(1);P22 = 1;P0 = 0xFF;P0 = DATA_LED[n / 1000 % 10]; //千位 P23 = 0;P07=0; //千位显示小数点delay(1);P23 = 1;}//---------------------------------------------------------------------INT8U get_AD_result(INT8U channel) //AD 转换部分{INT8U AD_finished=0; //存储 A/D 转换标志ADC_RES = 0; //高八ADC_RESL = 0; //低二位(本例未使用)channel &= 0x07; //0000,0111 清0高5位ADC_CONTR = AD_SPEED;_nop_();ADC_CONTR |= channel; //选择A/D 当前通道_nop_();ADC_CONTR |= 0x80; //启动A/D 电源delay(1); //使输入电压达到稳定ADC_CONTR |= 0x08; //0000,1000 令 ADCS = 1, 启动A/D转换,AD_finished = 0;while (AD_finished ==0 ) //等待A/D转换结束{AD_finished = (ADC_CONTR & 0x10);//0001,0000 测试A/D转换结束否ADC_CONTR &= 0xE7; //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,return (ADC_RES); //返回 A/D 高 8 位转换结果}void delay(INT8U delay_time) // 延时函数{INT16U n;while(delay_time--){n = 100;while(--n);}}//---------------------------同道选择------------------------------------------void ADzhuanhuan1(INT8U zh){INT16U ADC_result;P1ASF = 0x02; //0000,0010, 将 P1.1 置成模拟口AUXR1 &= ~0x04; //0000,0100, 令 ADRJ=0 : 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器ADC_CONTR |= 0x80; //1000,0000 打开 A/D 转换电源while(1){ADC_result =get_AD_result(zh);//P1.1 为 A/D 当前通道,测量并发送结果led(ADC_result*19.53); //显示数值。

基于单片机STC12C5A60S2的应用2

基于单片机STC12C5A60S2的应用2
基于单片机 STC12C5A60S2 及数字电位器 x9c103 的可编程增益放大器设计
#include<reg51.h> #include<stdio.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int
X9C102S I
-40 to 85
8 Ld SOIC
X9C102SIZ* (Note) X9C103P
X9C102S Z I
X9C103P
10
-40 to 85 0 to 70
8 Ld SOIC (Pb-free) 8 Ld PDIP
X9C103PZ (Note)
X9C103P Z
0 to 70
8 Ld PDIP (Pb-free)
• Low power CMOS —VCC = 5V —Active nt, 3mA max. —Standby current, 750µA max.
• High reliability —Endurance, 100,000 data changes per bit —Register data retention, 100 years
if (X9C102==0){ clear_down(); set_x9c103(10,1,1);} if (X9C202==0){ clear_down(); set_x9c103(30,1,1);} if (X9C302==0){ clear_down();
set_x9c103(60,1,1);} if (X9C402==0){ clear_down(); set_x9c103(90,1,1);} } }

智能循迹小车电磁组C语言源代码(stc12c5a芯片)

智能循迹小车电磁组C语言源代码(stc12c5a芯片)
}
void InitADC() //初始化AD函数
{
P1ASF=0XE7; // 1110 0111 //定义为AD转换的IO口
P1M0=0xE7 ; // P1.7-P1.0:1110 0111
case 1: ADC_CONTR=0xea; //定义P1.2口为AD转换 1110 1010
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR&ADC_FALG));
while(1){
GetADCResult(ch); //读取AD值并赋值给变量
kongzhi(); //调用控制函数
}
}
void GetADCResult(BYTE ch) //读取AD的函数
{
ADC_CONTR &=!ADC_FALG;
while(!(ADC_CONTR&ADC_FALG));
ADC_CONTR&=~ADC_FALG; //清除falg位
cg1=ADC_RES; //把传到P1.1口的AD值(二进制)赋值给cg1
break;
CCAP1H=0x00; //右轮
P3=go;
}
else if(bj2>1&&bj2<4/3) //微右拐
{
CCAP0H=0x00; //左轮
CCAP1H=0x18; //右轮
}
void PWM()
{
CCON=0;
CL=0;
CH=0;
CMOD=0X02;
CCAP0H=CCAP0L=0X80;

基于STC12C5A60S2的RC测温程序

基于STC12C5A60S2的RC测温程序

头文件//--------------------------------------------------------------------------------//新一代1T 8051系列单片机内核特殊功能寄存器C51 Core SFRs// 7 6 5 4 3 2 1 0 Reset Valuesfr ACC = 0xE0; //Accumulator 0000,0000sfr B = 0xF0; //B Register 0000,0000sfr PSW = 0xD0; //Program Status Word CY AC F0 RS1 RS0 OV F1 P 0000,0000//-----------------------------------sbit CY = PSW^7;sbit AC = PSW^6;sbit F0 = PSW^5;sbit RS1 = PSW^4;sbit RS0 = PSW^3;sbit OV = PSW^2;sbit P = PSW^0;//-----------------------------------sfr SP = 0x81; //Stack Pointer 0000,0111sfr DPL = 0x82; //Data Pointer Low Byte 0000,0000sfr DPH = 0x83; //Data Pointer High Byte 0000,0000//--------------------------------------------------------------------------------//新一代1T 8051系列单片机系统管理特殊功能寄存器// 7 6 5 4 3 2 1 0 Reset Valuesfr PCON = 0x87; //Power Control SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 0001,0000// 7 6 5 4 3 2 1 0 Reset Valuesfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS 0000,0000//-----------------------------------sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ - DPS 0000,0000/*PCA_P4:0, 缺省PCA 在P1 口1,PCA/PWM 从P1 口切换到P4 口: ECI 从P1.2 切换到P4.1 口,PCA0/PWM0 从P1.3 切换到P4.2 口PCA1/PWM1 从P1.4 切换到P4.3 口SPI_P4:0, 缺省SPI 在P1 口1,SPI 从P1 口切换到P4 口: SPICLK 从P1.7 切换到P4.3 口MISO 从P1.6 切换到P4.2 口MOSI 从P1.5 切换到P4.1 口SS 从P1.4 切换到P4.0 口S2_P4:0, 缺省UART2 在P1 口1,UART2 从P1 口切换到P4 口: TxD2 从P1.3 切换到P4.3 口RxD2 从P1.2 切换到P4.2 口GF2: 通用标志位ADRJ:0, 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器1,10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器DPS: 0, 使用缺省数据指针DPTR01,使用另一个数据指针DPTR1*///-----------------------------------sfr WAKE_CLKO = 0x8F; //附加的SFR WAK1_CLKO/*7 6 5 4 3 2 1 0 Reset ValuePCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_W AKE _ T1CLKO T0CLKO 0000,0000Bb7 - PCAW AKEUP : PCA 中断可唤醒powerdown。

STC12C5A60S2自带10位AD测量电压值LCD1602显示(C程序)

STC12C5A60S2自带10位AD测量电压值LCD1602显示(C程序)

/*---------------------------------------------------------------------------------------------------------------------------*/ /*--************************功能【AD 转换,液晶显示】**************************--*//*--************************芯片:【STC12C5A60S2】******************************--*//*--************************液晶:【LCD1602】***********************************--*//*--************************ADC管脚:【P1.0~P1.7】***************************--*//*--************************检测范围:【0.00~4.99V】***************************--*//*---------------------------------------------------------------------------------------------------------------------------*/ #include"reg52.h"#include"intrins.h"typedef unsigned char uchar;typedef unsigned int uint;#define _Nop() _nop_()/*------------------------以下为LCD1602显示模块定义-----------------------*/unsigned char data_char_table[]={"0123456789ABCDEF"}; //LCD 数据unsigned char Lcd_Dis1_table[]= {"Position:No. "}; //第一行显示框架unsigned char pos_char_table[]= {" D "}; //显示位置unsigned char Lcd_Dis2_table[]= {"Voltage: V"}; //第二行显示框架unsigned char num_char_table[]= {" 9A.CD V"}; //显示位置sbit lcd_rs_port=P2^7; //定义LCD 控制端口,根据硬件调整sbit lcd_rw_port=P2^6;sbit lcd_en_port=P2^4;#define lcd_data_port P0void lcd_delay(uchar ms);//LCD1602延时void lcd_busy_wait(); //LCD1602忙等待void lcd_command_write(uint command); //LCD1602命令字写入void lcd_system_reset(); //LCD1602初始化voidlcd_char_write(uint x_pos,y_pos,lcd_dat); //LCD1602字符写入voidlcd_bad_check(); //LCD1602坏点检查void Num_to_Disp(uchar i, uint Num); //显示数据处理void LcdDisp(uchar j,uint num); //液晶显示函数/*------------------------以下为ADC 相应寄存器初始化及端口定义-------------*//***** 定义与ADC 相关的特殊功能寄存器*****/sfr ADC_CONTR = 0xBC; //ADC 控制寄存器sfr ADC_RES = 0xBD; //ADC hight8-bit result register sfr ADC_RESL = 0xBE; //ADC low2-bit result registersfr P1ASF = 0x9D; //P1 口功能控制寄存器P1ASF/************定义相应操作位***************/#define ADC_POWER0x80//ADC 电源控制位,0:关闭,1:打开#define ADC_FLAG 0x10//ADC 结束标志位#define ADC_START0x08 //ADC 启动控制位#define ADC_SPEEDLL 0x00 //540clocks___________选择转换速度/*------------------------以下为相关函数声明------------------------------*/void InitADC();uuuu GetADCResult(uchar ch);vvvv Delay(uint n);void delay_1ms(uchar x);/*-------------------------------- 主函数--------------------------------*/ void main(){//ADC 初始化//延时程序uchar i;lcd_system_reset(); //LCD1602 初始化lcd_bad_check(); //LCD1602 坏点检查InitADC(); //初始化ADC 特殊功能寄存器while(1){i = 0;while(i < 7){LcdDisp(i, GetADCResult(i)); //液晶1602 显示输入电压值(P1.0 -P1.7)Delay(1000);i++;}}}/*-------------------------------- ADC 取值------------------------------*/uint GetADCResult(uchar ch){ADC_CONTR= ADC_POWER | ADC_SPEEDLL | ch | ADC_START;_nop_(); //Must wait before inquiry_nop_();_nop_();_nop_();while(!(ADC_CONTR & ADC_FLAG)); //Wait complete flagADC_CONTR&=ADC_FLAG;//Close ADCreturn (ADC_RES*4+ ADC_RESL); //Return ADC result}/*---------------------------- 初始化ADC 特殊功能寄存器-------------------*/void InitADC(){P1ASF=P1|0x3f;//Set P1.0 - P1.5 as analog input portADC_RES = 0; //Clear previous resultADC_RESL =0;ADC_CONTR= ADC_POWER | ADC_SPEEDLL ;Delay(20); //ADC power-on delay and Start A/D conversion}/*---------------------------- LCD1602相应函数---------------------------*////////////////以下为LCD 显示数据处理/////////////////void Num_to_Disp(uchar i, uint Num){float NUM;int xx,yy,zz;NUM=(Num*5/1024.0); //计算公式:10-bit A/D Conversion Result = 1024x(Vin/Vcc) xx = (int)NUM;yy= (int)((NUM-(float)(xx)) * 10);zz= (int)((NUM-(float)(xx)) * 100)%10;num_char_table[9] = data_char_table[xx/ 10]; //电压值十位num_char_table[10]=data_char_table[xx% 10]; //电压值个位num_char_table[12]=data_char_table[yy]; //电压值小数点后一位num_char_table[13]=data_char_table[zz]; //电压值小数点后两位?pos_char_table[13]=data_char_table[i]; //当前ADC接口}//////////////////以下为LCD 显示////////////////////void LcdDisp(uchar j,uint num){uint i=0;for (i=0;i<16;i++){lcd_char_write(i,0,Lcd_Dis1_table[i]);lcd_char_write(i,1,Lcd_Dis2_table[i]); //显示框架}Num_to_Disp(j,num);lcd_char_write(13,0,pos_char_table[13]);for(i =9;i<14;i++){lcd_char_write(i,1,num_char_table[i]); //显示电压}delay_1ms(100);}//////////////以下是LCD1602驱动程序////////////////void lcd_delay(uchar ms)/*LCD1602 延时*/{uchar j;while(ms--){for(j=0;j<250;j++){;}}}void lcd_busy_wait()/*LCD1602忙等待*/{lcd_rs_port=0;lcd_rw_port=1;lcd_en_port=1;lcd_data_port=0xff;while(lcd_data_port&0x80);lcd_en_port=0;}void lcd_command_write(uint command) /*LCD1602命令字写入*/ {lcd_busy_wait();lcd_rs_port=0;lcd_rw_port=0;lcd_en_port=0;lcd_data_port= command;lcd_en_port=1;lcd_en_port=0;}void lcd_system_reset()/*LCD1602 初始化*/{lcd_delay(20);lcd_command_write(0x38);lcd_delay(100);lcd_command_write(0x38);lcd_delay(50);lcd_command_write(0x38);lcd_delay(10);lcd_command_write(0x08);lcd_command_write(0x01);lcd_command_write(0x06);lcd_command_write(0x0c);}void lcd_char_write(uint x_pos,y_pos,lcd_dat) /*LCD1602 字符写入*/ {x_pos &= 0x0f;/*X 位置范围0~15*/y_pos &= 0x01;/*Y 位置范围0~1*/if(y_pos==1)x_pos+=0x40;x_pos += 0x80;lcd_command_write(x_pos);lcd_busy_wait();lcd_rs_port=1;lcd_rw_port=0;lcd_en_port=0;lcd_data_port=lcd_dat;lcd_en_port=1;lcd_en_port=0;}void lcd_bad_check()/*LCD1602坏点检查*/{char i,j;for(i=0;i<2;i++){for(j=0;j<16;j++){lcd_char_write(j,i,0xff);}}lcd_delay(200);lcd_delay(200);lcd_delay(200);lcd_delay(100);lcd_delay(200);lcd_command_write(0x01);/* clear lcd disp */}//////////////////以上是LCD1602驱动程序/////////////////*-----------------------------void Delay(uint n){uint x;while(n--){}延时程序x = 500;while(x--);---------------------------*/}/*1MS 为单位的延时程序*/ void delay_1ms(uchar x){uchar j;while(x--){for(j=0;j<125;j++){;}}}。

STC12C5A60S2内部PWM模块程序

STC12C5A60S2内部PWM模块程序
#define uint unsigned int
//新一代1T 8051系列单片机PCA/PWM特殊功能寄存器
// 7 6 5 4 3 2 1 0 Reset Value
sfr CCON = 0xD8; //PCA控制寄存器。CF CR - - - - CCF1 CCF0 00xx,xx00
//-----------------------
STC12C5A60S2内部PWM模块程序
/**************************************************************
*******************************
说明:单片机的PCA_PWM使用,60S2只有两个PWM输出,分别是1.3
// 1 1 1 0 0 1 1 0x73 PWM输出由低变高或由高变低都可产生中断
//-----------------------
sfrCCAP0L=0xEA;//PCA模块0的捕捉/比较寄存器低8位。0的捕捉/比较寄存器高8位。
0000,0000
sfrCCAP1L=0xEB;//PCA模块1的捕捉/比较寄存器低8位。
0000,0000
sfrCCAP1H=0xFB;//PCA模块1的捕捉/比较寄存器高8位。
0000,0000
//-----------------------
// 7 6 5 4 3 2 1 0 Reset Value
sfrPCA_PWM0=0xF2;//PCA模块0PWM寄存器。------EPC0H
EPC0L xxxx,xx00
sfrPCA_PWM1=0xF3;//PCA模块1PWM寄存器。------EPC1H

基于某STC12C5A60S2单片机触摸式线性直流稳压电源的设计

基于某STC12C5A60S2单片机触摸式线性直流稳压电源的设计

基于STC12C5A60S2单片机触摸式线性直流稳压电源的设计一、任务设计一个直流稳压电源,用触摸的方式调节输出电压值。

二、要求:采用220V市电供电。

1、基本要求(1)输出电压1.25V~6V;(2)用手触摸实现电压增减调节,电压步进0.2V;(3)纹波<10mV,输出电流不小于1A;(4)显示输出电压;(5)具有过载保护功能,负载恢复后可自动恢复;2、发挥部分(1)扩展输出电压为0~15V;(2)电压步进0.05V;(3)扩展最大输出电流至3A;(4)显示输出电流,过载电流可分6档设定;(5)其它;三、评分标准1.1总体方案设计1.2设计方案论证与比较1.2.1主控电源部分的设计比较与选择方案一:采用电源稳压芯片MC78L18CP, MC79L18CP, MC78L15CP和MC79L15CP各一块,做得输出电压分别为+18V,-18V,+15V,-15V的稳压电源。

其中+18V和-18V 为运放供电,+15V和-15V作为基准电压源,与DA输出电压比较,输出0V~15V 和0V~-15V可调的电压值。

该方案用分立元件设计主控电源,使得纹波较大,且硬件可靠性降低。

方案二:采用电源稳压芯片LM7818,L7918CV,LM7815和L7915CV各一块,并做好分别能输出+18V,-18V,+15V和-15V的线性稳压电源。

其中+18V和-18V为运放供电,+15V和-15V作为基准电压源,与DA输出电压比较,输出0V~15V和0V~-15V可调的电压值。

该方案的特点是电路结构简单实用,而且纹波很小,硬件可靠易于控制。

方案比较与选择:由于以上各稳压芯片都能实现各自的功能要求,但基于方案对输出电压的质量要求很高,所以选择实验室存有的LM7818,L7918CV,LM7815和L7915CV稳压芯片。

充分利用现有条件,实现电路功能。

所以选择方案二。

其电路图如图1.2.1。

图1.2.11.3辅助电源经过变压器降压,滤波电路和稳压芯片LM7805稳压后,做成简单线性稳压电源。

基于某STC12C5A60S2单片机数字电压表地设计

基于某STC12C5A60S2单片机数字电压表地设计

数字电压表的设计第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单片机系统,数码管显示系统、时钟电路、复位电路档位调节电路以与测量电压输入电路。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
//------------------------------------------------------------------------------
void display(void)
{ char i,scan;
char times=20;
whlie(--time>=0)
serial_init(); //串口初始化
while(1)
{
unsigned char i;
for(i=0;i<8;i++) //循环发送P1.0-P1.7的转换数值
{
TI=1; //使用printf函数前须先将发送标志位TI置1
printf("The P1.%bd voltage is %f\n",i,AD_work(i));
void dataproc(unsigned char);
void display();
void delay1ms(char);
void AD_init();
void serial_init();
void delay(unsigned int a);
float AD_work(unsigned char channel);
#include"stc12c5a.h" //头文件在STC公司主页上下载
#include"stdio.h"
#include"intrins.h"
#include<reg51.h>
char code TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98};
{scan=1;
for(1=0;i<4;i++)
{SCAG7P=0xff;
SCANP=~scan;
SEG7P=TAB[disp[i]];
delay1ms(4);
scan<<=1;
}
}
}
//------------------------------------------------------------------------------
{
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
BRT = 0xD9; //设定独立波特率发生器重装值
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
void dataproc(unsign char data_in)
{ int result;
result=data_in;
disp[3]=result/1000;
disp[2]=(result/100)%10;
disp[1]=(result/10)%10;
disp[0]=(result)%10;
void delay(unsigned int ms) //延时约1ms
{
unsigned char a,b,c;
while(ms--)
{
for(c=1;c>0;c--)
for(b=222;b>0;b--)
for(a=12;a>0;a--);
#define SCANP P0
#define SEG7P P2
//------------------------------------------------------------------------------
unsigned char disp[4]={0,0,0,0};
float abc;
unsigned int AD_get(unsigned char channel)
{
ADC_CONTR=0x88|channel; //开启AD转换1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
_nop_(); _nop_(); _nop_(); _nop_();//要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器
abc=AD_work(i)*1000;
s=(int)abc;
dataproc(s);
delay(1000); //延时约1s
TI=0;
}
}
}
//------------------------------------------------------------------------------
unsigned int AD_get(unsigned char channel);
//------------------------------------------------------------------------------
void main()
{
AD_init(); //A/D转换初始化
}
}-------------------------------------------------------
void serial_init() //初始化模块从STC软件的波特率计算器拷贝过来的
AUXR |= 0x10; //启动独立波特率发生器
}}
//------------------------------------------------------------------------------
void AD_init()
{
P1ASF=0xff; //P1口全部作为模拟功能AD使用
while(!(ADC_CONTR&0x10)); //等待转换完成
ADC_CONTR&=0xe7; //关闭AD转换,ADC_FLAG位由软件清0
return(ADC_RES*4+ADC_RESL); //返回AD转换完成的10位数据(16进制)
}
//------------------------------------------------------------------------------
float AD_work(unsigned char channel)
{
float AD_val; //定义处理后的数值AD_val为浮点数
unsigned char i;
for(i=0;i<100;i++)
AD_val+=AD_get(channel); //转换100次求平均值(提高精度)
AD_val/=100;
AD_val=(AD_val*5)/1024; //AD的参考电压是单片机上的5v,所以乘5即为实际电压值
return AD_val;
}
//------------------------------------------------------------------------------
void delay1ms(charx)
{int i,j;
for(i=0;i<x;i++);
for(j=0;j<120;j++);
}
ADC_RES=0; //清零转换结果寄存器高8位
ADC_RESL=0; //清零转换结果寄存器低2位
ADC_CONTR=0x80;//开启AD电源
delay(2); //等待1ms,让AD电源稳定
}
//------------------------------------------------------------------------------
相关文档
最新文档