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

📄 51

📁 51单片机应用系统典型模块开发大全
💻
字号:
#include <reg51.h>#include <absacc.h>#define uchar unsigned char#define uint  unsigned intsbit CLK=P1^0;				//MCP4822输入CLK输入sbit DAT=P1^1;				//MCP4822输入DAT串行输入信号sbit CS=P1^2;				//MCP4822片选端sbit LCAC=P1^3;				//MCP4822同步输入控制端const uchar LIGHT[12]={	0x3d,0xff,0x3b,0xff,	0x39,0xff,0x37,0xff,	0x35,0xff,0x30,0x00};	//电压控制信号uchar i=0,k=200;			//控制电压、定时计数器初始值bit flag=0;					//锁键盘标志位,为0表示锁定,为1表示解锁/**************************声明函数******************************/void init_timer0(void);		//定时器0初始化子程序void send(uchar *dat1,uchar m);//MCP4822 D/A转换子程序void delay(uint t);			//延时程序bit key_press(void);		//按键按下判断程序void keyscan(void);			//按键处理程序void keyscan1(void);		//锁定键解除判断程序/***************************主函数********************************/main(){	init_timer0();			//初始化定时器0		while(1)	{		keyscan1();			//锁定键是否按下		while(flag==1)		//键盘解锁?		{			keyscan();		//按键处理		}		if(k==0)			//10s定时结束		{			send(LIGHT,5);	//LED灯关闭			k=200;			//设定定时计数器初值		}	}}/*********************定时器0初始化子程序************************/void init_timer0(void){	TMOD=0x01;				//定时器0选择工作方式1	TH0=(65536-50000)/256;	//定时时间为20ms	TL0=(65536-50000)%256;	EA=1;					//开总中断	ET0=1;					//开定时器0中断}/***************************延时子程序***************************/void delay(uint t){	uchar j; 	for(;t>0;t--)		for(j=19;j>0;j--);}/************************按键按下判断程序***********************/bit key_press(void){	uchar key;	P1=0xe0;				//输入键盘扫描码	key=P1;					//读入键盘状态	if((key&0xe0)!=0xe0)	{		return(1);			//有键按下返回1	}	else	{		return(0);			//无键按下返回0	}}/***********************定时器0中断服务程序***********************/void timer0(void)interrupt 1{	TH0=(65536-50000)/256;	//重新载入计数初值	TL0=(65536-50000)%256;	if(--k==0)	{		flag=0;				//计时到,锁定键盘		TR0=0;				//停止计时	}}/*********************MCP4822 D/A转换子程序**********************/void send(uchar *dat1,uchar m){    uchar n,j,temp;    CS=1;    CS=0;					//产生下降沿,开始数据传送    for (j=0;j<2;j++)    {        temp=dat1[2*m+j];	//先送出控制位及高4位数据,再将低8位数据送出		for(n=0;n<8;n++)		{			CLK=0;			if((temp&0x80)==0x80)//按位将数据从DAT脚送出			{				DAT=1;			}			else			{				DAT=0;			}			temp=(temp<<1);	//准备发送下一位			CLK=1;			//上升沿送出待发送数据		}    }	CS=1;	LCAC=1;	LCAC=0;					//下降沿将转换后数据送出	LCAC=1;}/*************************按键处理程序***************************/void keyscan1(void){	uchar keyv;	if(key_press()==1)		//有键按下?	{		delay(200);			//延时去抖		if(key_press()==1)	//有键按下?		{			keyv=P1;		//读入键值			if((keyv&0xe0)!=0xe0)//读入键值			{				if((keyv&0xe0)==0x60)//开锁键按下?				{					flag=1;	//按键解锁				}				while(key_press()==1);//等待按键释放				send(LIGHT,i);//显示灯亮				TR0=1;		//启动定时器0								}			}	}}/***********************锁定键解除判断程序***********************/void keyscan(void){	uchar keyv;	if(key_press()==1)		//有键按下?	{		delay(200);			//延时去抖		if(key_press()==1)	//有键按下?		{			keyv=P1;		//读入键值					if((keyv&0xe0)==0x60)//按下键为闭锁键			{				while(key_press()==1);//等待按键释放				k=200;		//10s重新计时				send(LIGHT,i);//送出控制电压			}			if((keyv&0xe0)==0xa0)//按下键为灯光亮度增强键,且亮度不是最高值			{				while(key_press()==1);//等待按键释放				if(i>0)				{					i--;	//亮度值增加				}				k=200;		//10s重新计时				send(LIGHT,i);//送出控制电压 			}			if((keyv&0xe0)==0xc0)//按下键为灯光亮度减弱键,且亮度不是最低值			{				while(key_press()==1);//等待按键释放				if(i<5)				{					i++;	//亮度值减小				}				k=200;		//10s重新计时				send(LIGHT,i);//送出控制电压			}		}	}}

⌨️ 快捷键说明

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