电子科技大学现代电子信息系统综合实验课程设计代码(单片机+频率计)1

大家的点赞,关注是对博主最大的鼓励!
简介:
年级:大四
课程性质:必修
期末考核:开卷,现场编程,很难拿高分,两个题,一个单品机(个人认为简单一些),一个FPGA,博主完成了单品机的题,大部分人只能完成一个
其他:不同老师课程内容,给分情况不同。
声明: 以下所有内容仅供参考,不具有权威性,课程的考核内容可能发生变化!

单片机实现数字频率计方案1

系统功能及指标

测量频率范围:10Hz~600kHz
测量精度:1%以内

系统设计方案及基本流程

unsigned char DispBuf[8]

显示缓冲区,分别对应8个数码管每个数码管应该显示的数字

主要函数及其功能概述:

void delay(unsigned int t)

t: 延时长度(ms)
延时函数,t 可以对 delay 函数的运行时间进行设置,delay 函数本身不进行任何有意义的操作,只实现空转等待的功能

void DispClear()

清空显示缓冲区DispBuf

void DispInit()

显示模块的初始化函数
清空显示缓冲区DispBuf,设置工作方式寄存器TMOD(T1的对应位),TH1,TL1 ,TH0,TL0初值,设置中断允许寄存器IE

void SysInit()

系统初始化函数
调用DispInit(),然后对工作方式寄存器TMOD(T0的对应位)进行设置

void display (unsigned long f)

显示函数
把频率的数值 f 转化为8位数显示在数码管上

void T1INTSVC() interrupt 3

中断函数,也是最为核心的函数
定时器1中断,实现对数码管的刷新和计算频率值

中断函数T1INTSVC的实现方式:
在这里插入图片描述

主函数

主函数的工作流程图:
在这里插入图片描述

完整代码

#include <reg51.h>
#include <absacc.h>
#include <ctype.h>

sbit KEY2 = P2^0;		//按键1	
sbit KEY3 = P2^1;		//按键2	
sbit KEY4 = P2^2;       //按键3 
sbit LED0=P0^0;
sbit LED1=P0^1;
sbit LED2=P0^2;


unsigned char DispBuf[8];
unsigned int t;//延时长度/毫秒
unsigned long count;
unsigned long f;
unsigned long j;//循环变量
unsigned int wait=0;

//直接引用模块
void delay(unsigned int t){	   //延时函数
	do
	{
		TH1 = 0xFA;
		TL1 = 0x24;
		TR1 = 1;
		while ( !TF1 );
		TR1 = 0;
		TF1 = 0;
	} while ( --t != 0 );	
}
]

void DispClear(){	    //清空缓存
	unsigned char i;
	for ( i=0; i<8; i++ )
	{
		DispBuf[i] = 0x00;
	}
}

void DispInit(){
	DispClear();	
	EA = 0;
	TMOD &= 0x0F;
	TMOD |= 0x10;
	TH1 = 0xFA;
	TL1 = 0x24;
	TR1 = 1;
	ET1 = 1;
	EA = 1;
	TH0=0x00;
	TL0=0x00;
	TR0=0;
}

void SysInit(){
	TMOD &= 0xF0;
	TMOD |= 0x05;	//设置定时器T0为16位定时器
	DispInit();		//数码管扫描显示初始化
}
//
void display (unsigned long f)//把f的各位数字输入到显示缓冲区
{
  code unsigned char Tab[] ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};   //0-9的码字
	unsigned char i;
	for ( i=0; i<7; i++ ){
		unsigned long int c;
		c = f%10;
		f = (f-c)/10;
		DispBuf[i+1] = Tab[c];//DisBuf低位对应数值低位
	}
	DispBuf[0]=Tab[0];

}

