#include<reg51.h>
sbit shan=P1^0;
sbit shan2=P1^1;
sbit shan3=P1^2;
sbit shan4=P1^3;
sbit HW0=P2^0;
sbit HW1=P2^1;
sbit HW2=P2^2;
sbit HW3=P2^3;
sbit laba=P1^5;
sbit SPK=P1^4; //定义喇叭端口
unsigned char frq;
void DelayUs2x(unsigned char t);//函数声明
void DelayMs(unsigned char t);
void Init_Timer0(void)
{
/*
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打*/
#pragma asm
mov tmod,#01H
setb EA
SETB ET0
SETB TR0
#pragma endasm
}
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
void Timer0_isr(void) interrupt 1
{
TH0=0xfe; //重新赋值
TL0=frq; //低8位值在主程序中不断累加
SPK=!SPK; //端口电平取反
}
void DelayUs2x(unsigned char t)
{
while(--t);
}
void delay(int i)
{
while(--i)
{
;
}
}
void shanshuo0(void)//这个函数程序是控制灯闪烁
{
int i;
shan=0;
for (i=0;i<300;i++)
{ DelayMs(2); //延时1ms,累加频率值
frq++;}
//delay(50000);
shan=1;
for (i=0;i<300;i++)
{ DelayMs(2); //延时1ms,累加频率值
frq++;}
//delay(40000);
}
void shanshuo1(void)//这个函数程序是控制灯闪烁
{
int i;
shan2=0;
for (i=0;i<150;i++)
{ DelayMs(7); //延时1ms,累加频率值
frq++;}
//delay(50000);
shan2=1;
for (i=0;i<150;i++)
{ DelayMs(7); //延时1ms,累加频率值
frq++;}
}
void shanshuo2(void)//这个函数程序是控制灯闪烁
{
int i;
shan3=0;
for (i=0;i<300;i++)
{ DelayMs(1); //延时1ms,累加频率值
frq--;}
//delay(50000);
shan3=1;
for (i=0;i<300;i++)
{ DelayMs(1); //延时1ms,累加频率值
frq--;}
}
void shanshuo3(void)//这个函数程序是控制灯闪烁
{
int i;
shan3=0;
for (i=0;i<100;i++)
{ DelayMs(8); //延时1ms,累加频率值
frq--;}
//delay(50000);
shan3=1;
for (i=0;i<100;i++)
{ DelayMs(8); //延时1ms,累加频率值
frq--;}
}
void LCD(void)
{
#pragma asm
RS EQU P2.4 //液晶屏读操作定义
RW EQU P2.5 //液晶屏写操作定义
E EQU P2.6//使能端 =1运行
org 00h
a_bit equ 30h ;个位数存放处
b_bit equ 31h ;十位数存放处
c_bit equ 32h ;百位数存放处
d_bit equ 33h ;千位数存放处
e_bit equ 34h ;万位数存放处
f_bit equ 35h ;十万位数存放处
mov a,#30h ;30H的ASCIC码为0 0的值赋予a
mov a_bit,a
mov b_bit,a
mov c_bit,a
mov d_bit,a
mov e_bit,a
mov f_bit,a //全部为0 ///以下为指令集
org 0030h
MOV P0,#00000001B ;清屏
ACALL ENABLE
MOV P0,#00111000B ;显示功能
ACALL ENABLE
MOV P0,#00001100B ;显示开关控制
ACALL ENABLE
MOV P0,#06H ;输入模式
ACALL ENABLE
MOV p0,#80H ;第一行的开始位置//第一行地址为80H
cALL ENABLE
MOV P0,#00000001B ;清屏
ACALL ENABLE//调用程序至 enable
MOV DPTR,#TABLE1 ;显示PASS WORD
CALL WRITE1 ;到TABLE1取码//数据指针跳至TABLE1
stlop: acall display ;显示//跳至display
inc a_bit ;加1
mov a,a_bit
cjne a,#3AH,stlop ;如果A的值到3AH那么继续否则重新;判断是否进位
mov a_bit,#30h ;显示数送30H(就是显示0)
inc b_bit
mov a,b_bit
cjne a,#3AH,stlop
mov b_bit,#30h
inc c_bit
mov a,c_bit
cjne a,#3AH,stlop
mov c_bit,#30h
inc d_bit
mov a,d_bit
cjne a,#3AH,stlop
mov d_bit,#30h
inc e_bit
mov a,e_bit
cjne a,#3AH,stlop
mov e_bit,#30h
inc f_bit
mov a,f_bit
cjne a,#3AH,stlop
mov f_bit,#30h
ajmp stlop
display: ;显示子程序
MOV P0,#0C9H//定位 a_bit 位置显示
ACALL ENABLE
MOV A,A_BIT
ACALL WRILTE2//显示
MOV P0,#0C8H ;显示的位置 继续定位 以下为更高位显示
ACALL ENABLE
MOV A,B_BIT ;显示10位数
ACALL WRILTE2 ;显示
MOV P0,#0C7H ;数据存贮器地址
ACALL ENABLE
MOV A,C_BIT
ACALL WRILTE2
MOV P0,#0C6H ;数据存贮器地址
ACALL ENABLE
MOV A,D_BIT
ACALL WRILTE2
MOV P0,#0C5H ;数据存贮器地址
ACALL ENABLE
MOV A,E_BIT
ACALL WRILTE2
MOV P0,#0C4H ;数据存贮器地址
ACALL ENABLE
MOV A,F_BIT
ACALL WRILTE2
;1MS延时(按12MHZ算)
;====================================================
D1MS: MOV R7,#2
DJNZ R7,$
RET
WRILTE2:MOV p0,A ;显示
SETB RS
CLR RW
CLR E
CALL DELAY
CALL DELAY3
SETB E
RET
WRITE1: MOV R1,#00H ;显示table中的值
A1: MOV A,R1 ;到table取码
MOVC A,@A+DPTR
call WRILTE2 ;显示到lcd
INC R1
CJNE A,#00H,A1 ;是否到00h
RET
ENABLE: CLR RS ;送命令
CLR RW //选择读写 0或1
CLR E
ACALL DELAY
SETB E
RET
DELAY: MOV P0,#0FFH
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P0.7,DELAY;判断忙标志//如果p0.7=1 回到delay 防止lcd逸出
RET//返回源程序
DELAY3: ; 延时程序
MOV R7,#254
D1:MOV R6,#27
D2: DJNZ R6,D2
DJNZ R7,D1
RET
table1: db"seconds ",00H
#pragma endasm
}
int i;
void main(void)
{
HW0=1;
HW1=1;
HW2=1;
HW3=1;
Init_Timer0();
delay(20000);
while(1)
{
if(HW0==0)
{
laba = 1;
for(i=0;i<3;i++)
shanshuo0();
shan = 0;
LCD();
}
else if(HW1==0)
{
laba = 1;
for(i=0;i<3;i++)
shanshuo1();
shan2 = 0;
LCD();
}
else if(HW2==0)
{
laba = 1;
for(i=0;i<3;i++)
shanshuo2();
shan3=0;
LCD();
}
else if(HW3==0)
{
laba = 1;
for(i=0;i<3;i++)
shanshuo3();
shan4=0;
DelayMs(1); //延时1ms,累加频率值
frq--;
LCD();
}
else
{laba = 0;
HW0=1;
HW1=1;
HW2=1;
HW3=1;
} }
}
C51上使用C语言、汇编语言混编实现红外检测报警器
需积分: 5 69 浏览量
2019-03-03
18:05:46
上传
评论 2
收藏 43KB RAR 举报
gakki__Yui
- 粉丝: 12
- 资源: 7
最新资源
- 常用工具集参考用于图像等数据处理
- 音乐展示网页、基于Stenography的图像数字水印添加与提取,以及基于颜色矩和Tamura算法的图像相似度评估算法py源码
- 基于EmguCV(OpenCV .net封装),图像数字水印加解密算法的实现,其中包含最低有效位算法,离散傅里叶变换算法+文档书
- 基于matlab+DWT的图像水印项目,数字水印+源代码+文档说明+图片+报告pdf
- (优秀毕业设计)基于python实现的数字图像可视化水印系统的设计与实现,多种数字算法实现+源代码+文档说明+理论演示pdf
- 基于DWT-DCT-SVD和deflate压缩的数字水印方法python源码+Gui界面+演示视频(高分毕业设计)
- 基于matlab实现DWT、DCT、SVD算法数字图像水印可视化系统+GUI界面+文档说明+详细注释(高分毕业设计)
- NCIAE-Data-Structure大一大二笔记
- 学习wireshark笔记
- digital-image-数据可视化笔记
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