高分求单片机定时器程序

it dula = P2^6;

STC89C52的板写的,通过DS1602实现,并包括了矩阵键盘的功能

lcd1602流程图_lcd1602显示流程lcd1602流程图_lcd1602显示流程


lcd1602流程图_lcd1602显示流程


P0=com;

#include

#define uchar unsigned char

#define uint unsigned int

uchar code table[]="ME-400-A clock";

uchar code table1[]=" --:--:-- ";

uchar code table2[]="ALL:00:00:-- ";

uchar code table3[]=" ";

uchar clk_time[3]; //秒,分,时寄存器初始值

it T_RST=P2^2;//ds1302-5

it T_IO=P2^3;//ds1302-6

it T_CLK=P2^4;//ds1302-7

it en=P2^5; //参照LCD1602说明档,使能信号

it rw=P2^6; //。。。。。。。。,读写信号端(输入高电频时为读,低电为写)

it rs=P2^7; //。。。。。。。。,数据/命令选择端(H/L)

it led=P1^0;

it dula=P1^1;

it wela=P1^2;

it ACC0=ACC^0;

it ACC7=ACC^7;

it up=P3^3;

it down=P3^4;

it set=P3^2;

it did=P1^4;

uchar num,clock_ss,clock_sg,clock_fs,clock_fg,clock_ms,clock_mg,b,clock_s,clock_g;

char hour,mie,sei,c,nhour,nmie,shour,ie;

/DS1302:写入作(上升沿)/

void write_byte(uchar da)

ACC=da;

for(i=8;i>0;i--)

{T_IO=ACC0;

/T_CLK=0;

T_CLK=1;

ACC=ACC>>1;

}}

/DS1302:读取作(下降沿)/

uchar read_byte(void)

for(i=0;i<8;i++)

{ACC=ACC>>1;

T_CLK = 1;

T_CLK = 0;

ACC7 = T_IO;

}return(ACC);

}/DS1302:写入数据(先送地址,再写数据)/

void write_1302(uchar addr,uchar da)

{T_RST=0; //停止工作

T_CLK=0; //只有在CLK为低电平时,才能将RST置为高电平,然后才能传输数据

write_byte(addr); //写入地址

write_byte(da);

T_RST=0;

T_CLK=1;

}/DS1302:读取数据(先送地址,再读数据)/

uchar read_1302(uchar addr)

{uchar temp;

T_RST=0; //停止工作

T_CLK=0;

T_RST=1; //重新工作

write_byte(addr); //写入地址

temp=read_byte();

T_RST=0;

T_CLK=1; //停止工作

return(temp);

}/延时程序=a1ms/

void delay(uint z)

{uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}void fn()

{did=0;

delay(120);

delay(120);

did=0;

delay(120);

delay(120);

did=0;

delay(120);

delay(120);

did=0;

delay(320);

delay(400);

}void write_com(uchar com)

{led=1;

wela=1;

P0=0xff;

delay(1);

led=0;

wela=0;

P0=0x00;

dula=1;

delay(1);

dula=0;

rs=0;

delay(5);

en=1;

delay(5);

en=0;

}void write_data(uchar date)

{led=1;

wela=1;

P0=0xff;

delay(1);

led=0;

wela=0;

P0=0x00;

dula=1;

delay(1);

dula=0;

rs=1;

P0=date;

delay(5);

en=1;

delay(5);

en=0;

}void morning()

{ shour=clock_ss10+clock_sg;

ie=clock_fs10+clock_fg;

if(b==0)

{if(nhour==shour)

{if(ie>=nmie)

{fn();

}}

}}

void init()

