⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chengxu.c

📁 单路带数码管可编程可调节延时模块
💻 C
字号:

/********************************************************************
                            汇诚科技

实现功能:此版配套测试程序
使用芯片:STC12C2052AD
晶振:11.0592MHZ
波特率:9600
编译环境:Keil
作者:zhangxinchunleo
网站:www.ourhc.cn
淘宝店:汇诚科技 http://shop36330473.taobao.com
【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!     
/********************************************************************
采样AD的电压值作为继电器的延时吸合时间	最大调节数为255秒最小调节单位是秒
或者最大调节时间为分,最大调节数为255,最小调节单位为分

********************************************************************/

#include<STC12C5A60S2.H>  	       //库文件
#include <intrins.h>
#include"SMG.H"
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int  //宏定义无符号整型
#define FOSC 11059200L
#define BAUD  9600

#define ADC_POWER   0x80            //ADC 电源控制位
#define ADC_FLAG    0x10            //ADC 转换结束标志位
#define ADC_START   0x08            //ADC 开始转换控制位
#define ADC_SPEEDLL 0x00            //420个时钟周期转换一次
#define ADC_SPEEDL  0x20            //280 个时钟周期转换一次
#define ADC_SPEEDH  0x40            //140个时钟周期转换一次
#define ADC_SPEEDHH 0x60            //70个时钟周期转换一次
extern void t_to_dis(void);
extern void display(void);           //显示函数
sbit key1=P3^2;
sbit key2=P3^3;
sbit key3=P3^4;
sbit IN0=P1^6;
sbit IN1=P1^7;
/********************************************************************
                            延时函数
*********************************************************************/
void delay(uchar x)//延时程序 0.1秒
{
	uchar m,n,s;
	for(m=x;m>0;m--)
	for(n=20;n>0;n--)
	for(s=248;s>0;s--);
}
		   
/********************************************************************
                         AD转换初始化程序
*********************************************************************/

void InitADC()
{
    P1ASF|=0x10;        //设置P1口为开漏模式,使用AD功能
    ADC_RES=0;        //AD数据寄存器清空
    ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START;//打开AD电源,转换周期XX
    delay(10);                //延时
}

/********************************************************************
                         AD转换控制程序
*********************************************************************/
uchar GetADCResult(uchar px)	  //转换输出的数据 (PX为通道口)
{
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL |px| ADC_START;//开始转换
    _nop_();                        //延时一个机器周期
    _nop_();						//延时一个机器周期
    _nop_();						//延时一个机器周期
    _nop_();						//延时一个机器周期
    while (!(ADC_CONTR & ADC_FLAG));//等待转换结束
    ADC_CONTR &= ~ADC_FLAG;         //关闭AD转换
    return ADC_RES;                 //返回数据
} 
void ex0_init(void)
{
  IT0=1;    // Falling触发
  EX0=1;	//开外部中断
  EA=1;
}void init_all(void)
{		
   jdq=0;
 	P2M1=0;
	P2M0=0xff;
	P1M1=0;
	P1M0=0x0f;
	P3M1&=0x7f;
	P3M0|=0x80;
 	key1=1;
	key1=IN1;

}
/********************************************************************
                            主函数
*********************************************************************/
void main()
{	 
	init_all();	    //初始化IO
	timer0init();	//初始化T0/T1定时器 
	InitADC();      //AD转换初始化
	ex0_init();		//初始化外部中断
	keynum=1;
	while(1)
	{  	GetADCResult(4);  //扫描adc转换结果
	 	t_to_dis();		  //数值变换
		display();		  //显示函数
	    key1=IN1;		  //把key1和IN1放在一起作为输入控制端
		if(key2==0)		//按键扫描,key2按下模式变化一次
		{
		  delay(5);
		  if(key2==0)
		   {
		     while(!key2);
			 keynum++;		//keynum=0为模式0,继电器吸合300ms ,keynum=1继电器吸合12s
			 if(keynum==2)
			     keynum=0;
		   }
		}
    }
}
void ex0_sevice(void) interrupt 0 using 1  //外部中断服务函数
{  
    TR0=1;	   //有信号时触发中断,定时器启动延时开始
}	
/********************************************************************
                              结束
*********************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -