电子时钟C语言程序和涡流传感器称重C语言程序.docx

上传人:b****5 文档编号:7374594 上传时间:2023-01-23 格式:DOCX 页数:16 大小:18.05KB
下载 相关 举报
电子时钟C语言程序和涡流传感器称重C语言程序.docx_第1页
第1页 / 共16页
电子时钟C语言程序和涡流传感器称重C语言程序.docx_第2页
第2页 / 共16页
电子时钟C语言程序和涡流传感器称重C语言程序.docx_第3页
第3页 / 共16页
电子时钟C语言程序和涡流传感器称重C语言程序.docx_第4页
第4页 / 共16页
电子时钟C语言程序和涡流传感器称重C语言程序.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

电子时钟C语言程序和涡流传感器称重C语言程序.docx

《电子时钟C语言程序和涡流传感器称重C语言程序.docx》由会员分享,可在线阅读,更多相关《电子时钟C语言程序和涡流传感器称重C语言程序.docx(16页珍藏版)》请在冰豆网上搜索。

电子时钟C语言程序和涡流传感器称重C语言程序.docx

电子时钟C语言程序和涡流传感器称重C语言程序

传感器课程设计

软时钟实验源程序:

#pragmadboe

#include

#include

#include

#include

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

#defineulongunsignedlong

voiddisplay(void);

voidinitsiu(void);

voiddelay(void);

voidsztz(void);

voidjssz(void);

voidsetsz(void);

voidtzszw(ucharzj);

ucharinkey(void);

ucharsec,min,hour;

uchardisdat[6];

ucharcodetab[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f};

uintcount;

ucharset_state,xsd;

sbitzsd=P1^0;

main()

{

uchari;

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

{

disdat[i]=0;//将显示缓存清零

}

initsiu();//初始化单片机

set_state=0;

do

{

i=inkey();//读取键盘值

if(i==0xe0)//如果读取i=0xe0,进入设置时钟

setsz();//设置时钟

jssz();//计算数值

display();//显示

if((sec&0x01))//指示灯闪烁

zsd=1;

else

zsd=0;

}

while

(1);

}

voiddisplay(void)//6位数码管显示程序,disdat[]是要显示的内容(是0~9的数字),xsd是在那一位显示小数点

{

uchari,disa,disb,disc;

disb=0x00;//显示第n位

for(i=0;i<6;i++)//共显示6个数据

{

disa=disdat[i];//显示数据

if(disa<10)

{

P2=disb;

disc=tab[disa];//显示段码

if(set_state==0)//显示时钟

{

if((i==1)||(i==3))

disc=disc|0x80;//增加小数点显示

}

else//设置时显示

{

if(xsd==i)

disc=disc|0x80;//增加小数点显示

}

P0=disc;//送显示

delay();//延时

P0=0x0;

disb++;//下一个要显示的位置

}

}

P2=0xff;

}

voidsetsz(void)//设置时间

{

uchari,k;

set_state=1;//改变显示状态

xsd=0;//设置位置

TR0=0;//停止时钟运行

jssz();//将现在的结果放到数组disdat[]

do

{

display();//显示

i=inkey();//读键

switch(i)

{

case0xd0:

k=0xff;//退出设置,3号键,左

break;

case0xb0:

k=0;//改变设置位置,每按下一次右移一个,2号键,次左

xsd++;//数码管转换

if(xsd==6)

xsd=0;

break;

case0x70:

//加1,1号键,右

k=0;

tzszw(0);

break;

default:

k=0;

break;

}

}

while(k!

=0xff);

set_state=0;//恢复显示时钟

TR0=1;//时钟运行

_nop_();

}

voidtzszw(ucharzj)

{

ucharj;

switch(xsd)

{

case0:

//时高位调整

if(zj==0)

{

disdat[0]++;

if(disdat[0]>2)

disdat[0]=0;

}

hour=disdat[0]*10+disdat[1];

break;

case1:

//时低位调整

if(zj==0)

{

if((disdat[0]==0)||(disdat[0]==1))

{disdat[1]++;

if(disdat[1]>9)

disdat[1]=0;

}

if(disdat[0]==2)

{

disdat[1]++;

if(disdat[1]>3)

disdat[1]=0;

}

}

hour=disdat[0]*10+disdat[1];

break;

case2:

//分高位调整

if(zj==0)

{

disdat[2]++;

if(disdat[2]>5)

disdat[2]=0;

}

min=disdat[2]*10+disdat[3];

break;

case3:

//分低位调整

if(zj==0)

{

disdat[3]++;

if(disdat[3]>9)

disdat[3]=0;

}

min=disdat[2]*10+disdat[3];

break;

case4:

//秒高位调整

if(zj==0)

{

disdat[4]++;

if(disdat[4]>5)

disdat[4]=0;

}

sec=disdat[4]*10+disdat[5];

break;

case5:

//秒低位调整

if(zj==0)

{

disdat[5]++;

if(disdat[5]>9)

disdat[5]=0;

}

sec=disdat[4]*10+disdat[5];

break;

default:

break;

}

}

voiddelay(void)//延时程序

{

uchari;

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

_nop_();

}

voidjssz(void)//将时钟分离送到显示缓存

{

disdat[0]=hour/10;

disdat[1]=hour%10;

disdat[2]=min/10;

disdat[3]=min%10;

disdat[4]=sec/10;

disdat[5]=sec%10;

}

voidsztz(void)//时钟运行计数,每秒运行一次