{b=0;

P0=0xff;

delay(5);

led=1;

delay(5);

P0=0xff;

led=0;

dula=0;

wela=1;

delay(5);

wela=0;//关ME-400开发板数码管

nhour=0;

nmie=0;

rw=0;

en=0;

write_com(0x38);//设置液晶

write_com(0x0c);//设光标等

write_com(0x06);//写一个字符地址指针加1且光标加1

write_com(0x01);//清屏

write_com(0x80);//设置s地址指针

{if(b==0)

{clock_ms=clk_time[0]/ 16; clock_mg=clk_time[0]%16;

led=0;

clock_fs=clk_time[1]/ 16; clock_fg=clk_time[1]%16;

led=0;

clock_ss=clk_time[2]/ 16; clock_sg=clk_time[2]%16;

write_com(0x80+0x44);

write_data(0x30+clock_ss);

write_com(0x80+0x45);

write_data(0x30+clock_sg);

write_com(0x80+0x47);

write_data(0x30+clock_fs);

write_com(0x80+0x48);

write_data(0x30+clock_fg);

write_com(0x80+0x4a);

write_data(0x30+clock_ms);

write_com(0x80+0x4b);

write_data(0x30+clock_mg);

}if(b!=0)

{clock_s=date/ 10; clock_g=date%10;

write_com(0x80+0x40+add);

write_data(0x30+clock_s);

write_data(0x30+clock_g);

}}

void key()

{uchar clock_s1, clock_s2, clock_f1, clock_f2;

rw=0;

if(set==0)

{delay(10);

if(set==0)

{did=0;

delay(10); did=1;

b++;

}while(!set);

if(b==1)

{hour=clock_ss10+clock_sg;

mie=clock_fs10+clock_fg;

write_com(0x80+0x45);

write_com(0x0f);

}if(b==2)

{write_com(0x80+0x48);

}if(b==3)

{write_com(0x80+0x40);

for(num=0;num<13;num++)

{write_data(table2[num]);

}write_com(0x80+0x45); display(4,nhour);write_com(0x80+0x45);

}if(b==4)

{write_com(0x80+0x48);

display(7,nmie); write_com(0x80+0x48);

}if(b==5)

{write_com(0x80+0x40);

for(num=0;num<4;num++)

{write_data(table3[num]);

}write_com(0x80+0x45);

write_com(0x0c);

b=0;

clock_s1=hour/10;//十进制转十六进制

clock_s2=hour%10;//十进制转十六进制

clock_s1=clock_s1&0xff;//十进制转十六进制

clock_s2=clock_s2&0xff;//十进制转十六进制

clock_s1<<=4;//十进制转十六进制

clock_s1=clock_s1|clock_s2;//十进制转十六进制

clock_f1=mie/10;//十进制转十六进制

clock_f2=mie%10;//十进制转十六进制

clock_f1=clock_f1&0xff; //全1出1 与运算

clock_f2=clock_f2&0xff;//十进制转十六进制

clock_f1<<=4;//十进制转十六进制

clock_f1=clock_f1|clock_f2;//十进制转十六进制

write_1302(0x8e,0x00); //WP=0 写作

write_1302(0x80,0x00);//写秒

write_1302(0x82,clock_f1);//写分

write_1302(0x84,clock_s1);//写时

write_1302(0x86,0x14);//写日

write_1302(0x88,0x02);//写月

write_1302(0x8a,0x06);//写星期

write_1302(0x8c,0x09);

write_1302(0x8e,0x80); //WP=1 写保护

}}

{if(up==0)

{delay(10);

if(up==0)

{did=0;

delay(10);

while(!up);

if(b==1)

{hour++;

if(hour>=24)

{delay(1);

hour=0;

}display(4,hour);

write_com(0x80+0x45);

}if(b==2)

{mie++;

if(mie>=60)

{mie=0;

}display(7,mie);

write_com(0x80+0x48);

}if(b==3)

{nhour++;

if(nhour>=24)

{delay(1);

nhour=0;

}display(4,nhour);

write_com(0x80+0x45);

}if(b==4)

{nmie++;

if(nmie>=60)

{nmie=0;

}display(7,nmie);

write_com(0x80+0x48);

}}

}if(down==0)

{delay(10);

if(down==0)

{did=0;

delay(10);

while(!down);

if(b==1)

{hour--;

if(hour<0)

{hour=23;

}display(4,hour);

write_com(0x80+0x45);

}if(b==2)

{mie--;

if(mie<0)

{mie=59;

}display(7,mie);

write_com(0x80+0x48);

}if(b==3)

{nhour--;

if(nhour<0)

{nhour=23;

}display(4,nhour);

write_com(0x80+0x45);

}if(b==4)

{nmie--;

if(nmie<0)

{nmie=59;

}display(7,nmie);

write_com(0x80+0x48);

}}

}}

}void main()

{uchar temp=0x80;

uchar i;

init();

for(num=0;num<14;num++)

{write_data(table[num]);

delay(100);

}write_com(0x80+0x40); // 设置数据地址指针为0X40

for(num=0;num<15;num++)

{write_data(table1[num]);

}/for(num=0;num<16;num++)

{write_com(0x18);

delay(20);

}/

write_1302(0x8e,0x00);

write_1302(0x90,0xa4);

write_1302(0x8e,0x80);

{if(b==0)

{ temp=0x81;

for(i=0;i<3;i++)

{clk_time[i]=read_1302(temp);

temp+=2;

}display(0x4b,0x00);

}morning();

key();

}}

lcd1602显示流程图

{uchar i;

lcd1602显示流程图:

T_RST=1; //重新工作

LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。

不同厂家生产的LCD1602芯片可能有所不同,但使用方法都是一样的。为了降低成本,绝大多数制造商都直接将片做到板子上。

扩展资料:

LCD1602与单片机的连接有两种方式,一种是直接控制方式,另一种是所谓的间接控制方式。它们的区别只是所用的数据线的数量不同,其他都一样。

1、直接控制方式

LCD1602的8根数据线和3根控制线E,RS和R/W与单片机相连后即可正常工作。一般应用中只须往LCD1602中写入命令和数据,因此,可将LCD1602的R/W读/写选择控制端直接接地,这样可节省1根数据线。

VO引脚是液晶对比度调试端,通常连接一个10kΩ的电位器即可实现对比度的调整{unsigned char count;;也可采用将一个适当大小的电阻从该引脚接地的方法进行调整,不过电阻的大小应通过调试决定。

2、间接控制方式

间接控制方式也称为四线制工作方式,是利用HD44780所具有的4位数据总线的功能,将电路接口简化的一种方式。为了减少接线数量,只采用引脚DB4~DB7与单片机进行通信,先传数据或命令的高4位,再传低4位。

采用四线并口通信,可以减少对微I/O的需求,当设计产品过程中单片机的I/O资源紧张时,可以考虑使用此方法。

参考资料来源:

基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数字温度计程序,用C语言编程

while(1)

#include }for(count = 1; count != 5; count++)

#include

#include

#define uchar unsigned char

#define uint unsigned int

it wela = P2^7;

it RS = P3^5;

it LCDEN = P3^4;

void delayUs()

{_nop_();

}void delayMs(uint a)

{uint i, j;

for(i = a; i > 0; i--)

for(j = 100; j > 0; j--);

}void writeComm(uchar comm)

{RS = 0;

P0 = comm;

LCDEN = 1;

delayUs();

LCDEN = 0;

delayMs(1);

}//写数据:RS=1, RW=0;

void writeData(uchar dat)

{RS = 1;

P0 = dat;

LCDEN = 1;

delayUs();

LCDEN = 0;

delayMs(1);

}void init()

{dula = wela = 0;

writeComm(0x38);

writeComm(0x0c);

writeComm(0x06);

writeComm(0x01);

}void writeString(uchar str, uchar length)

for(i = 0; i < length; i++)

{writeData(str[i]);

}}

///DS18B20/

it ds = P2^2;

void dsInit()

{unsigned int i;

ds = 0;

i = 100;

while(i>0) i--;

ds = 1;

i = 4;

while(i>0) i--;

}void dsWait()

{unsigned int i;

while(ds);

while(~ds);

i = 4;

while(i > 0) i--;

}bit readBit()

{unsigned int i;

bit b;

ds = 0;

i++;

ds = 1;

i++; i++;

b = ds;

i = 8;

while(i>0) i--;

return b;

}unsigned char readByte()

{unsigned int i;

unsigned char j, dat;

dat = 0;

for(i=0; i<8; i++)

{j = readBit();

dat = (j << 7) | (dat >> 1);

}return dat;

}void writeByte(unsigned char dat)

{unsigned int i;

unsigned char j;

bit b;

for(j = 0; j < 8; j++)

{b = dat & 0x01;

dat >>= 1;

if(b)

{ds = 0; i++; i++;

ds = 1;

i = 8; while(i>0) i--;

}else

{ds = 0;

i = 8; while(i>0) i--;

ds = 1;

i++; i++;

}}

}void sendChangeCmd()

{dsInit();

dsWait();

delayMs(1);

writeByte(0xcc);

writeByte(0x44);

}void sendReadCmd()

{dsInit();

dsWait();

delayMs(1);

writeByte(0xcc);

writeByte(0xbe);

}int getTmpValue()

{unsigned int tmpvalue;

int value;

float t;

unsigned char low, high;

sendReadCmd();

low = readByte();

high = readByte();

tmpvalue = high;

tmpvalue <<= 8;

tmpvalue |= low;

value = tmpvalue;

t = value 0.0625;

value = t 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5

return valdelayNOP();ue;

}void display(int v)

unsigned char datas[] = {0, 0, 0, 0, 0};

unsigned int tmp = abs(v);

datas[0] = tmp / 10000;

datas[1] = tmp % 10000 / 1000;

datas[2] = tmp % 1000 / 100;

datas[3] = tmp % 100 / 10;

datas[4] = tmp % 10;

writeComm(0xc0+3);

if(v < 0)

{writeString("- ", 2);

}else

{writeString("+ ", 2);

}if(datas[0] != 0)

{writeData('0'+datas[0]);

{writeData('0'+datas[count]);

if(count == 2)

{writeData('.');

}}

}///DS18B20/

void main()

{uchar table[] = " xianzaiwendu:";

init();

writeComm(0x80);

writeString(table, 16);

{delayMs(1000); //温度转换时间需要750ms以上

writeComm(0xc0);

display(getTmpValue());

}}

proteus用什么代替摄像头

sendChangeCmd(/);

proteus用代替摄像头。

//接受到3,发送字符'L'给计算机

就用滑动变阻器代替了,可是添加程序运行时,LCD1602没有显示。要怎么修改TCS3200输出的是随不同颜色和强度对应不同频率,占空比50%的矩形波。

ProteusVisualDesigner将世界的ProteusVSM仿真与易于使用的流程图编辑器和虚拟硬件库相结合,为Arduino和RaspberryPi提供真正集成且直观。

3D面部图象识别系统和指纹识别系统_3d人脸识别和指纹识别哪个安全

void

1.硬件设计方案

=0;

本系统主要使用了指纹模块,MicroSD卡读写模块,PCF8563模块,蜂鸣器模块,矩阵按键模块,lcd1602,和STC90C516RD

系统框图如下:

1)指纹模块

采用FPM10A光学指纹模块。FPM10A光学指纹模块是经典的光学指纹模块,性能稳定,应用范围广,可选用TTL串口或USB接口,可使用51单片机

2)存储模块

