流水灯课程设计C语言编程代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/********************************************************************
* 文件名 : 4个功能由按键控制.c
* 描 述 : 按下A键,实现蜂鸣器动作。
按下B键,实现LED流水灯循环显示。
按下C键,实现数码管动态扫描显示。
按下D键,实现温度测量功能。
* 创建人 : 电子1102班第四小组
***********************************************************************/
#include
#include
#define uint unsigned int // 无符号整形习惯的定义
#define uchar unsigned char //无符号字符型习惯的定义
#define jump_ROM 0xCC
#define start 0x44
#define read_EEROM 0xBE

void buzz_key(void); //子函数声明
void led_key(void);
void tube_key(void);
void wendu_key(void);
unsigned char code duanma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 0 1 2 3 4 5 6 7 8 9
unsigned char code weima[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; // 选择哪个数码管
unsigned char temp[6];
uchar j;
uchar b; //定义变量
sbit duan=P2^6; //定义管脚
sbit wei=P2^7;
sbit key_A=P3^4;
sbit key_B=P3^5;
sbit key_C=P3^6;
sbit key_D=P3^7;
sbit buzz=P2^3;
sbit DIOLA=P2^5;
sbit csda=P3^2;
sbit DQ = P2^2; //DS18B20数据口
unsigned char TMPH,TMPL;
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/


void Delay_1ms(unsigned int t)
{
unsigned char x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
/********************************************************************
* 名称 : delay()
* 功能 : 延时函数
***********************************************************************/
void delay(uint N)
{
int i;
for(i=0; i;
}
/********************************************************************
* 名称 : 主程序Main()
* 功能 : 实现蜂鸣器,流水灯,数码管,交通灯
***********************************************************************/
void main()
{
DIOLA=0; //流水灯锁存器关 流水灯未选通
wei=0; //位选关
duan=1;
P0=0;
duan=0;
csda=0;

while(1)
{
if(key_A==0 || key_B==0 || key_C==0|| key_D==0)
{
if(key_A==0) //A键按下
{
buzz_key(); //调用蜂鸣器子程序
}
else if(key_B==0) //B键按下
{
led_key(); //调用流水灯子程序
}
else if(key_C==0) //C键按下时
{
tube_key(); //调用数码管显示子程序
}
else //D键按下时
{
wendu_key(); //调用温度子程序
}
}
}
}
/********************************************************************
* 名称 : buzz_key(void)
* 功能 : 蜂鸣器子程序
*********

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

void buzz_key(void)
{

DIOLA=0;
wei=0;
buzz=0; //蜂鸣器响
while(key_B&&key_C&&key_D);
buzz=1; //关蜂鸣器
}

/*********************************************************************
* 名称 : led_key(void)
* 功能 : 流水灯子程序
***********************************************************************/
void led_key(void)
{
DIOLA=1;
b=0xfe;
P1=b;//11111110
while(key_A&&key_C&&key_D)
{
b=_crol_(b,1); //左移11111101
Delay_1ms(500);
P1=b; //111111011
Delay_1ms(500);
}
P1=0xff;
}

/********************************************************************
* 名称 : tube_key(void)
* 功能 : 数码管子程序
***********************************************************************/
void tube_key(void)
{
DIOLA=0; //流水灯使能端置0
while(key_A&&key_B&&key_D)
{ unsigned int i;
for(i=0;i<6;i++)
{
wei=1;
P0=weima[i]; //位选信号
wei=0;
duan=1;
P0=duanma[i]; //段选信号
duan=0;
Delay_1ms(200);
}
duan=1;
P0=0;
duan=0; //清零
}

}

/********************************************************************
* 名称 : Reset()
* 功能 : 复位DS18B20
***********************************************************************/
uchar Reset(void)
{
uchar deceive_ready;
DQ= 0;
delay(29);
DQ= 1;
delay(3);
deceive_ready = DQ;
delay(25);
return(deceive_ready);
}

/********************************************************************
* 名称 : read_bit()
* 功能 : 从DS18B20读一个位值
* 输出 : 从DS18B20读出的一个位值
***********************************************************************/
uchar read_bit(void)
{
uchar i;
DQ = 0;
DQ = 1;
for(i=0; i<3; i++);
return(DQ);
}

/********************************************************************
* 名称 : write_bit()
* 功能 : 向DS18B20写一位
* 输入 : bitval(要对DS18B20写入的位值)
***********************************************************************/
void write_bit(uchar bitval)
{
DQ=0;if(bitval==1)
DQ=1;
delay(5);
DQ=1;
}

/********************************************************************
* 名称 : read_byte()
* 功能 : 从DS18B20读一个字节
* 输出 : 从DS18B20读到的值
***********************************************************************/
uchar read_byte(void)
{
uchar i,m,receive_data;
m = 1;
receive_data = 0;
for(i=0; i<8; i++)
{
if(read_bit())
{
receive_data = receive_data + (m << i);
}
delay(6);
}
return(receive_data);
}

/********************************************************************
* 名称 : write_byte()
* 功能 : 向DS18B20写一个字节
* 输入 : val(要对DS18B20写入的命令值)
*******************************

****************************************/
void write_byte(uchar val)
{
uchar i,temp;
for(i=0; i<8; i++)
{
temp = val >> i;
temp = temp & 0x01;
write_bit(temp);
delay(5);
}
}


/********************************************************************
* 名称 : wendu()
* 功能 : 温度子程序
***********************************************************************/
void wendu_key(void)
{
uint temp;
P2 = 0x00;
DIOLA=0;
buzz=1;
while(key_A&&key_C&&key_B)
{
Reset();
write_byte(jump_ROM);
write_byte(start);
Reset();
write_byte(jump_ROM);
write_byte(read_EEROM);
TMPL = read_byte();
TMPH = read_byte();
temp = TMPL / 16 + TMPH * 16;
wei=1;
P0=weima[4]; //位选信号
wei=0;
duan=1;
P0=duanma[temp/10%10]; //段选信号
Delay_1ms(5);
duan=0;
wei=1;
P0=weima[5]; //位选信号
wei=0;
duan=1;
P0=duanma[temp%10]; //段选信号
Delay_1ms(5);
duan=0;
}
}


相关文档
最新文档