该系统由定时器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整屏向右移的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)