方案一:采用EEPROM模块

EEPROM模块简单,采用iic通讯,但存储量小,寿命有限,没有锻炼价值,所以弃用。

方案二:采用MicroSD卡读写模块

MicroSD读写卡模块,采用SPI协议通讯,这个通讯协议还没接触过,且比EEPROM存储量大,使用普遍,所以本系统采用MicroSD读写卡模块.

3)实时时钟

采用PCF8563模块。该芯片比DS1302更为稳定,走时更准,功耗。

2.程序设计和设计思路

程序流程图如下:

该项目实现签到,添加指if(b!=0)纹,删除单个指纹,搜索指纹,和清空指纹等作。

签到是搜索该指纹ID后,存储时间戳到MicroSD对应的扇区中,且蜂鸣器会响视为签到成功。功能选择使用4个按键,用循环向下选择的方式。添加指纹中,首先先获得指纹图像1,存储到buffer1中,再获得指纹图像2,存储到buffer2中,再写命令使buffer1和buffer2形成特征模板,再存入特定的ID中,初始化ID对应的MicroSD扇区。删除单个指纹和搜索指纹中,我使用两种方法找到该指纹的ID,一种是按键输入,还是用四个按键循环,二种是通过搜索指纹找到该指纹的ID,在按键指纹中需要判断该ID是否存在,通过在对应MicroSD卡设置标志位的方法,确定该ID是否在用,该标志位与指纹模块同步。搜索指纹找到ID后显示,对应ID的签到时间。清空指纹是清空指纹模块和对应的MicroSD卡扇区。

