51单片机的数字频率计

51单片机的数字频率计,第1张

该系统由定时器0中断子函数、定时器1中断子函数、延时子函数、按键消抖子函数、闸门控制子函数、主函数和数据定义这几部分组成。

      闸门时间由定时器1控制,初始为2s,可以通过按键加减,范围为2s到7秒。闸门时间就是采样时间,闸门时间越长,测量精度越准确。

      由P34输入信号,低电平有效,触发T0外部中断。当T0触发中断的时候执行的程序。这里只进行了一个 *** 作,t0++。所以,t0的值表示触发了几次中断,也就表示接受到的脉冲几次从0到65536。所以会有t065536。 另外,由于计时的机制是THO++、TL0++,所以,THOTL0就表示当前的计数值。THOTLO- 初值就可以确定没有触发中断定时多少。TH0256==TH02^8,实质就是左移8位,就是拼接TH0跟TL0的处理。

所以频率的核心算法为

 

daimao=(t065536+TH0256+TL0)/n

程序框图

总源程序

#include "reg52h"

#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,

电子设计工程师课程设计

(一) 项目名称:八路温度测量检测系统

(二) 项目要求:

1手动查询每一点的温度值

2自动轮流显示每一点温度值

3 可以设定每一点的温度值,超过温度

上下限时,系统自动报警

(三) 项目内容:

系统组成部分:温度采集电路、A/D转换、单片机、8155扩展单元、液晶显示、按键等。

采用的方式:手动或自动循环选择一条通道,单片机对采集到的信息进行数据处理,送给液晶显示电路,显示电路显示此通道号及此通道的温度。当温度超过设定的温度上下限时自动报警,通过调整相应通道温度,使温度在设定范围内,系统会自动退出报警状态

1 系统框图:

2 系统原理图:

(1) 温度采集电路

(2) A/D转换电路

(3) 显示电路

3 程序框图

(1)程序流程图

(2)键盘扫描流程图

(4) 显示报警流程图

4 参考程序

#include <reg51h>

#include <absacch>

#include <intrinsh>

#include <wenduh>

//主函数

void main()

{

Port_Com=0x03;

lcd_init();

while(1)

{

if(model==1)

{

for(z=0;z<8;z++)

{

ad_sz=read1543(z);

ad_data=(50ad_sz)/1024;

rt=ad_data/16+50/11;

r=(1000rt)/(5-rt)-100;

ti=200/758r;

display();

delayms(500);

key_scan();

}

}

if(model==2)

{

ad_sz=read1543(s);

ad_data=(50ad_sz)/1024;

rt=ad_data/16+50/11;

r=(1000rt)/(5-rt)-100;

ti=200/758r;

display();

delayms(5);

key_scan();

}

if(model==3)

{

ad_sz=read1543(t);

ad_data=(50ad_sz)/1024;

rt=ad_data/16+50/11;

r=(1000rt)/(5-rt)-100;

ti=200/758r;

display();

key_scan();

sound();

}

}

}

#define uint unsigned int

#define uchar unsigned char

#define Port_Com XBYTE[0xfd00]

#define Port_A XBYTE[0xfd01]

#define Port_B XBYTE[0xfd02]

#define Port_C XBYTE[0xfd03]

sbit RS=P1^5;

sbit RW=P1^6;

sbit EN=P1^7;

sbit ad_out=P2^4;

sbit ad_addr=P2^5;

sbit cs=P2^6;

sbit clk=P2^7;

sbit speaker=P1^0;

uchar z,s,t;

uchar key_value;

uchar model=1;

uchar ad[16],f1[16];

uchar f=0;

uchar du=1;

uint ted1,teu1;

uint ad_dat;

uint ad_sz;

float ad_data,rt,r,ti;

float teu=400;

float ted=100;

void change();

void fun();

void add();

void dec();

void tem_du();

void sound();

void delay(uint t)

{

while(t--);

}

//m毫秒延时函数

void delayms(uint m)

{

uchar i;

while(m--)

for(i=0;i<125;i++) ;

}

//1602写命令函数

void lcd_wricmd(uchar c)

