完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
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 #include #include ***it KEY2 = P2^0; //按键1 ***it KEY3 = P2^1; //按键2 ***it KEY4 = P2^2; //按键3 ***it LED0=P0^0; ***it LED1=P0^1; ***it 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 = 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要引用 4 while(t)还是while(!t) 5 分清主函数中delay在for里面还是在for外面 6 LED前忘记加***it 实验课基本情况 课上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分) |
|
|
|
只有小组成员才能发言,加入小组>>
2553 浏览 0 评论
1152浏览 2评论
750浏览 1评论
504浏览 0评论
269浏览 0评论
433浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 18:30 , Processed in 1.234528 second(s), Total 80, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号