大三上学期写的一个课程设计,完成的功能就是读取当前环境温度,在数码管上显示,并根据其驱动风扇转动的快慢,另用键盘扫描实现了总开关,超过一定阈值蜂鸣器响起。用51单片机由于芯片问题,使用两个定时器,很容易得到脏数据,程序当时写完,反复检查各种模块,和老师讨论,得出不是代码的问题,就进行了一次数据过滤
主要难点:步进电机的控制,使用占空比。
回头看,段锁存和位锁存都弄不清楚了,位锁存就是第几个数码管,段锁存就是数码管上的第几段,锁存器的锁存端为1是,数据直通,为0时就无论输入什么,输出保持前一次的输入值。
主程序:
#include<reg52.h>
#include "18b20.h"
#include "delay.h"
sbit LATCH1=P2^6;//定义锁存使能端口 段锁存
sbit LATCH2=P2^7;// 位锁存
sbit A1=P1^0; //定义步进电机连接端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;
sbit SPK1=P1^4; //定义喇叭端口
bit ReadTempFlag;//定义读时间标志
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电
#define KeyPort P3
unsigned char code dofly_DuanMa[10]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char code special_DuanMa[10]={
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};// 带小数点的段码0~9
unsigned char TempData[8]; //存储显示值的全局变量
unsigned int CYCLE=100,PWM_ON=0;//定义周期并赋值
unsigned char key = 0; //键盘扫描
unsigned int flag=0; //电机转动开关
unsigned int lin=0;
unsigned int tp=0;
void Init_Timer0(void);//定时器初始化
void Init_Timer1(void);
void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数
unsigned char KeyScan(void);//键盘扫描
unsigned char KeyPro(void);
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
unsigned int TempH,TempL;
unsigned int temp=0;
unsigned int hig,low;
Init_Timer0();
Init_Timer1();
while (1)

最低0.47元/天 解锁文章
3210





