- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
工程测控课程设计 电子c082班 王柳 087774
工程测控系统课程设计
使用51单片机设计软件钟、涡流称重计、光电转速计
实验目的:
掌握元器件及芯片的焊接与调试;
了解基于51单片机的软件钟、涡流称重计、光电转速计的工作原理;
熟悉掌握AT89C51系列单片微型计算机的工作原理、熟悉ADC0832的器件手册;
会用C语言编写时钟函数,复习用switch语句和do-while语句、for语句实现循环的方法;
会使用MEDWIN编译调试程序,并生成HEX,通过数据线下载到电路板上;
根据自己焊接的板子在程序中设置按键控制时钟的调整。
了解电涡流传感器用于称重的原理与方法、了解光电传感器的工作原理及其使用方法;
软件钟
算法原理:
所谓软件钟就是利用51单片机制作一个电子时钟。
其算法就是以单片机的时钟为基准,记录单片机时钟脉冲的数量,当数量足够多(如脉冲为每秒6Mhz,那么记录6M个脉冲所需时间即为1秒)就可以将显示部分的“秒”位加一。加到60以后进位为“分”,”秒“位清零以后继续记录。当“分”累加为60以后进位为”时“,”分“位清零以后继续记录,当”时“位为24以后,”时“位清零并继续记录。
硬件原理:
显示电路:
单片机外围电路(复位电路,时钟电路): 按键控制电路:
数码管驱动电路:
实现功能要求:
使用中需要对时钟进行调整。在调整的时候需要一个按键来进入调整状态。进入调整状态以后需要一个按键来向左移动调整位置,一个按键来向右移动调整位置,一个按键来增加所选位置的数值,一个按键来减小所选位置的数值。调整完成以后还需要一个按键来 退出调整位置,恢复时钟的计数运转。以上所需按键可以根据需要合并。
在调整中另外一个需要注意的问题是如何显示目前所选定调整的位置(如秒的个位或者十位,分的个位或者十位等)。可以采用是否显示数位右下的小数点或者所选需调整位是否闪烁来让操作者明确目前自己所选定的需要调整的数位。
设计内容:
(1)硬件焊接:
按照电路图焊接好各个元器件和芯片插座,注意焊接时焊点要尽量光滑,与管脚接触良好,元件的管脚弯曲处要尽量光滑,有需要区分正负极的元器件焊接时要注意不要焊反。焊接完后将元件多余的管脚用尖嘴钳剪掉,以免形成短路。
(2)软件设计:
1.子程序设计:
单片机初始化程序
定时器T0中断服务程序
显示子程序
时钟运行计数子程序
时间数据送显示缓冲区子程序
设置时间子程序
时钟调整子程序
键值读入子程序
延时子程序
2.实验程序清单:
#pragma db oe
#include reg52.h
#include absacc.h
#include string.h
#include stdio.h
#include intrins.h
#include MATH.H
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
void display(void);
void initsiu(void);
void delay(void);
void sztz(void);
void jssz(void);
void setsz(void);
void tzszw(uchar zj);
uchar inkey(void);
uchar sec,min,hour;
uchar disdat[6];
uchar code tab[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f};
uint count;
uchar set_state,xsd;
sbit zsd=P1^0;
main()
{
uchar i;
for (i=0;i2;i++)
{
disdat[i]= 0; //将显示缓存清零
}
initsiu(); //初始化单片机
set_state=0;
do
{
i=inkey(); //设置时钟
if(i==0x70)
setsz();
jssz();
display(); //显示
if((sec 0x01)) //指示灯闪烁
zsd=1;
else
zsd=0;
}
while(1);
}
void display(void)//六位数码管显示程序,disdat[]是要显示的内容(是0~9的数字),xsd是在那一位显示小数点
{
uchar i,disa,disb,disc;
disb = 0x00; //显示第n位
for (i=0;i6;i++) //共显示6个数据
{
disa = disdat[i]
文档评论(0)