电脑与AT89S51单片机串口通信的51端程序

void

这是C语言的,试试吧,

did=1;

#include

#include

#define

uchar

unsigned

char

#define

uint

unsigned

int

it

LCD_RS

=P2}void display(uchar add,date)^0;

it

LCD_RW

=P2^1;

it

LCD_EN

=P2^2;

#define

{_nop_();_nop_();_nop_();_nop_();};

uchar

data

RXDdata[

]=

{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,

0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20

};

uchar

temp,buf,m,count;

bit

playflag=0;

uchar

code

cdis1[

]=

{"

SERILA

TRANFER

"};

uchar

code

cdis2[

]=

{"

"};

/

延时子程序

/

delay1(uint

ms)

{uchar

k;

while(ms--)

{for(k

k<

120;

k++);

}}

//

/

/检查LCD忙状态

/lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。

/

//

bit

lcd_busy()

{bit

result;

LCD_RS

LCD_RW

=1;

LCD_EN

=1;

result

=(bit)(P0&0x80);

LCD_EN

return(result);

}//

/

/写指令数据到LCD

/RS=L,RW=L,E=高脉冲,D0-D7=指令码。

/

//

lcd_wcmd(uchar

cmd)

{while(lcd_busy());

LCD_RS

LCD_RW

LCD_EN

_nop_();

_nop_();

P0

=cmd;

LCD_EN

=1;

LCD_EN

}//

/

/写显示数据到LCD

/RS=H,RW=L,E=高脉冲,D0-D7=数据。

/

//

lcd_wdat(uchar

dat)

{while(lcd_busy());

LCD_RS

=1;

LCD_RW

LCD_EN

P0

=dat;

LCD_EN

=1;

LCD_EN

}//

/

/

LCD初始化设定

/

//

lcd_init()

{delay1(15);

lcd_wcmd(0x01);

//清除LCD的显示内容

lcd_wcmd(0x38);

//162显示,57点阵,8位数据

delay1(5);

lcd_wcmd(0x38);

delay1(5);

lcd_wcmd(0x38);

delay1(5);

lcd_wcmd(0x0c);

//开显示,显示光标,光标闪烁

delay1(5);

lcd_wcmd(0x01);

//清除LCD的显示内容

delay1(5);

}//

/

/

设定显示位置

/

//

lcd_(uchar

)

{lcd_wcmd(

|0x80);

//数据指针=80+地址变量

}/

发送数据函数

/

senddata(uchar

dat)

{SBUF

=dat;

while(!TI);

TI

}/

串行中断服务函数

/

serial()

interrupt

4{

ES

//关闭串行中断

RI

//清除串行接受标志位

buf

=SBUF;

//从串口缓冲区取得数据

playflag=1;

switch(buf)

{case

0x31:

senddata('W');break;

//接受到1,发送字符'W'给计算机

case

0x32:

senddata('I');break;

//接受到2,发送字符'I'给计算机

case

0x33:

senddata('L');break;

case

0x34:

senddata('L');break;

//接受到4,发送字符'L'给计算机

case

0x35:

senddata('A');break;

//接受到5,发送字符'A'给计算机

case

0x36:

senddata('R');break;

//接受到5,发送字符'R'给计算机

default:

senddata(buf);break;

//接受到其它数据,将其发送给计算机

}if(buf!=0x0D)

{if(buf!=0x0A)

{temp

=buf;

if(count<16)

{RXDdata[count]=temp;

count++;

}}

}ES

=1;

//允许串口中断

}/

数据显示函数

/

play()

{if(playflag)

{lcd_(0x40);

//设置位置为第二行

for(m=0;m<16;m++)

lcd_wdat(cdis2[m]);

//清LCD1602第二行

for(m=0;m<16;m++)

{lcd_(0x40+m);

//设置显示位置为第二行

lcd_wdat(RXDdata[m]);

//显示字符

}playflag=0;

count=0x00;

for(m=0;m<16;m++)

RXDdata[m]=0x20;

//清显存单元

}}

/

主函数

/

main(void)

{P0

=0xff;

P2

=0xff;

SCON=0x50;

//设定串口工作方式

PCON=0x00;

//波特率不倍增

TMOD=0x20;

//定时器1工作于8位自动重载模式,

用于产生波特率

EA=1;

ES

=1;

//允许串口中断

TL1=0xfd;

TH1=0xfd;

//波特率9600

TR1=1;

lcd_init();

lcd_(0x00);

//设置显示位置为行

for(m=0;m<16;m++)

lcd_wdat(cdis1[m]);

//显示字符

lcd_(0x40);

//设置显示位置为第二行

for(m=0;m<16;m++)

lcd_wdat(cdis2[m]);

//显示字符

{play();

}}

//

/打开串口调试程序,将波特率设置为9600,无奇偶校验

晶振11.0592MHz,发送和接收使用的格式相同,如都使用

字符型格式,在发送框输入 hello,I Love MCU ,在接

收框中同样可以看到相同字符,说明设置和通信正确

#include

/主程序/

void main (void)

{SCON = 0x50; / SCON: 模式 1, 8-bit UART, 使能接收 /

TMOD |= 0x20; / TMOD: timer 1, mode 2, 8-bit reload /

TH1 = 0xFD; / TH1: reload value for 9600 baud @ 11.0592MHz /

TR1 = 1; / TR1: timer 1 run /

EA = 1; /打开总中断/

ES = 1; /打开串口中断/

while (1) /主循环不做任何动作/

{}

}void UART_SER (void) interrupt 4 //串行中断服务程序

{unsigned char Temp; //定义临时变量

if(RI) //判断是接收中断产生

{RI=0; //标志位清零

Temp=SBUF; //读入缓冲区的值

P1=Temp; //把值输出到P1口,用于观察

SBUF=Temp; //把接收到的值再发回电脑端

}if(TI) //如果是发送标志位,清零

TI=0;

}参考一下吧~