{

sec++;

if(sec==60)

{

sec=0;

min++;

if(min==60)

{

min=0;

hour++;

if(hour==24)

hour=0;

}

}

}

voidinitsiu(void)//初始化单片机

{

TMOD=0x11;//定时器1:

gate=0->TR1=1开始计数,C/T=0->对内部计数,模式1->16位计数

TH0=0X3C;

TL0=0XAF;

ET0=1;//打开定时器0中断

ET1=0;//关闭定时器1中断

TR0=1;//打开计数器0

TR1=0;//关闭计数器1

EA=1;//总中断允许

}

voidinttime0(void)interrupt1using1

{

TH0=0X3C;//50ms中断一次,20次为一秒,调整时间一次

TL0=0XAF;

count++;

if(count==20)

{

count=0;

sztz();

}

}

/**********************************************************

键盘输入程序1:

0x702:

0xb03:

0xd0

4:

0xe0

**********************************************************/

ucharinkey(void)

{

ucharjjj,keydat;

P2=0xff;//P2准备读入

keydat=P2;//读入键值

keydat=keydat&0xf0;//找出四个键的值

if(keydat!

=0xf0)//有键输入

{

_nop_();

_nop_();

jjj=P2;//再读,去抖动

jjj=jjj&0xf0;

if(jjj!

=keydat)

keydat=0xf0;

do

{

jjj=P2;

jjj=jjj&0xf0;

}//等待键松手

while(jjj!

=0xf0);

}

return(keydat);

}

涡流称重计实验源程序:

#pragmadboe

#include

#include

#include

#include

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

voiddelay(void);

sbitADCS=P3^5;//使能接口

sbitADCLK=P3^4;//时钟接口

sbitADDO=P3^3;//数据输出接口(复用)

sbitADDI=P3^3;//数据输入接口

uchardisdat[3];

ucharcodetab[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f,};

ucharcodetbb[]={0x01};

sbitzsd=P1^0;

uintt,k;

bitc;

ucharbdatabit_status=0x43;//定义一个可位寻址的存储器

sbitstatus_0=bit_status^0;

sbitstatus_7=bit_status^7;

voiddushuju(void)//选择通道子程序

{uchari;

ucharn=0;

ucharm=0;

do

{

ADDI=1;//初始化通道选择

_nop_();

_nop_();

ADCS=0;

_nop_();

_nop_();

ADCLK=1;

_nop_();

_nop_();

ADCLK=0;//第一个下降沿

_nop_();

ADDI=1;

_nop_();

_nop_();

ADCLK=1;

_nop_();

_nop_();

ADCLK=0;//第二个下降沿

_nop_();

ADDI=0;

_nop_();

_nop_();

ADCLK=1;

_nop_();

_nop_();

ADCLK=0;//第三个下降沿

ADDI=1;

_nop_();

_nop_();

for(i=8;i>0;i--)//第一次逆向取数据

{

c=ADDO;

status_0=c;

bit_status<<=1;

ADCLK=1;//形成一个脉冲

_nop_();

_nop_();

ADCLK=0;

_nop_();

_nop_();

}

status_0=ADDO;

n=bit_status;//将接收到的数据存入n

bit_status=0;

for(i=7;i>0;i--)//第二次正向取数据

{

c=ADDO;

status_7=c;

bit_status>>=1;

ADCLK=1;//形成一次脉冲

_nop_();

_nop_();

ADCLK=0;

_nop_();

_nop_();

}

status_7=ADDO;

ADCLK=1;

_nop_();

_nop_();

ADCLK=0;

_nop_();

_nop_();

m=bit_status;//将接收到的数据存入m

}while(n!

=m);//如果两次选取的数据不相等则返回重新取数

ADCS=1;

ADCLK=0;

ADDO=1;

t=n*1.953f;

k=t*46.5f;

}

voiddelay(void)//延时程序

{

uchari;

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

_nop_();

}

voiddisplay(void)//3位数码管显示程序,disdat[]是要显示的内容(是0~9的数字),xsd是在那一位显示小数点

{

uchari,disa,disb,disc;

disb=0x00;//显示第n位

for(i=0;i<3;i++)//共显示3个数据

{

disa=disdat[i];//显示数据

if(disa<10)

{

P2=disb;

disc=tab[disa];//显示段码

//显示时钟

if(i==0)

disc=disc|0x80;//增加小数点显示

P0=disc;//送显示

delay();//延时

P0=0x0;

disb++;//下一个要显示的位置

}

}

for(i=3;i<6;i++)//共显示3个数据

{

if(k>120)//如果超重则显示---

{

disa=disdat[i];//显示数据

if(disa<10)

{

P2=disb;

disc=tbb[0];//显示段码

//显示时钟

P0=disc;//送显示

delay();//延时

P0=0x0;

disb++;//下一个要显示的位置

}

}

else

{

disa=disdat[i];//显示数据

if(disa<10)

{

P2=disb;

disc=tab[disa];//显示段码

//显示时钟

if(i==0)

disc=disc|0x80;//增加小数点显示

P0=disc;//送显示

delay();//延时

P0=0x0;

disb++;//下一个要显示的位置

}

}

//P2=0xff;

}

}

main()

{

IE=0x80;//关闭所有中断

zsd=0;

disdat[0]=t/100;//存电压值

t=t%100;

disdat[1]=t/10;

t=t%10;

disdat[2]=t;

disdat[3]=k/10000;//存重量值

k=k%10000;

disdat[4]=k/1000;

k=k%1000;

k=k/100;

disdat[5]=k;

display();//送显示

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 中医中药

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1