void T1INTSVC() interrupt 3	  //定时器1中断
{	  
	code unsigned char com[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//一共有8个数码管,但是一次扫描过程只能亮1个,哪个比特为1,就点亮数码管
	static unsigned char n = 0;
	unsigned int th0;
	unsigned int tl0;
	
	TR1 = 0;
	TH1 = 0xFA;
	TL1 = 0x24;
	TR1 = 1;
    //扫描数码管,第n个数码管显示它对应的数字
	XBYTE[0x7800] = 0xFF;		
	XBYTE[0x7801] = ~DispBuf[n];//显示的数字是第n个数码管对应的数字
	XBYTE[0x7800] = ~com[n];//点亮第n个数码管
	n++;
	n &= 0x07;//n计数到7后归0
	
	wait++;
	if(wait==201){wait==0;}
	 if(wait==100) { TR0=1; count=0;TH0=0x00;
	 TL0=0x00;}//把计数器T0归0
	 if(wait==200) { TR0=0;
	 th0=TH0;//计数器高位
	 tl0=TL0;//计数器低位
	 count=th0*256+tl0;display(count);//把频率值的各位数字更新到显示缓冲区}
}


void main()
{	
    
	LED0=0;
	LED1=1;
	t=10;
	SysInit();
	display(0);//数码管上显示0
	TR1=1;
	for(;;)
	{
	   	
	}

}

实验过程讨论

1.首先确定测频方案,画出原理图,写出伪代码
2.确定各个函数的功能,逐个代码实现
3.编写主函数,实现调用各个函数
4.频率由低到高,观察测量值

学习建议

这个实验台没有51单片机芯片,是用FPGA芯片通过程序实现了51单片机的功能,细节不用我们管,我们就把它当单片机用就行了。

一些必须掌握的内容

1.51单片机有几个比较重要的寄存器,如TCON、TMOD等,还有T0,T1两个计时/计数两用的模块,这些模块的功能和调用务必熟悉,在课本上。

2.以下是实验台的系统原理图,标注了8051单片机的每个引脚分别和哪些原件相连,务必学会看
在这里插入图片描述
在这里插入图片描述

(图在一个叫《单片机最小系统.pdf》的文件里,实验台电脑上有)

3.Keil打开后的界面如下,学会用Keil创建新的工程文件和设置断点来调试程序等,按照课本上的流程操作几遍就能学会
在这里插入图片描述

注意
在这里插入图片描述
在这里插入图片描述

4.老师会给几个教学历程,务必推一遍,研究透每一行代码,都可能考到
在这里插入图片描述

小贴士

1 一次只能打开一个文件调试,不然很容易出问题
2 打代码键盘一定要设置成英文,不然中文符号混进来会是一个空白符号,不容易查
3 CPU工作主频18MHz,一个指令周期就是12个振荡周期

犯过的代码错误

1 unsigned char weixuan[]忘记加char
2 中断处理完后忘记TR1=1
3 用toint要引用<ctype >
4 while(t)还是while(!t)
5 分清主函数中delay在for里面还是在for外面
6 LED前忘记加sbit

实验课基本情况

课上2周,讲2次课,之后自己抽时间,在打卡系统约实验室位置去做实验,考试时间在第二周结束后的某个周一,因为和另一个班一起考所以在第三周的结束后的周一
教材:现代电子技术综合实践教程 EDA 单片机与SPOC实验第二版
打卡系统:eeclab.uestc.edu.cn
45min一个学时
实验室开放:中午12-2不开(可申请)
下午5-6不开
晚上9点关

模拟练习和历年试题

老师给的两个模拟练习

1 EDA

E盘带AAA 指定目录建立项目(3分);建立元件在中间点亮两位LED(3分);利用此元件点亮最左2位和最右2位LED(3分)仿真一个10分频器(5分);清楚显示左边两位LED闪烁(3分);拨码切换清楚显示最右边2位LED闪烁(3分)

2 单片机

E盘带学号目录建立正确项目(3分);中间点亮两位LED(3分),中间数码管显示“88” (4分); 每按键,字符左循环移动一位,LED循环一周(5);每转一周字符模10加1(5分)

下期内容导航

EDA实现方法请见:
https://blog.csdn.net/Jinyindao243052/article/details/107828311

另一种单片机实现方法:
https://blog.csdn.net/Jinyindao243052/article/details/107822771

练习题代码请见:
https://blog.csdn.net/Jinyindao243052/article/details/107827881

更多模拟试题请见:
https://blog.csdn.net/Jinyindao243052/article/details/107828159

  • 25
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值