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

📄 time_and_tem0917.c

📁 我自己用高速单片机编写的定时器和温度显示的代码,希望有点用哟
💻 C
字号:
//-----------------------------------------------------------------------------
// 版权所有长江大学
// 作者: 魏勇
// 日期: 2006年8月7日
//
// 此程序用高速单片机P5.0和P5.1口输出深度信号,深度信号由中断口
// 读入单片机,计算脉冲个数,与深度初始值相加,经过计算后,显示结果。
// 用P6和P7口输出显示结果,其中P6数码管选择端口,P7为段码显示端口。
// 最后用LED显示深度信息。
//-----------------------------------------------------------------------------
// 包含文件
//-----------------------------------------------------------------------------
#include <c8051f020.h> // SFR声明
#include <stdio.h>

//-----------------------------------------------------------------------------
// C8051F02X的16位SFR定义
//-----------------------------------------------------------------------------
sfr16 DP = 0x82; // 数据指针
sfr16 TMR3RL = 0x92; // 定时器3重装值
sfr16 TMR3 = 0x94; // 定时器3计数器
sfr16 ADC0 = 0xbe; // ADC0数据
sfr16 ADC0GT = 0xc4; // ADC0大于窗口
sfr16 ADC0LT = 0xc6; // ADC0小于窗口
sfr16 RCAP2 = 0xca; // 定时器2捕捉/重装
sfr16 T2 = 0xcc; // 定时器2
sfr16 RCAP4 = 0xe4; // 定时器4捕捉/重装
sfr16 T4 = 0xf4; // 定时器4
sfr16 DAC0 = 0xd2; // DAC0数据
sfr16 DAC1 = 0xd5; // DAC1数据
//-----------------------------------------------------------------------------
// 全局常量
//-----------------------------------------------------------------------------
#define SYSCLK 22118400 // 系统时钟频率Hz


int Second=0;
int Minute=0;
int Hour=0;

//#define BAUDRATE 9600 // UART波特率bps
#define SAMPLERATE0 50000 // ADC0采样频率Hz
//sbit LED = P1^6; // LED='1' 意为ON
//sbit SW1 = P3^7; // SW1='0' 意为按下开关
//-----------------------------------------------------------------------------
// 函数原型
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void delay(count);

void ADC1_Init (void);
void Timer3_Init (int counts);
void ADC1_ISR (void);

void KEY(void);
void HEARD_AND_STAR(void);
void LED_SHOW(unsigned char xdata *tab);

void Time_and_Temp(unsigned char xdata *tab);

//big    lyp tab7=[0x0a=1,0x73=2,0x5b=3,0xca=4,0xd9=5,0xf9=6,0x0b=7,0xfb=8,0xdb=9]
//little lyp tab7=[0x06=1,0x73=2,0x57=3,0xc6=4,0xd5=5,0xf5=6,0x07=7,0xf7=8,0xd7=9]
unsigned xdata led[]={
			0x0a,0x73,0x5b,0xca,0xd9,0xf9,0x0b,0xfb,0xdb
			          };


