当前位置:文档之家› 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、数据位、停止位。

效验位无(11.0592) // //TH1 = 0xF3; //baud*2 /* 波特率、数据位、停止位。

效验位无(12M)// TH1 = 0xFa;// TL1 = 0xFa;// TR1 = 1;// ES = 1; //开串口中断// EA = 1; // 开总中断//}//void delay1ms(unsigned int delay1ms)//{// unsigned int i,j;// for(;delay1ms>0;delay1ms--)// for(i=0;i<7;i++)// for(j=0;j<210;j++);//}void Uart_Init(void) //使用独立波特率发生器作为波特率发生器{SCON = 0x50; //0101,0000 8位可变波特率,无奇偶校验位BRT = 0xfd;AUXR = 0x11;//0001 0001// T0x12,T1x12,UART_M0x6,BRTR,S2SMOD,BR Tx12,XRAM,S1BRS// Baud = Fosc/(256 - RELOAD_COUNT)/32/12 (12T模式)// Baud = Fosc/(256 - RELOAD_COUNT)/32 (1T模式)// BRTR = 1,启动独立波特率发生器// S1BRS = 1,串口选择独立波特率发生器作为波特率发生器,// 此时定时器可以释放出来作为定时器,计数器,时钟输出使用//AUXR1 = 0x80; //释放该行指令,则串行口从P3口切换到P1口ES = 1; //允许串口中断EA = 1; //开总中断}//void send_UART(unsigned char i)//{// ES = 0; //关串口中断// //TI = 0; //清零串口发送完成中断请求标志// SBUF = i;// while(TI ==0); //等待发送完成// TI = 0; //清零串口发送完成中断请求标志// delay1ms(10);// ES = 1; //允许串口中断//}void UART_Interrupt_Receive(void) interrupt 4{unsigned char k = 0;if(RI==1){RI=0;k=SBUF;USART_Send_Byte(k);}else{TI=0;}}void USART_Send_Byte(unsigned char Data){SBUF=Data;while (!TI);TI=0;}void USART_Send_Enter(void){USART_Send_Byte(0x0d);USART_Send_Byte(0x0a);}void USART_Send_Str(char *Data){unsigned char i;unsigned char len = strlen(Data)-1;for (i=0; i<len; i++){USART_Send_Byte(Data[i]);}if(Data[i]=='\n'){USART_Send_Enter();}else{USART_Send_Byte(Data[i]);}}void numtostr(unsigned int dat,char *str) {char temp[20];unsigned int i=0,j=0;i=0;while(dat){temp[i]=dat%10+0x30;i++;dat/=10;}j=i;for(i=0;i<j;i++){str[i]=temp[j-i-1];}if(!i) {str[i++]='0';}str[i]=0;}void USART_Put_Num(unsigned int dat) {char xdata temp[10];numtostr(dat,temp);USART_Send_Str(temp);}//void uart_delay(unsigned int i)//{// unsigned char j;// for(i; i > 0; i--)// for(j = 200; j > 0; j--) ;////}KEY#include<STC12C5A60S2.H>//#include <intrins.h> //51基本运算(包括_nop_空函数)#include"uart.h"#include"pwm.h"#include"KEY.h"#include"ad.h"unsigned int xdata KeyNumV al=0,Second=0;unsigned int xdata FrequencyBit=1, FrequencyTen=2,FrequencyHundred=3,conter=0; extern unsigned char code dispcode[11];extern unsigned int xdata Frequency;extern unsigned int xdata mode;bit flag=0;void display(void){int j;P2=0xef; //1110 1111if(KeyNumV al==1){if(flag)P0=0xff;elseP0=dispcode[FrequencyBit];}elseP0=dispcode[FrequencyBit]; //显示number的个位delay(7);P2=0xdf; //1101 1111if(KeyNumV al==2){if(flag)P0=0xff;elseP0=dispcode[FrequencyTen];}elseP0=(dispcode[FrequencyTen]); //显示number的十位delay(7);P2=0xbf; //1011 1111if(KeyNumV al==3){if(flag)P0=0xff;elseP0=dispcode[FrequencyHundred];}elseP0=(dispcode[FrequencyHundred]); //显示number的百位delay(7);P2=0x7f; //1011 1111 P0=(dispcode[0]); //显示number的千位delay(7);j++;if(10==j) //延时闪烁时间{j=0;flag=!flag;}if(KeyNumV al==4)Frequency=FrequencyHundred*100+FrequencyTen*10+FrequencyBit; }void key_scan(void){if(KEY3==0){while(!KEY3) //防止掉显{ ;}switch(KeyNumV al){case 1:FrequencyBit++;if(FrequencyBit>9)FrequencyBit=0;break;case 2:FrequencyTen++;if(FrequencyTen>9)FrequencyTen=0;break;case 3:FrequencyHundred++;if(FrequencyHundred>9)FrequencyHundred=0;break;default:break;}}if(KEY4==0){while(!KEY4) //防止掉显{ ;}switch(KeyNumV al){case 1:FrequencyBit--;if(FrequencyBit>9)FrequencyBit=9;break;case 2:FrequencyTen--;if(FrequencyTen>9)FrequencyTen=9;break;case 3:FrequencyHundred--;if(FrequencyHundred>9)FrequencyHundred=9;break;default:break;}}}void exit2(void) interrupt 2{EX1=0; //关外部中断//delay(100);if( mode==1){KeyNumV al++;USART_Put_Num(KeyNumV al);if(KeyNumV al>4)KeyNumV al=0;}EX1=1; //开外部中断}Main#include<STC12C5A60S2.H>//#include <intrins.h> //51基本运算(包括_nop_空函数)#include"uart.h"#include"ad.h"#include"pwm.h"#include"KEY.h"long xdata temp=0,aa,bian=0;unsigned int xdata pwmvalue=0;unsigned int xdata mode=0,LedNumVal_1=0; //计数按键次数extern unsigned int xdata KeyNumV al;unsigned int xdata Dutycycle=0;extern unsigned int xdata HighLevel,Frequency;//保存(高电平)周期的变量=两次捕捉数据之差保存频率的变量extern bit Capture_over ;//捕获完成标志位void main (void){int i;GPIO_init (); //AD与数码管引脚功能配置pwm_init(); //PWM初始化P1.3产生PWM P1.4捕获频率Uart_Init(); //串口初始化AD_Configurate(0);//ad1配置IT0=1; //下降沿触发EX0=1;IT1=1; //下降沿触发EX1=1;EA=1;//USART_Send_Str("ok"); //测试串口while(1){if(mode==0)//模式一{if(KEY3==0){while(!KEY3) //按键消除抖动{ ;}LedNumV al_1++;if(LedNumVal_1>=2)LedNumV al_1=0;}switch(LedNumV al_1) //按键次数{case 0:DigitalTube(temp);aa=0;bian=0;LED=0;break; //显示电压值(mv)case 1:DigitalTube(Frequency);aa=0;bian=0;LED=1;break; //显示频率(HZ)//case 2:DigitalTube(Dutycycle);aa=0;bian=0;LED=0;break;default:break;}for(i=0;i<10;i++) //AD采集10次求平均数{aa = ReadADV alue();bian+=aa;}bian =bian/10; // ReadADV alue();temp =(bian*5030)/1024; //电压转换pwmvalue =65535-(65535*bian)/1023;//255-(255*bian)/1024; //PWM与电压的关系转换SetPwm0DutyCycle(pwmvalue); //设定PWM的占空比pwmvalue// Dutycycle=pwmvalue*100/6553;// else if(pwmvalue==0)// SetPwm0DutyCycle(1);if(Capture_over){CCF1 = 0; // 清CCF中断标志Capture_over = 0;//// USART_Send_Str(" HighLevel=");// USART_Put_Num(HighLevel);// USART_Send_Str(" Frequency=");// USART_Put_Num(Frequency);CCAPM1 = 0x21; //开上升沿捕获CR = 1; //启动PCA计数}}else//mode2{key_scan();display();LED=1;if(Capture_over){CCF1 = 0; // 清CCF中断标志Capture_over = 0;// USART_Send_Str(" HighLevel=");// USART_Put_Num(HighLevel);// USART_Send_Str(" Frequency=");// USART_Put_Num(Frequency);CCAPM1 = 0x21; //开上升沿捕获CR = 1; //启动PCA计数}}}}void exit1(void) interrupt 0{EX0=0; //关外部中断delay(100);mode++;if(mode>=2)mode=0;EX0=1; //开外部中断}。

相关主题