{

delay(500);

RS=0;

RW=0;

EN=1;

Port_A=c;

EN=0;

}

//1602写数据函数

void lcd_wridata(uchar d)

{

delay(500);

RS=1;

RW=0;

EN=1;

Port_A=d;

EN=0;

}

//1602初始化函数

void lcd_init()

{

lcd_wricmd(0x38); //8位数据端口,2行显示,57点阵

lcd_wricmd(0x0c);

lcd_wricmd(0x06);

lcd_wricmd(0x01);

}

//1602子符串输出函数

void lcd_putstr(uchar p,bit flag)

{ uchar ad;

if(flag==0)

{

ad=0x80;

while(p!='\0')

{

lcd_wricmd(ad); ad++;

lcd_wridata(p); p++;

}

}

if(flag==1)

{

ad=0xc0;

while(p!='\0')

{

lcd_wricmd(ad); ad++;

lcd_wridata(p); p++;

}

}

}

void change()

{

ad_dat=ti100;

ad[0]=ad_dat/10000+0x30;

ad[1]=ad_dat/1000%10+0x30;

ad[2]=ad_dat/100%10+0x30;

ad[3]='';

ad[4]=ad_dat%100/10+0x30;

ad[5]=ad_dat%10+0x30;

ad[6]=0xdf;

ad[7]='C';

ad[8]=' ';

ad[9]=' ';

ad[10]=' ';

ad[11]=' ';

ad[12]=' ';

ad[13]=' ';

ad[14]=' ';

ad[15]=' ';

}

void change3()

{

ted1=ted10;

teu1=teu10;

ad_dat=ti100;

ad[0]=ad_dat/10000+0x30;

ad[1]=ad_dat/1000%10+0x30;

ad[2]=ad_dat/100%10+0x30;

ad[3]='';

ad[4]=ad_dat%100/10+0x30;

ad[5]=ad_dat%10+0x30;

ad[6]=0xdf;

ad[7]='C';

ad[9]='>';

ad[10]=ted1/100+0x30;

ad[11]=ted1/10%10+0x30;

ad[13]='<';

ad[14]=teu1/100+0x30;

ad[15]=teu1/10%10+0x30;

}

uint read1543(uchar addr)

{

uchar i;

uchar ah,al;

uint ad;

clk=0;

cs=0;

addr<<=4;

for(i=0;i<4;i++)

{

ad_addr=(bit)(addr&0x80);

clk=1;

clk=0;

addr<<=1;

}

for(i=0;i<6;i++)

{

clk=1;

clk=0;

}

cs=1;

delay(25);

cs=0;

_nop_();

_nop_();

_nop_();

for(i=0;i<2;i++)

{

ad_out=1;

clk=1;

ah<<=1;

if(ad_out)

ah=ah+0x01;

clk=0;

}

for(i=0;i<8;i++)

{

ad_out=1;

clk=1;

al<<=1;

if(ad_out)

al=al+0x01;

clk=0;

}

cs=1;

ad=(uint)ah;

ad<<=8;

ad=ad+(uint)al;

return(ad);

}

void display()