unsigned xdata tab2[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

unsigned char xdata result[8];



//-----------------------------------------------------------------------------





//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------
void main (void)
{

//long voltage
//unsigned char xdata result[8]; // 电压以mV为单位
	
unsigned char xdata tab[8]; //时间和温度数据


WDTCN = 0xde; // 禁止看门狗定时器
WDTCN = 0xad;
SYSCLK_Init (); // 初始化振荡器
PORT_Init (); // 初始化数据交叉开关和通用IO口
Timer3_Init (SYSCLK/SAMPLERATE0); // 初始化定时器3溢出作为采样率
ADC1_Init (); // 初始化ADC1
ADC1CN |= 0x80; // 允许ADC
EA = 1; // 允许全局中断
//-------------------------------
	while(1)
	{
	KEY();
	Time_and_Temp(tab);//时间和温度计算
	LED_SHOW (tab); //温度和时间显示
	
//	HEARD_AND_STAR();



//	P6=0xaa;

//P7为段译码
//big    lyp tab7=[0x0a=1,0x73=2,0x5b=3,0xca=4,0xd9=5,0xf9=6,0x0b=7,0xfb=8,0xdb=9]
//little lyp tab7=[0x06=1,0x73=2,0x57=3,0xc6=4,0xd5=5,0xf5=6,0x07=7,0xf7=8,0xd7=9]
//P7=0xdb;



P2=0x55;
P3=0xaa;
P4=0x00;

	}

}







//-----------------------------------------------------------------------------





// 此程序初始化系统时钟使用22.1184MHz晶体作为时钟源
//
void SYSCLK_Init (void)
{
int i; // 延时计数器
OSCXCN = 0x67; // 起动外部振荡器晶体为 22.1184MHz
for (i=0; i < 256; i++) ; // 等待振荡器启动(>1ms)
while (!(OSCXCN & 0x80)) ; // 等待晶体振荡器稳定
OSCICN = 0x88; // 选择外部振荡器作为系统时钟源并使能丢失时钟检测器
}
//-----------------------------------------------------------------------------
// IO口初始化
//-----------------------------------------------------------------------------
//
// 配置数据交叉开关和通用IO口
//
void PORT_Init (void)
{
XBR0 = 0x04; // 使能UART0
XBR1 = 0x00;
XBR2 = 0x40; // 允许数据交叉开关和弱上拉
P0MDOUT |= 0x01; // 允许TX0为推挽输出

P1MDOUT |= 0x40; // 允许P1.6(LED)为推挽输出

P74OUT=0x11;     //  P6and P7漏级开路方式输出
}



//-----------------------------------------------------------------------------
//延时子程序
//-----------------------------------------------------------------------------
void delay(count)
  {	
  	int x=count;

	do{x=x-1;}

	while(x>1);
   }

//------------------------------------------------------------------------------



//-------------------------------------------------------------------------------
//显示部分程序
//-------------------------------------------------------------------------------
void LED_SHOW(unsigned char xdata *tab)

 { int i;
for(i=0;i<8;i++)
	{
  
  //		 P7= led[tab[i]];

 	    /* P7= led[i];
		 P6=tab2[i];//8位循环显示,考虑数码管点的位置
		delay(1000000);
		delay(1000000);
		delay(1000000);
		delay(1000000);*/


	 	P7= led[tab[i]-1];
		P6=tab2[i];//8位循环显示,考虑数码管点的位置
		delay(100);

	}
  }






//-------------------------------------------------------------------------------
//脉冲记数程序
//-------------------------------------------------------------------------------

void Time_and_Temp(unsigned char xdata *tab)

{


char Hour_1,Hour_2,Minute_1,Minute_2,Second_1,Second_2;
char Temperature_1,Temperature_2;

Hour_1=(int)(Hour/10);
Hour_2=(int)(Hour-Hour_1*10);

Minute_1=(int)(Minute/10);
Minute_2=(int)(Minute-Minute_1*10);

Second_1=(int)(Second/10);
Second_2=(int)(Second-Second_1*10);

//Temperature_1=(int)(Temperature/10);
//Temperature_2=(int)(Temperature-Temperature_1*10);

//Temperature_1=0;
//Temperature_2=0;
/*
tab[0] = Hour_1;
tab[1] = Hour_2;
tab[2] = Minute_1;
tab[3] = Minute_2;
tab[4] = Second_1;
tab[5] = Second_2;
tab[6] = Temperature_1;
tab[7] = Temperature_2;

*/
tab[0] = 1;
tab[1] = 4;
tab[2] = 3;
tab[3] = 4;
tab[4] = 7;
tab[5] = 6;
tab[6] = 7;
tab[7] = 9;
}
//------------------------------------------------------------------------------------------------

//------------------------------------------------------------------------------------------------







//定时器中断3
void time_3(void) interrupt 14
{
	TMR3CN&=~0x80;             //清0益出位
	Second=Second+1;
	if(Second==60)
	{
	Second=0;
	Minute=Minute+1;
	}
	if(Minute==60)
	{Minute=0;
	Hour=Hour+1;
	}
	if(Hour==24)
	Hour=0;

} 
//------------------------------------------------------------------------------






//-----------------------------------------------------------------------------
// ADC1初始化

//-----------------------------------------------------------------------------

// 配置ADC1 使用定时器3 溢出作为转换源, 转换结束产生中断
// 使能ADC转换结束中断禁止ADC
//注意: 使能低功率跟踪模式保证当改变通到时的跟踪次数最少


void ADC1_Init (void)
{


//需要修改的地方!!!
P1MDIN=0x00;
P1MDOUT=0x00;

ADC1CN = 0x42; // ADC1 禁止; 低功率跟踪模式// 当定时器3溢出时ADC1转换开始;

REF0CN = 0x07; // 使能温度传感器片内VREF和VREF输出缓冲器
AMX1SL = 0x00; // 选择AIN0为ADC多路模拟输出
ADC1CF = (SYSCLK/6000000) << 3; // ADC转化时钟=2.5MHz,The answer=64

//ADC1CF=0x2d;
//ADC1CF=0x03;
//ADC1CF=0xfd;
//ADC1CF=0x91;
ADC1CF |= 0x01; // PGA增益=1
//ADC1CF=0x11;


EIE2 |= 0x08;// 允许ADC1中断
}



//-----------------------------------------------------------------------------
// 定时器3初始化
//-----------------------------------------------------------------------------
//
// 配置定时器3 自动重装时间间隔由<counts>制定(不产生中断)
// 使用系统时钟作为时基.


void Timer3_Init (int counts)
{
TMR3CN = 0x02; // 停止定时器3; 清除TF3;
// 使用系统时钟作为时基
TMR3RL = -counts; //初始化重装值
TMR3 = 0xffff; // 设置为立即重装
EIE2 &= ~0x01; // 禁止定时器3中断
TMR3CN |= 0x04; // 起动定时器3
}


//-----------------------------------------------------------------------------
// 中断服务程序
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// ADC1中断服务程序
//-----------------------------------------------------------------------------
//
// ADC1转换结束中断服务程序
// 得当ADC1采样值并存储在全局数组<result>.
// 同时选择下一个通道转换
//
void ADC1_ISR (void) interrupt 17
{
static unsigned char channel = 0; // ADC多路模拟通道(0-7)


//AD1INT = 0; // 清除ADC转换结束标志

ADC1CN &= 0xdf;

result[channel] = ADC1; // 读ADC值
channel++; // 改变通道


if (channel == 8) 

	{channel = 0;}

AMX1SL = channel; // 设置多路模拟转换器到下一个通道
	

}

void KEY(void)
{
//1,2,3,4号键盘对应P50,51,52,53
//1,2 键表示秒清零
//1,3 键表示分钟快速加
//1,4 键表示分钟快速减

	if (P5==0xfc)//1,2 键表示秒清零
	{
		Second=0;
	}
	if (P5==0xfa)//1,3 键表示分钟快速加
	{
		delay(1000);
		Minute=Minute+1;
	}

	if (P5==0xf6)
	{
		delay(1000);
		Minute=Minute-1;//add some line,it can change the hour
	}
	else
	{}


}

void HEARD_AND_STAR(void)
{}

⌨️ 快捷键说明

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