声明:由青岛理工大学建电16级某同学发布,希望不要雷同
话不多说,直接上图仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
总仿真图,左上角是最小系统,右下角为启动开关,信号输入,左下角为闸门时间(采样时间)控制,上升下降
核心算法是daimao=(to*65536+TH0*256+TL0)/m,m为采样时间,daimao为频率。具体内容请见报告
闸门时间2s时误差在百分之11,3,、4s在百分之7,5s在百分之4,6s、7s在百分之3.简要做了点误差处理,很粗糙,希望大家留言改正,谢谢。
程序框图在课设报告中
单片机总程序:
- #include "reg52.h"
- #define uchar unsigned char
- typedef unsigned int uint;
- sbit w1=P2^0;
- sbit w2=P2^1;
- sbit w3=P2^2;
- sbit w4=P2^3;
- sbit w5=P2^4;
- sbit w6=P2^5;
- sbit jia=P1^6;
- sbit jian=P1^7;
- sbit s=P3^7;//启动
- bit flag;//标签
- uchar s1,s2,s3,s4,s5,s6, shu=1;//控制数组取值
- uchar t0,t1,t2,a;
- unsigned long m=5,n;//m为闸门时间
- int y;
- unsigned long daimao;//频率
- unsigned char code table1[]={0xc0,0xf9,0xa4,0xb0, //闸门时间数组0-f
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e};
- unsigned char code table2[]={0xc0,0xf9,0xa4,0xb0, //频率数组0-f
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e};
-
-
- void delay1(int z)//延时子程序
- {
- int q,w;
- for(q=z;q>0;q--)
- for(w=110;w>0;w--);
- }
- void delay2(uint x)//按键消抖
- {
- uint s;
- uchar w;
- for(s=0;s<x;s++)
- for(w=0;w<110;w++);
- }
- void zhamen1()//闸门时间加
-
- {
- if(jia==0)
- { while(jia!=1);
- m=m+1;}
-
- }
- void zhamen2()//闸门时间减
- {
- if(jian==0)
- {while(jian!=1);
- m=m-1;}
- }
- void iint()//初始化
- {
- flag=0;
- TMOD=0x15;//t1为定时器,t0为计数器模式
- TH1=(65536-4000*m)/256;//设初始值
- TL1=(65536-4000*m)%256;
- TH0=0;
- TL0=0;
- EA=1; //允许中断
- ET0=1;//定时器0的中断允许
- ET1=1;//定时器1的中断允许
- TR1=1;//定时器1启动
- TR0=1;//定时器0启动
- }
- void timer0() interrupt 1//定时器0初始化
- {
- TH0=0x00;
- TL0=0x00;
- t0++;
-
- }
- void timer1() interrupt 3//定时器1初始化
- {
- TH1=(65536-4000*m)/256;
- TL1=(65536-4000*m)%256;
- t1++;
- }
复制代码
全部资料51hei下载地址:
数字频率计.zip
(270.78 KB, 下载次数: 143)
|