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

📄 rs1.c

📁 一个基于LABwindowsCVI和单片机的串口双向通讯程序
💻 C
字号:
#include<reg52.h>
#include<INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define NOP _nop_()
#define DISOFF 0X3F
#define TH0_RELOAD	0xd8	//10ms定时器中断重载值
#define TL0_RELOAD	0xef
/*Timer*/
bit		bdata	f_10ms;		/*T0中断10ms到标志*/
bit		bdata 	f_20ms;		/*20ms按键判断标志*/
bit		bdata 	f_200ms;		/*20ms按键判断标志*/
bit		bdata 	f_400ms;		/*400ms按键判断标志*/
bit		bdata	f_1s;		/*1秒采样标志*/
bit		bdata	f_20s;		/*20秒一个控制周期标志*/
#define	INT20MSCOUNT		2
uchar	data	cnt_20ms=INT20MSCOUNT;/*按键判断20ms*/
#define	INT200MSCOUNT		10
uchar	data	cnt_200ms=INT200MSCOUNT;/*AD读500ms*/
#define	INT400MSCOUNT		2
uchar	data	cnt_400ms=INT400MSCOUNT;/*AD读500ms*/
#define	INT1SCOUNT	2
uchar	data	cnt_1s=INT1SCOUNT;/*1s*/
#define	INT20SCOUNT	20
uchar 	data	cnt_20s=INT20SCOUNT;/*定时20s计数器*/
//********************************
#define	LED2_PORT P0
uchar	data	disbuf[2]={0,0};
uchar	data	temper[2]={0,0};
uchar	code	distab[10]={0x41,0xe7,0x52,0x62,0xe4,0x68,0x48,0xe3,0x40,0x60};
uchar	code 	tab_w[]={0X80,0X40};/*LED2,LED1,位选码表 P2.6-->LED2,P2.7-->LED1*/
//P1 |= B0000_0111 熄灭
sbit	LED1 = P2^7;
sbit	LED2 = P2^6;
uchar	data 	scan;/*显示哪个LED*/
uchar  	data 	adtmp[10];
uchar	data	sec_cnt;
uchar	data	keytask;
bit		bdata	fkey;
uchar	data	led_cnt;
//********************************
void	main_init(void);
void	uart_init(void);
void	ad_init(void);
void	dis_init(void);
void	send8(uchar temp);
void	delay(uint temp);
uchar   tlc549(void);
uchar 	datlb(uchar data adc);/*数据滤波,和前9次采样值一起,去最大最小值,取平均值*/
void 	datclf(uchar data ad_dat);
void 	tim0_mainloop(void);
void	dis_mainloop(void);
void 	ad_mainloop(void);
void	data_mainloop(void);
void	tim0_init(void);
void	key_mainloop(void);
//********************************
void	main(void)
{
	main_init();
	EA = 1;
	//send8(0x55);send8(0xaa);
	while(1)
	{
		tim0_mainloop();
		dis_mainloop();
		//send8(0x55);send8(0xaa);
	}
}
//****************************
void	dis_mainloop()
{
	uchar ch;
	if(!f_10ms)return;
	f_10ms = 0;
	P2 &= DISOFF;//关显示
	ch = disbuf[scan];	/*得到当前要显示值*/
	LED2_PORT = distab[ch];
	P2 |= tab_w[scan];
	if(++scan==2)scan=0;
}
//********************************
//*产生各种时间控制
void	tim0_mainloop()
{	if(!f_10ms) return;
	if(--cnt_20ms==0)
	{
		cnt_20ms=INT20MSCOUNT;
		f_20ms=1;	/*20ms*/
		if(--cnt_200ms==0)
		{
			cnt_200ms=INT200MSCOUNT;
			f_200ms=1;	/*200ms*/
			if(--cnt_400ms==0)
			{
				cnt_400ms=INT400MSCOUNT;
				f_400ms=1;	/*400ms*/
				if(--cnt_1s==0)
				{
					cnt_1s=INT1SCOUNT;
					f_1s=1;	/*1s*/
					if(--cnt_20s==0)
					{
						cnt_20s=INT20SCOUNT;
						f_20s=1;	/*20秒*/
					}
				}
			}
		}
	}
}

//*********************
void	main_init(void)
{
	uart_init();
//	dis_init();
	tim0_init();
	scan=0;
	sec_cnt=0;
}
//*********************
/*定时器0中断服务,产生10ms定时*/
void	tim0(void) interrupt 1
{
	TH0=TH0_RELOAD;TL0=TL0_RELOAD;
	f_10ms=1;
}
//*********************
void serial(void) interrupt 4
{
	uchar	temp;
	if(RI)RI=0;
	temp=SBUF;
	send8(temp);
	disbuf[0]	=temp/10;
	disbuf[1]	=temp%10;
	if(disbuf[0]>9){disbuf[0]=9;disbuf[1]=9;}

}

//*********************
void	tim0_init(void)
{
	TMOD=0x01;		/*T0定时10ms中断显示*/
	TH0=TH0_RELOAD;
	TL0=TL0_RELOAD;
	ET0=1;
	TR0=1;
}
//*********************
void	uart_init(void)
{
	T2CON = 0x34;//12clk-9600 6clk-19200
	RCAP2H = 0xFF;
	RCAP2L = 0xD9;
	SCON = 0x50;
	ES=1;//串口中断
}
//*********************
void	send8(uchar	temp)
{
	SBUF = temp;
	while(!TI);
	TI=0;
}
//*********************


⌨️ 快捷键说明

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