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

📄 juchibo.c

📁 51单片机产生锯齿波的程序
💻 C
字号:
////////////////////////////////
//		实验要求:
//	1 生成后锯齿波
//	2 后沿点亮P6口LED灯
//	3 数显周期
///////////////////////////////	

#pragma sfr	//使用特殊功能寄存器
#pragma interrupt INTTM1 inter RB1	//定义INTMM1可屏蔽中断服务程序
#pragma DI	//定义关中断
#pragma EI	//定义开中断
#pragma access	//使用了存储器直接地址存取功能
#pragma realregister	//使用了寄存器直接存取功能

#define MMODE 0x0		//MM设置为单片模式
#define CMODE 0x1		//起振模式选择寄存器设置为不使用分频电路
#define PCMODE 0x0		//处理器时钟控制寄存器PC设置cpu时钟为0.4us
#define PORTM6 0x0		//端口P6设置为输出模式
#define MDAM 0X1		//D/A转换器设置为通常模式,通道0转换动作许可,通道1禁止
#define TCL1MODE 0xa	        //选择定时器1计数时钟为78.1KHz
#define TMC1MODE 0x1	        //设置8位定时器1动作许可
#define N 3905			//定时时间计数值 3905/78.1=50ms
#define FREQ 78			//定时器时钟频率
#define STEP 5			//定义数字量0~255步长为5
#define DELAY 30		//定义延时数值

void inter(void);	//中断子程序
void pre_deplay();	//计算锯齿波周期子程序
void deplay();		//显示周期子程序
//定义字符0-9的显示码
unsigned char numbercode[10]
	={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x19};

//定义数码管选择
unsigned char fa02_buff[4]
	={0x0e,0x0d,0x0b,0x07};

unsigned char fa03_buff[4];	//定义4个数码管的缓存区

pre_deplay();	//计算周期,并为周期显示作准备
P6 = 0x0;		//P6口清零

unsigned char a;

void main()
{

	while(1)
	{

		for(a = 0; a <= 0xff; a = a+STEP)
		{

			DI();				//关中断
			TCL1 = TCL1MODE;	//定时器1计数时钟为78.1KHz
			CR10 = N;			//定时时间计数值 3905/78.1=50ms
			TMMK1 = 0;			//8位定时器1中断允许
			TMC1 = TMC1MODE;	//定时器1启动
			EI();				//开中断

			while(1){}			//等待中断--D/A转换

			if(a == 0xff) 
				P6 = 0xff;		//锯齿波后沿点亮P6口LED灯

			if(a != 0xff && a > 100)
				P6 = 0x0;		//P6口LED灯延时一段时间后清零
		}//for
	}//while
}//main
	
void inter(void)
{
	DI();	//关中断,防止在这期间另有中断干扰
	DACS0 = a;	//将待转化a值赋给D/A转换寄存器
	deplay();
	//每显示一个周期的波形,就显示一次周期

}

//计算周期,并为周期显示作准备
void  pre_deplay()
{
	int i,j,k;
	i = N/FREQ;		//每步所花时间
	j = 255/STEP;	//步数
	k = i*j;		//一个周期的时间
	
	fa03_buff[0] = k/1000;		//周期的千位
	fa03_buff[1] = (k/100)%10;	//百位
	fa03_buff[2] = (k%100)/10;	//十位
	fa03_buff[3] = k%10;		//个位
}

//数码管显示
void deplay()
{
	unsigned int n,dp = 0;
	while(dp < 4)
	{
		pokeb(0xfa02,fa02_buff[bp]);
		pokeb(0xfa03,numbercode[fa03_buff[bp]]);	//数码管显示
		
		//延时
		n = 0;
		while(n < DELAY)
		{n++};
				
		pokeb(0xfa02,0xff);
		pokeb(0xfa03,0xff);		//数码管关闭

		//延时
		n = 0;
		while(n < DELAY)
		{n++};

		dp++;
	}
}

⌨️ 快捷键说明

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