电子时钟C语言程序和涡流传感器称重C语言程序.docx
《电子时钟C语言程序和涡流传感器称重C语言程序.docx》由会员分享,可在线阅读,更多相关《电子时钟C语言程序和涡流传感器称重C语言程序.docx(16页珍藏版)》请在冰豆网上搜索。
电子时钟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();//送显示
}