{

if(model==1)

{

change();

switch(z)

{

case 0: lcd_putstr("ZI DONG NO1 : ",0);

lcd_putstr(ad,1);

break;

case 1: lcd_putstr("ZI DONG NO2 : ",0);

lcd_putstr(ad,1);

break;

case 2: lcd_putstr("ZI DONG NO3 : ",0);

lcd_putstr(ad,1);

break;

case 3: lcd_putstr("ZI DONG NO4 : ",0);

lcd_putstr(ad,1);

break;

case 4: lcd_putstr("ZI DONG NO5 : ",0);

lcd_putstr(ad,1);

break;

case 5: lcd_putstr("ZI DONG NO6 : ",0);

lcd_putstr(ad,1);

break;

case 6: lcd_putstr("ZI DONG NO7 : ",0);

lcd_putstr(ad,1);

break;

case 7: lcd_putstr("ZI DONG NO8 : ",0);

lcd_putstr(ad,1);

break;

}

}

if(model==2)

{

change();

switch(s)

{

case 0: lcd_putstr("SHOU DONG NO1 :",0);

lcd_putstr(ad,1);

break;

case 1: lcd_putstr("SHOU DONG NO2 :",0);

lcd_putstr(ad,1);

break;

case 2: lcd_putstr("SHOU DONG NO3 :",0);

lcd_putstr(ad,1);

break;

case 3: lcd_putstr("SHOU DONG NO4 :",0);

lcd_putstr(ad,1);

break;

case 4: lcd_putstr("SHOU DONG NO5 :",0);

lcd_putstr(ad,1);

break;

case 5: lcd_putstr("SHOU DONG NO6 :",0);

lcd_putstr(ad,1);

break;

case 6: lcd_putstr("SHOU DONG NO7 :",0);

lcd_putstr(ad,1);

break;

case 7: lcd_putstr("SHOU DONG NO8 :",0);

lcd_putstr(ad,1);

break;

}

}

if(model==3)

{

change3();

switch(t)

{

case 0: lcd_putstr("TIAO ZHENG NO1:",0);

lcd_putstr(ad,1);

break;

case 1: lcd_putstr("TIAO ZHENG NO2:",0);

lcd_putstr(ad,1);

break;

case 2: lcd_putstr("TIAO ZHENG NO3:",0);

lcd_putstr(ad,1);

break;

case 3: lcd_putstr("TIAO ZHENG NO4:",0);

lcd_putstr(ad,1);

break;

case 4: lcd_putstr("TIAO ZHENG NO5:",0);

lcd_putstr(ad,1);

break;

case 5: lcd_putstr("TIAO ZHENG NO6:",0);

lcd_putstr(ad,1);

break;

case 6: lcd_putstr("TIAO ZHENG NO7:",0);

lcd_putstr(ad,1);

break;

case 7: lcd_putstr("TIAO ZHENG NO8:",0);

lcd_putstr(ad,1);

break;

}

}

}

void key_scan() //键盘扫描

{

key_value=Port_C|0xe0;

if(key_value!=0xff)

{

delayms(20);

key_value=Port_C|0xe0;

if(key_value!=0xff)

{

switch(key_value)

{

case 0xfe: fun(); break;

case 0xfd: add(); break;

case 0xfb: dec(); break;

case 0xf7: tem_du(); break;

}

}

}

}

void fun() //功能键

{

//delayms(20);

model++;

if(model==4)

model=1;

}

void add() //加1键

{

//delayms(20);

if(model==2)

{

s++;

if(s==8)

s=0;

}

if(model==3)

{

if(du==1)

{

t++;

if(t==8)

t=0;

}

if(du==2)

ted++;

if(du==3)

teu++;

}

}

void dec() //减1键

{

//delayms(20);

if(model==2)

{

if(s==0)

s=8;

s--;

}

if(model==3)

{

if(du==1)

{

if(t==0)

t=8;

t--;

}

if(du==2)

ted--;

if(du==3)

teu--;

}

}

void tem_du() //设定温度上下限数值

{

du++;

if(du==4)

du=1;

}

void sound()

{

if(ti<=ted)

{

lcd_wricmd(0xc9);

lcd_wridata('L');

lcd_wridata('O');

lcd_wridata('W');

lcd_wridata(' ');

speaker=0;

}

if(ti>=teu)

{

lcd_wricmd(0xcc);

lcd_wridata('H');

lcd_wridata('I');

lcd_wridata('G');

lcd_wridata('H');

speaker=0;

}

}

write_com(0x80+0x10);

for(num=0;num<15;num++)

{

write_data(table[i]);

delay(5);

}

write_com(0x80+0x40)

{

write_data(table1[i]);

delay(5);

}

注意啦:这是另送你的整屏左移

for(num=0;num<16;num++)

{

write_com(0x18);//整屏左移

delay(200);

}

你要的:整屏右移

for(num=0;num<16;num++)

{

write_com(0x1c);//整平右移

delay(200);

}

希望对你有用。

以上就是关于51单片机的数字频率计全部的内容,包括:51单片机的数字频率计、基于单片机的液晶显示钟设计、1602整屏向右移的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10209734.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存