搜档网
当前位置:搜档网 › dht11在stc15程序

dht11在stc15程序

dht11在stc15程序
dht11在stc15程序

上面为项目文件结构,使用STC15F104E单片机在6MHz时钟频率调试成功,因为dht11对软件延时精度要求比较高,以上程序的软件延时是通过逻辑分析仪得出,不能移植与其他单片机,只能用于stc12c/stc11使用6 MHz晶振或者其它晶振使用分频产生6 MHz主时钟,或者使用stc15f10X系列无晶振单片机把主时钟调整为6MHz.

源程序1 …………………………dht11.c

#include "STC12.h"

#include "5110.h"

#include

#define uint unsigned int

#define uchar unsigned char

sbit io=P3^4;//DHT11数据端

uchar data_byte;

uchar HH,HL,TH,TL;

void delay(uchar z) //10ms @6Mhz

{

unsigned char i, j,k;

for(k=0;k

{

_nop_();

_nop_();

i = 59;

j = 89;

do

{

while (--j);

} while (--i);

}}

void delay1() //延时5us @6Mhz

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

void Delay2() //@6.000MHz 200us {

unsigned char i, j;

_nop_();

_nop_();

i = 2;

j = 38;

do

{

while (--j);

} while (--i);

}

void start()//开始信号

{

io=1;

delay(5);

io=0;

delay(2);

io=1;

}

uchar receive_byte()

{

uchar i,count;

for(i=0;i<8;)

{

while(!io)

count =0;

while(io)

{

count++;

delay1();

}

if((count>13)&&(count<17))

{

data_byte<<=1;

data_byte|=0x01;

++i;

}

if((count>3)&&(count<7))

{

data_byte<<=1;

++i;

}

}

return data_byte;

}

void receive()

{

uchar T_H,T_L,H_H,H_L,check,num_check;

start(); //开始信号

while(io); //读取DHT11响应信号{

Delay2();

H_H=receive_byte();

H_L=receive_byte();

T_H=receive_byte();

T_L=receive_byte();

check=receive_byte();

io=1;

num_check=H_H+H_L+T_H+T_L;

if(num_check==check) //校验数据

{

HH=H_H;

HL=H_L;

TH=T_H;

TL=T_L;

check=num_check;

}

}

}

main()

{

uchar g;

delay(50);

for(g=0;g<10;g++) //输出延时波形用于调整软件延时{

io=!io;

delay1();

}

LCD_init(); //初始化LCD模块

LCD_clear(); //清屏幕

HH=0;TH=0;HL=0;TL=0;

LCD_write_hanzi(0,0,0); //初始化屏幕

LCD_write_hanzi(2,0,1);

LCD_write_hanzi(0,2,2);

LCD_write_hanzi(2,2,3);

while(1)

{

receive();

LCD5110ShowNum(4,0,TH); //显示温度

LCD5110ShowNum(4,2,HH); //显示数据

delay(255);

HH=0;

TH=0;

HL=0;

TL=0;

}

}

源程序2…………………………5110-51.c

#include "STC12.h"

#include "5110.h"

#include "ziku.h"

sbit sce = P3^0; //片选

sbit res = P3^5; //复位,0复位

sbit dc = P3^1; //1写数据,0写指令

sbit sdin = P3^2; //数据

sbit sclk = P3^3; //时钟

//sbit io=P3^4;//DHT11数据端

/*--------------------------------------------

LCD_write_byte: 使用SPI接口写数据到LCD

输入参数:dt:写入的数据;

command :写数据/命令选择;

编写日期:20130918

----------------------------------------------*/

void LCD_write_byte(unsigned char dt, unsigned char command) {

unsigned char i;

sce=0;

dc=command;

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

{

if(dt&0x80)

sdin=1;

else

sdin=0;

dt=dt<<1;

sclk=0;

sclk=1;

}

dc=1;

sce=1;

sdin=1;

}

/*---------------------------------------

LCD_init: 3310LCD初始化

编写日期:20080918

----------------------------------------- */

void LCD_init(void)

{

res=0;

delay_1ms();

res=1;

LCD_write_byte(0x21,0);//初始化Lcd,功能设定使用扩充指令LCD_write_byte(0xC0,0);//设定液晶偏置电压

LCD_write_byte(0x06,0);

LCD_write_byte(0x13,0);

LCD_write_byte(0x20,0);//使用基本指令

LCD_write_byte(0x0C,0);//设定显示模式,正常显示

}

/*-------------------------------------------

LCD_set_XY: 设置LCD坐标函数

输入参数:X:0-83 Y:0-5

编写日期:20130918

---------------------------------------------*/

void LCD_set_XY(unsigned char X, unsigned char Y)

{

LCD_write_byte(0x40 | Y, 0);// column

LCD_write_byte(0x80 | X, 0);// row

}

/*------------------------------------------

LCD_clear: LCD清屏函数

编写日期:20130918

--------------------------------------------*/

void LCD_clear(void)

{

unsigned char t;

unsigned char k;

LCD_set_XY(0,0);

for(t=0;t<6;t++)

{

for(k=0;k<84;k++)

{

LCD_write_byte(0x00,1);

}

}

}

/*---------------------------------------------

LCD_write_shu: 显示8(宽)*16(高)点阵列数字字母符号等半角类

输入参数:c:显示的字符;

编写日期:20130918

-----------------------------------------------*/

void LCD_write_shu(unsigned char row, unsigned char page,unsigned char c) //row:列page:页dd:字符

{

unsigned char i;

LCD_set_XY(row*8, page);// 列,页

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

{

LCD_write_byte(shuzi[c*16+i],1);

}

LCD_set_XY(row*8, page+1);// 列,页

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

{

LCD_write_byte(shuzi[c*16+i],1);

}

}

/*---------------------------------------------

LCD_write_hanzi: 显示16(宽)*16(高)点阵列汉字等半角类

输入参数:c:显示的字符;

编写日期:20130918

-----------------------------------------------*/

void LCD_write_hanzi(unsigned char row, unsigned char page,unsigned char c) //row:列page:页dd:字符

{

unsigned char i;

LCD_set_XY(row*8, page);// 列,页

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

{

LCD_write_byte(hanzi[c*32+i],1);

}

LCD_set_XY(row*8, page+1);// 列,页

for(i=16; i<32;i++)

{

LCD_write_byte(hanzi[c*32+i],1);

}

}

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

@f_name: void LCD5110ShowNum(u8 X,u16 Y,u32 num)

@brief: 显示一个数字

@param: x,y:起点坐标num:数值(0~2^32);

@return: None

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

//m^n函数

unsigned int mypow(unsigned char m,unsigned char n)

{

unsigned int result=1;

while(n--)result*=m;

return result;

}

void LCD5110ShowNum(unsigned char X,unsigned char Y,unsigned int num)

{

unsigned int res;

unsigned char t=0,t1=0;

res=num;

if(!num)LCD_write_shu(X,Y,0);//显示0

while(res) //得到数字长度

{

res/=10;

t++;

}

t1=t;

while(t) //显示数字

{

res=mypow(10,t-1);

LCD_write_shu(X+(t1-t),Y,(num/res)%10);//数字字符第一个在'0'之前

t--;

}

}

头文件1……………………………5110.h

#ifndef __5110_H__

#define __5110_H__

void LCD_init(void); //初始化

void LCD_clear(void); //清屏

void LCD_write_shu(unsigned char row, unsigned char page,unsigned char c); //显示英文与数字(x,y)

void LCD_write_hanzi(unsigned char row, unsigned char page,unsigned char c); //显示中文x:0,2,4,6

void LCD5110ShowNum(unsigned char X,unsigned char Y,unsigned int num); //显示数量y:0,2,4

#endif

头文件2……………………………………ZIKU.h

#ifndef __ziku_H__

#define __ziku_H__

unsigned char code shuzi[]={

/*-- 文字: 0 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,

/*-- 文字: 1 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,

/*-- 文字: 2 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,

/*-- 文字: 3 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,

/*-- 文字: 4 --*/

0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,

/*-- 文字: 5 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,

/*-- 文字: 6 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,

/*-- 文字: 7 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,

/*-- 文字: 8 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,

/*-- 文字: 9 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,

/*-- 文字: a --10*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,

/*-- 文字: b --11*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,

/*-- 文字: c --12*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,

/*-- 文字: d --13*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,

/*-- 文字: e --14*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00, /*-- 文字: f --15*/

0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,

/*-- 文字: g --16*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,

/*-- 文字: h --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,

/*-- 文字: i --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,

/*-- 文字: j --19*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,

/*-- 文字: k --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,

/*-- 文字: l --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,

/*-- 文字: m --22*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,

/*-- 文字: n --23*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,

/*-- 文字: o --24*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,

/*-- 文字: p --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00, /*-- 文字: q --*/

0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,

/*-- 文字: r --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,

/*-- 文字: s --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,

/*-- 文字: t --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,

/*-- 文字: u --30*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,

/*-- 文字: v --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,

/*-- 文字: w --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,

/*-- 文字: x --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,

/*-- 文字: y --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,

/*-- 文字: z --35*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,

/*-- 文字: - --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01, /*-- 文字: = --*/

0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,

/*-- 文字: \ --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,

/*-- 文字: --39*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*-- 文字: [ --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,

/*-- 文字: ] --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,

/*-- 文字: ; --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,

/*-- 文字: ' --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*-- 文字: , --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,

/*-- 文字: . --45*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,

/*-- 文字: / --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,

};

unsigned char code hanzi[]=

{

/*-- 文字: 温--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,

0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,

/*-- 文字: 度--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,

0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,

/*-- 文字: 湿--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x10,0x60,0x02,0x8C,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,

0x04,0x04,0x7E,0x01,0x44,0x48,0x50,0x7F,0x40,0x40,0x7F,0x50,0x48,0x44,0x40,0x00,

/*-- 文字: 度--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,

0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,

};

void delay_1ms(void)//1ms延时函数@4Mhz

{

unsigned char i, j;

i = 4;

j = 224;

do

{

while (--j);

} while (--i);

}

#endif

头文件3………………………………………stc12.h

//--------------------------------------------------------------------------------

//新一代1T 8051系列单片机内核特殊功能寄存器C51 Core SFRs

// 7 6 5 4 3 2 1 0 Reset Value

sfr ACC = 0xE0; //Accumulator 0000,0000

sfr B = 0xF0; //B Register 0000,0000

sfr PSW = 0xD0; //Program Status Word CY AC F0 RS1 RS0 OV F1 P 0000,0000

//-----------------------------------

sbit CY = PSW^7;

sbit AC = PSW^6;

sbit F0 = PSW^5;

sbit RS1 = PSW^4;

sbit RS0 = PSW^3;

sbit OV = PSW^2;

sbit P = PSW^0;

//-----------------------------------

sfr SP = 0x81; //Stack Pointer 0000,0111

sfr DPL = 0x82; //Data Pointer Low Byte 0000,0000

sfr DPH = 0x83; //Data Pointer High Byte 0000,0000

//--------------------------------------------------------------------------------

//新一代1T 8051系列单片机系统管理特殊功能寄存器

// 7 6 5 4 3 2 1 0 Reset Value

sfr PCON = 0x87; //Power Control SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 0001,0000

// 7 6 5 4 3 2 1 0 Reset Value

sfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS 0000,0000

//-----------------------------------

sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ - DPS 0000,0000

/*

PCA_P4:

0, 缺省PCA 在P1 口

1,PCA/PWM 从P1 口切换到P4 口: ECI 从P1.2 切换到P4.1 口,

PCA0/PWM0 从P1.3 切换到P4.2 口

PCA1/PWM1 从P1.4 切换到P4.3 口

SPI_P4:

0, 缺省SPI 在P1 口

1,SPI 从P1 口切换到P4 口: SPICLK 从P1.7 切换到P4.3 口

MISO 从P1.6 切换到P4.2 口

MOSI 从P1.5 切换到P4.1 口

SS 从P1.4 切换到P4.0 口

S2_P4:

0, 缺省UART2 在P1 口

1,UART2 从P1 口切换到P4 口: TxD2 从P1.3 切换到P4.3 口

RxD2 从P1.2 切换到P4.2 口

GF2: 通用标志位

ADRJ:

0, 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄

存器

1,10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器

DPS: 0, 使用缺省数据指针DPTR0

1,使用另一个数据指针DPTR1

*/

//-----------------------------------

sfr WAKE_CLKO = 0x8F; //附加的SFR WAK1_CLKO

/*

7 6 5 4 3 2 1 0 Reset Value

PCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_W AKE _ T1CLKO T0CLKO 0000,0000B

b7 - PCAW AKEUP : PCA 中断可唤醒powerdown。

b6 - RXD_PIN_IE : 当P3.0(RXD) 下降沿置位RI 时可唤醒powerdown(必须打开相应中断)。

b5 - T1_PIN_IE : 当T1 脚下降沿置位T1 中断标志时可唤醒powerdown(必须打开相应中断)。

b4 - T0_PIN_IE : 当T0 脚下降沿置位T0 中断标志时可唤醒powerdown(必须打开相应中断)。

b3 - LVD_W AKE : 当CMPIN 脚低电平置位LVD 中断标志时可唤醒powerdown(必须打开相应中断)。

b2 -

b1 - T1CLKO : 允许T1CKO(P3.5) 脚输出T1 溢出脉冲,Fck1 = 1/2 T1 溢出率

b0 - T0CLKO : 允许T0CKO(P3.4) 脚输出T0 溢出脉冲,Fck0 = 1/2 T1 溢出率

*/

//-----------------------------------

sfr CLK_DIV = 0x97; //Clock Divder - - - - - CLKS2 CLKS1 CLKS0 xxxx,x000

//-----------------------------------

sfr BUS_SPEED = 0xA1; //Stretch register - - ALES1 ALES0 - RWS2 RWS1 RWS0 xx10,x011

/*

ALES1 and ALES0:

00 : The P0 address setup time and hold time to ALE negative edge is one clock cycle

01 : The P0 address setup time and hold time to ALE negative edge is two clock cycles.

10 : The P0 address setup time and hold time to ALE negative edge is three clock cycles. (default)

11 : The P0 address setup time and hold time to ALE negative edge is four clock cycles.

RWS2,RWS1,RWS0:

000 : The MOVX read/write pulse is 1 clock cycle.

001 : The MOVX read/write pulse is 2 clock cycles.

010 : The MOVX read/write pulse is 3 clock cycles.

011 : The MOVX read/write pulse is 4 clock cycles. (default)

100 : The MOVX read/write pulse is 5 clock cycles.

101 : The MOVX read/write pulse is 6 clock cycles.

110 : The MOVX read/write pulse is 7 clock cycles.

111 : The MOVX read/write pulse is 8 clock cycles.

*/

//--------------------------------------------------------------------------------

//新一代1T 8051系列单片机中断特殊功能寄存器

//有的中断控制、中断标志位散布在其它特殊功能寄存器中,这些位在位地址中定义

//其中有的位无位寻址能力,请参阅新一代1T 8051系列单片机中文指南

// 7 6 5 4 3 2 1 0 Reset Value

sfr IE = 0xA8; //中断控制寄存器EA ELVD EADC ES ET1 EX1 ET0 EX0 0x00,0000

//-----------------------

sbit EA = IE^7;

sbit ELVD = IE^6; //低压监测中断允许位

sbit EADC = IE^5; //ADC 中断允许位

sbit ES = IE^4;

sbit ET1 = IE^3;

sbit EX1 = IE^2;

sbit ET0 = IE^1;

sbit EX0 = IE^0;

//-----------------------

sfr IE2 = 0xAF; //Auxiliary Interrupt - - - - - - ESPI ES2 0000,0000B

//-----------------------

// 7 6 5 4 3 2 1 0 Reset Value

sfr IP = 0xB8; //中断优先级低位PPCA PLVD PADC PS PT1 PX1 PT0 PX0 0000,0000

//--------

sbit PPCA = IP^7; //PCA 模块中断优先级

sbit PLVD = IP^6; //低压监测中断优先级

sbit PADC = IP^5; //ADC 中断优先级

sbit PS = IP^4;

sbit PT1 = IP^3;

sbit PX1 = IP^2;

sbit PT0 = IP^1;

sbit PX0 = IP^0;

//-----------------------

// 7 6 5 4 3 2 1 0 Reset Value

sfr IPH = 0xB7; //中断优先级高位PPCAH PLVDH PADCH PSH PT1H PX1H PT0H PX0H 0000,0000

sfr IP2 = 0xB5; // - - - - - - PSPI PS2 xxxx,xx00

sfr IPH2 = 0xB6; // - - - - - - PSPIH PS2H xxxx,xx00

//-----------------------

//新一代1T 8051系列单片机I/O 口特殊功能寄存器

// 7 6 5 4 3 2 1 0 Reset Value

sfr P0 = 0x80; //8 bitPort0 P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 1111,1111

sfr P0M0 = 0x94; // 0000,0000

sfr P0M1 = 0x93; // 0000,0000

sfr P1 = 0x90; //8 bitPort1 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 1111,1111

sfr P1M0 = 0x92; // 0000,0000

sfr P1M1 = 0x91; // 0000,0000

sfr P1ASF = 0x9D; //P1 analog special function

sfr P2 = 0xA0; //8 bitPort2 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 1111,1111

sfr P2M0 = 0x96; // 0000,0000

sfr P2M1 = 0x95; // 0000,0000

sfr P3 = 0xB0; //8 bitPort3 P3.7 P3.6 P3.5 P3.4 P3.3 P3.2 P3.1 P3.0 1111,1111

sfr P3M0 = 0xB2; // 0000,0000

sfr P3M1 = 0xB1; // 0000,0000

sfr P4 = 0xC0; //8 bitPort4 P4.7 P4.6 P4.5 P4.4 P4.3 P4.2 P4.1 P4.0 1111,1111

sfr P4M0 = 0xB4; // 0000,0000

sfr P4M1 = 0xB3; // 0000,0000

// 7 6 5 4 3 2 1 0 Reset Value

sfr P4SW = 0xBB; //Port-4 switch - LVD_P4.6 ALE_P4.5 NA_P4.4 - -

- - x000,xxxx

sfr P5 = 0xC8; //8 bitPort5 - - - - P5.3 P5.2 P5.1 P5.0 xxxx,1111

sfr P5M0 = 0xCA; // 0000,0000

sfr P5M1 = 0xC9; // 0000,0000

//--------------------------------------------------------------------------------

//新一代1T 8051系列单片机定时器特殊功能寄存器

// 7 6 5 4 3 2 1 0 Reset Value

sfr TCON = 0x88; //T0/T1 Control TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 0000,0000

//-----------------------------------

sbit TF1 = TCON^7;

sbit TR1 = TCON^6;

sbit TF0 = TCON^5;

sbit TR0 = TCON^4;

sbit IE1 = TCON^3;

sbit IT1 = TCON^2;

sbit IE0 = TCON^1;

sbit IT0 = TCON^0;

//-----------------------------------

sfr TMOD = 0x89; //T0/T1 Modes GATE1 C/T1 M1_1 M1_0 GA TE0 C/T0 M0_1 M0_0 0000,0000

sfr TL0 = 0x8A; //T0 Low Byte 0000,0000

sfr TH0 = 0x8C; //T0 High Byte 0000,0000

sfr TL1 = 0x8B; //T1 Low Byte 0000,0000

sfr TH1 = 0x8D; //T1 High Byte 0000,0000

//--------------------------------------------------------------------------------

//新一代1T 8051系列单片机串行口特殊功能寄存器

// 7 6 5 4 3 2 1 0 Reset Value

sfr SCON = 0x98; //Serial Control SM0/FE SM1 SM2 REN TB8 RB8 TI RI 0000,0000

//-----------------------------------

sbit SM0 = SCON^7; //SM0/FE

sbit SM1 = SCON^6;

sbit SM2 = SCON^5;

sbit REN = SCON^4;

sbit TB8 = SCON^3;

sbit RB8 = SCON^2;

sbit TI = SCON^1;

sbit RI = SCON^0;

//-----------------------------------

sfr SBUF = 0x99; //Serial Data Buffer xxxx,xxxx

sfr SADEN = 0xB9; //Slave Address Mask 0000,0000

sfr SADDR = 0xA9; //Slave Address 0000,0000

//-----------------------------------

// 7 6 5 4 3 2 1 0 Reset Value

sfr S2CON = 0x9A; //S2 Control S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 00000000B

sfr S2BUF = 0x9B; //S2 Serial Buffer xxxx,xxxx

sfr BRT = 0x9C; //S2 Baud-Rate Timer 0000,0000

//--------------------------------------------------------------------------------

//新一代1T 8051系列单片机看门狗定时器特殊功能寄存器

sfr WDT_CONTR = 0xC1; //Watch-Dog-Timer Control register

// 7 6 5 4 3 2 1 0 Reset Value

// WDT_FLAG - EN_WDT CLR_WDT IDLE_WDT PS2 PS1 PS0 xx00,0000

//-----------------------

//--------------------------------------------------------------------------------

//新一代1T 8051系列单片机PCA/PWM 特殊功能寄存器

// 7 6 5 4 3 2 1 0 Reset Value

sfr CCON = 0xD8; //PCA 控制寄存器。CF CR - - - - CCF1 CCF0 00xx,xx00

//-----------------------

sbit CF = CCON^7; //PCA计数器溢出标志,由硬件或软件置位,必须由软件清0。

sbit CR = CCON^6; //1:允许PCA 计数器计数, 必须由软件清0。

//-

//-

sbit CCF1 = CCON^1; //PCA 模块1 中断标志, 由硬件置位, 必须由软件清0。

sbit CCF0 = CCON^0; //PCA 模块0 中断标志, 由硬件置位, 必须由软件清0。

//-----------------------

sfr CMOD = 0xD9; //PCA 工作模式寄存器。CIDL - - - CPS2 CPS1 CPS0 ECF 0xxx,x000

/*

CIDL: idle 状态时PCA 计数器是否继续计数, 0: 继续计数, 1: 停止计数。

CPS2: PCA 计数器脉冲源选择位2。

CPS1: PCA 计数器脉冲源选择位1。

CPS0: PCA 计数器脉冲源选择位0。

CPS2 CPS1 CPS0

0 0 0 系统时钟频率fosc/12。

0 0 1 系统时钟频率fosc/2。

0 1 0 Timer0 溢出。

0 1 1 由ECI/P3.4 脚输入的外部时钟,最大fosc/2。

1 0 0 系统时钟频率,Fosc/1

1 0 1 系统时钟频率/4,Fosc/4

1 1 0 系统时钟频率/6,Fosc/6

1 1 1 系统时钟频率/8,Fosc/8

ECF: PCA计数器溢出中断允许位, 1--允许CF(CCON.7) 产生中断。

*/

//-----------------------

sfr CL = 0xE9; //PCA 计数器低位0000,0000

sfr CH = 0xF9; //PCA 计数器高位0000,0000

//-----------------------

// 7 6 5 4 3 2 1 0 Reset Value

sfr CCAPM0 = 0xDA; //PCA 模块0 PWM 寄存器- ECOM0 CAPP0 CAPN0 MAT0 TOG0 PWM0 ECCF0 x000,0000

sfr CCAPM1 = 0xDB; //PCA 模块1 PWM 寄存器- ECOM1 CAPP1 CAPN1 MAT1 TOG1 PWM1 ECCF1 x000,0000

//ECOMn = 1:允许比较功能。

//CAPPn = 1:允许上升沿触发捕捉功能。

//CAPNn = 1:允许下降沿触发捕捉功能。

//MATn = 1:当匹配情况发生时, 允许CCON 中的CCFn 置位。

//TOGn = 1:当匹配情况发生时, CEXn 将翻转。

//PWMn = 1:将CEXn 设置为PWM 输出。

//ECCFn = 1:允许CCON 中的CCFn 触发中断。

//ECOMn CAPPn CAPNn MA Tn TOGn PWMn ECCFn

// 0 0 0 0 0 0 0 0x00 未启用任何功能。

// x 1 0 0 0 0 x 0x21 16位CEXn上升沿触发捕捉功

闹钟程序

#include #include #include #include #include #include #include #include //定义头文件 #define N 3000 #define changecolor 1 #define resumecolor 2 #define quit 3 int winheight=700,winwidth=500; int cx=400,cy=200,radius=0; int hradius=150,mradius=150,sradius=300; float sangle,mangle,hangle; char timebuffer[100]; int ww=0,hh=0; int tt=1,ll=0; int distances=0; char a[]="定义函数"; int second,miniter,hour; int second1,miniter1,hour1; float br=0.0,bg=.0,bb=255.0; float sr=0.0,sg=255.0,sb=0.0; //定义函数 bool bLight=false; void drawcrpot(); void drawline(); void hand(int cx,int cy,int r,float thleta); void Bresenham_Circle(int x0,int y0,double radius); void CirPot(int x0,int y0,int x,int y); void drawother(); void createGLUTMenus(); void processMenuEvents(int option); void Myinit(void) { glClearColor(1.0,1.0,1.0,1.0); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glLineWidth(10.0); glPointSize(2); _ strtime(timebuffer); hour1=50; miniter1=60; second1=70; tt=2; }

单片机数字时钟带闹钟

计算机硬件综合课程 设计报告 课目: 学院: 班级: 姓名: 指导教师: 目录

1 设计要求 功能需求 设计要求 2 硬件设计及描述 总体描述 系统总体框图 Proteus仿真电路图3 软件设计流程及描述 程序流程图 函数模块及功能 4 心得体会 附:源程序

1设计要求 1.1功能需求 (1)实现数字时钟准确实时的计时与显示功能; (2)实现闹钟功能,即系统时间到达闹钟时间时闹铃响; (3)实现时间和闹钟时间的调时功能; (4)刚启动系统的时候在数码管上滚动显示数字串(学号)。 1.2设计要求 (1)应用MCS-51单片机设计实现数字时钟电路; (2)使用定时器/计数器中断实现计时; (3)选用8个数码管显示时间; (4)使用3个按钮实现调时间和闹钟时间的功能。按钮1:更换模式(模式0:正常显示时间;模式1:调当前时间的小时;模式 2;调当前时间的分钟;模式3:调闹钟时间的小时;模式4: 调闹钟时间的分钟);按钮2:在非模式0下给需要调节的时 间数加一,但不溢出;按钮3:在非模式0下给需要调节的时 间数减一,但不小于零; (5)在非0模式下,给正在调节的时间闪烁提示; (6)使用扬声器实现闹钟功能; (7)采用C语言编写程序并调试。

2 硬件设计及描述 2.1总体描述 (1)单片机采用AT89C51型; (2)时间显示电路:采用8个共阴极数码管,P1口驱动显示数字,P2口作为扫描信号; (3)时间设置电路:、、分别连接3个按键,实现调模式,时间加和时间减; (4)闹钟:口接扬声器。 2.2系统总体框图 2.3Proteus仿真电路图

单片机大全程序电子闹钟

电子闹钟课程设计 摘要:本课程设计主要是通过单片机系统,综合运用定时器、中断、数码显示等知识设计一个可定时的电子钟。它包括系统总体方案及硬件设计,软件设计,Proteus软件仿真等部分。 硬件设计的主要任务是根据总体设计要求,以及在所选机型的基础上,确定系统扩展所要用的存储器,I/O电路及有关外围电路等然后设计出系统的电路原理图。 合理的软件结构是设计出一个性能优良的单片机应用性系统软件的基础,因此必须充 1 2. 3. 而 本系统采用单片机AT89C51作为本设计的核心元件,利用7段共阴LED作为显示器件。接入共阴LED显示器,可显示时,分钟,秒,单片机外围接有定时报警系统,定时时间到,扬声器发出报警声,提示预先设定时间电器的起停时间到,从而控制电器的起停。

电路由下列部分组成:时钟电路、复位电路、控制电路、LED显示,报警电路, 芯片选用AT89C51 单片机。 系统框图: 四.硬件设计 1.单片机AT89C51 AT89C51是一个低电压,高性能CMOS型 8位单片机,片内含4KB的可反复擦写的Flash 只读程序存储器(ROM)和128 B的随机存取数据存储器(RAM),器件采用ATMEL公司的高 8 Array位器和 内置功能 实 的I/O 几个特殊管脚: XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平。 2.时钟电路 单片机的时钟产生方法有两种:内部时钟方式和外部时钟方式。本系统中AT89C51单片机采用内部时钟方式。最常用的内部时钟方式是采用外接晶体和电容组成的并联谐振回路。振荡晶体可在1.2MHz~12MHz之间。电容值无严格要求,但电容取值对振荡频率输出的稳 定性、大小和振荡电路起振速度有少许影响,一般可在20pF~100pF之间取值。时钟电路

单片机万年历 时钟 闹钟 温度程序..

这个程序是在1602液晶上显示世界时钟,并且能设定闹钟,链接闹钟的引脚为p1^4,w1控制位选,w2控制加一,w4控制减一 w6为闹钟模式和时钟模式的切换键,按一下w6可设定那种时间,w2单独使用时为开关闹钟,中间屏蔽了一段18b20温度显示程序,把屏蔽去除后也能在液晶上显示温度 #include #define uchar unsigned char #define uint unsigned int sbit DQ=P2^3; sbit L=P1^4; sbit DZ=P3^5;//这是用于控制数码管关闭,这个数码管和液晶同时亮所需电流大,单片机难驱动 sbit rs=P2^5; sbit rw=P2^6; sbit lcden=P2^7; sbit w1=P3^2; sbit w2=P3^3; sbit w4=P3^4; sbit w6=P3^7; sbit jd=P3^6; uchar temp,f,k; uchar count,s1num; uchar miao,shi,fen,miao1,shi1,fen1,nian=14,nian2=20,yue=12,ri=12,ri1=12,r=0,k,num; uchar code table[]=" 2014-12-12 FRI "; uchar code table1[]=" 00:00:00"; uchar code table2[]="MONTUEWEDTHUFIRSATSUN"; //************************************************ //延时函数,在12MHz的晶振频率下延时1ms //************************************************ void delay(uint t) { uchar x,y; for(x=t;x>0;x--) for(y=110;y>0;y--); } //写数据 //************************************************ void write_com(uchar com) { rs=0; lcden=0; rw=0; P0=com; delay(5); lcden=1;

电子闹钟程序

AN_JIAN1 BIT P3.0 AN_JIAN2 BIT P3.1 AN_JIAN4 BIT P3.3 SECOND EQU 30H AN_JIAN3 BIT P3.2 MINUTE EQU 31H HOUR EQU 32H TIMEJ EQU 34H M_NAO EQU 35H H_NAO EQU 36H S_NAO EQU 37H SECOND_MIAO EQU 38H MINUTE_MIAO EQU 39H B_NAO EQU 40H SECOND_DAO EQU 41H MINUTE_DAO EQU 42H HOUR_DAO EQU 43H SECOND_1 EQU 44H HAO_MIAO EQU 45H YEAR EQU 46H MONTH EQU 47H DA Y EQU 48H XIANSHI1 EQU 49H XIANSHI2 EQU 50H XIANSHI3 EQU 51H XING_QI EQU 52H NUM_YIN EQU 53H ;****************************** ******************************* ;代码段 ORG 00H JMP ST ART ORG 0BH ;中断T0入口 LJMP INT_T0 ORG 001BH ;中断T1入口 LJMP INT_T1 ORG 100H ST ART: MOV DPTR,#T ABLE MOV NUM_YIN,#0 MOV XING_QI,#01 MOV YEAR,#10 MOV MONTH,#01 MOV DA Y, #03 MOV HAO_MIAO,#0 MOV SECOND_MIAO,#0 MOV MINUTE_MIAO,#0 MOV B_NAO,#0 MOV H_NAO,#07 MOV M_NAO,#0 MOV S_NAO,#0 MOV HOUR,#0 MOV MINUTE,#0 MOV SECOND,#0 MOV SECOND_1,#0 MOV TIMEJ,#0 MOV TMOD,#11H MOV TH0,#3CH MOV TL0,#0B0H SETB EA SETB ET1 SETB ET0 SETB TR0 ;****************************** ********************** ;主循环:显示当前时间,并检测按键 状态,按1进入循环1,按2进入循 环2,按3进入循环3,按4进入循 环4 MAIN: MOV XIANSHI1,SE COND MOV XIANSHI2,MINUTE MOV XIANSHI3,HOUR LCALL DISPLA Y JNB AN_JIAN1,KMAIN1_T JNB AN_JIAN2,KMAIN2_T JNB AN_JIAN3,KMAIN3_T JNB AN_JIAN4,KMAIN4_T MOV A,B_NAO CJNE A,#0,P_NAO JMP MAIN ;****************************** ************************ ;检测是否达到所设置的闹钟时刻, 若达到则调用闹铃程序 P_NAO: MOV A,HOUR CJNE A,H_NAO,MAIN MOV A,MINUTE CJNE A,M_NAO,MAIN MOV 56H,#HIGH T ABLE1 MOV 57H,#LOW T ABLE1 MOV NUM_YIN,#0FH LCALL ST ART1 CLR TR1 SETB TR0 LJMP ST ART_L ;****************************** ************************ ;跳转服务 KMAIN1_T:LJM P KMAIN1 KMAIN2_T:LJM P KMAIN2 KMAIN3_T:LJM P KMAIN3 KMAIN4_T:LJM P KMAIN4 ;****************************** ************************* ;主循环中各个按键功能的具体实现,

C++闹钟程序(API)

#include #include #include "Clock.h" #include "Resource.h" #define SQUARESIZE 20 #define ID_TIMER_CLOCK 1 CMyApp myApp; ///////////////////////////////////////////////////////////////////////// // CMyApp member functions BOOL CMyApp::InitInstance () { SetRegistryKey (_T ("Programming Windows with MFC")); m_pMainWnd = new CMainWindow; if (!((CMainWindow*) m_pMainWnd)->RestoreWindowState ()) m_pMainWnd->ShowWindow (m_nCmdShow); m_pMainWnd->UpdateWindow (); return TRUE; } ///////////////////////////////////////////////////////////////////////// // CMainWindow message map and member functions BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd) ON_WM_CREATE () ON_WM_PAINT () ON_WM_TIMER () ON_WM_GETMINMAXINFO () ON_WM_NCHITTEST () ON_WM_SYSCOMMAND () ON_WM_CONTEXTMENU () ON_WM_ENDSESSION () ON_WM_CLOSE () END_MESSAGE_MAP () CMainWindow::CMainWindow () { m_bAutoMenuEnable = FALSE; CTime time = CTime::GetCurrentTime (); m_nPrevSecond = time.GetSecond ();

51单片机编写的闹钟程序

#include #define uchar unsigned char #define uint unsigned int sbit w1=P0^0; sbit w2=P0^1; sbit w3=P0^2; sbit w4=P0^3; sbit k1=P0^4; //定义按键 sbit k2=P0^5; sbit k3=P0^6; sbit k4=P0^7; sbit fm=P3^4; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f}; //0--9十六进制数共阴 void timetune(); //时间校正函数 void delayms(uint); //延迟函数 void keyscan(); //闹钟设置函数 void keyscan1(); //闹钟检测函数 void display(uint anum,uint anum1,uint anum2,uint anum3); //显示函数 uint num0,num,num1,num2,num3,anum,anum1,anum2,anum3,temp,temp0,temp1,temp2,temp3,te mp4,s,s1,s2,s3,s4; void main() { TMOD=0x01; //设置定时器0为工作方式1(0000 0001)TH0=(65536-45872)/256; //装初值50毫秒中断一次 TL0=(65536-45872)/256; EA=1; //开总中断 ET0=1; //开定时器0终中断 TR0=1; // 开定时器 while(1) //中断后进入死循环时间永不停止计时 { timetune(); // 调用时间设置函数 keyscan(); //调用闹钟设置函数 if(num0==20) { num0=0; num++; if(num==10) { num1++; num=0; if(num1==6) {

单片机汇编程序电子闹钟完整版

单片机汇编程序电子闹 钟 Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】

电子闹钟课程设计 摘要:本课程设计主要是通过单片机系统,综合运用定时器、中断、数码显示等知识设计一个可定时的电子钟。它包括系统总体方案及硬件设计,软件设计,Proteus软件仿真等部分。 硬件设计的主要任务是根据总体设计要求,以及在所选机型的基础上,确定系统扩展所要用的存储器,I/O电路及有关外围电路等然后设计出系统的电路原理图。 合理的软件结构是设计出一个性能优良的单片机应用性系统软件的基础,因此必须充分重视。编写完程序后在用Proteus软件仿真检查设计是否合理。一.课程设计的概况 通过对51单片机的扩展,接键盘,显示器等相应的外围器件。在LED显示器中分成静态显示和动态显示两类,在本设计中主要用了它的动态显示功能,动态显示利用了人视觉的短暂停留,在数据的传输中是一个一个传输的,且先传输低位。键盘是由若干个按键组成的开关矩阵,是一种廉价的输入设备。键盘通常包括有数字键,字母键以及一些功能键。操作人员可以通过对键盘向计算机输入数据,地址,指令或其他的控制命令,实现简单的人机对话。这里采用非编码式键盘。通过51单片机的P1口扩展出独立连接式键盘。外围扩展复位,时钟电路,利用软件源程序代码实现相应的功能。 二.课程设计实现的功能: 1.能显示时时-分分-秒秒。 2.能够设定定时时间,修改定时时间。 3.定时时间到能发出警报声或者启动继电器,从而控制电器的起停。 三.设计方案 使用是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。 本系统采用单片机AT89C51作为本设计的核心元件,利用7段共阴LED作为显示器件。接入共阴LED显示器,可显示时,分钟,秒,单片机外围接有定时报警系统,定时时间到,扬声器发出报警声,提示预先设定时间电器的起停时间到,从而控制电器的起停。

51单片机24小时闹钟时钟可调简单程序

#include unsigned char seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char con[6]={0x1,0x2,0x4,0x8,0x10,0x20}; unsigned char mm=0; unsigned char ss=0; unsigned char hh=0; unsigned char count=100; unsigned char TH=01,TM=00,m; sbit S1=P3^3; sbit S2=P3^4; sbit S3=P3^5; sbit S4=P3^6; sbit S5=P3^7; sbit S6=P3^2; sbit bell=P3^0; main() { TMOD=1; TH0=-10000>>8;TL0=-10000; //10毫秒间隔 EA=1;ET0=1;TR0=1; while(1); } void isr_time0() interrupt 1 //24小时 {

unsigned int i=0,j; unsigned char time[6]; TH0=-10000>>8;TL0=-10000; count--; if(count==0) { count=100; ss++; if(ss==60) { ss=0;mm++; if(mm==60) { mm=0;hh++; if(hh==24) hh=0; } } if(S5==0) {TH++;} //闹钟调时 if(S6==0) {TM++;} //闹钟调分 if(hh==TH) { unsigned int a,b,y; if(mm>=01){m=0;} if(mm==TM&&ss<10) { if(m<10) { do{ m++;ss++; //ss确保闹钟时间继续 for(a=0;a<1250;a++) {bell=!bell;for(b=0;b<15;b++);} //取反 for(y=0;y<1250;y++) {bell=!bell;for(b=0;b<33;b++);} for(a=0;a<1250;a++) {bell=!bell;for(b=0;b<15;b++);} for(a=0;a<1250;a++) {bell=!bell;for(b=0;b<33;b++);} } while(m<10); } }

单片机闹钟程序代码

#include"reg52.h" #include typedef unsigned char u8; typedef unsigned int u16; u8 code smg[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}; u8 code wei[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; #define led P2 sbit k4=P3^3; sbit k3=P3^2; sbit k2=P3^1; sbit k1=P3^0; u16 a; u16 naozhong=1; u16 weiwei; u16 mmm=10; u16 xianglingshijian=100; sbit beep=P1^5; u16 d1=6,d2=5,d3=9,d4=5,d5=1,d6=1; u16 c1=1,c2,c3,c4,c5,c6; u16 n1=1,n2=1,n3=1,n4=1,n5=1,n6=1; void delay(u16 b)

{ while(b--); } void jinwei() { if(d1==10) { d1=0; d2++; if(d2==6) { d2=0; d3++; if(d3==10) { d3=0; d4++; if(d4==6) { d4=0; d5++; if(d5==2&&d6==1)

{ d5=0; d6=0; } if(d5==10) { d5=0; d6++; } } } } } } void bi() { while(mmm) { beep=~beep; delay(100); mmm--; }

单片机汇编程序电子闹钟

电子闹钟课程设计 摘要:本课程设计主要就是通过单片机系统,综合运用定时器、中断、数码显示等知识设计一个可定时得电子钟.它包括系统总体方案及硬件设计,软件设计,Proteus软件仿真等部分。 硬件设计得主要任务就是根据总体设计要求,以及在所选机型得基础上,确定系统扩展所要用得存储器,I/O电路及有关外围电路等然后设计出系统得电路原理图。 合理得软件结构就是设计出一个性能优良得单片机应用性系统软件得基础,因此必须充分重视.编写完程序后在用Proteus软件仿真检查设计就是否合理. 一。课程设计得概况 通过对51单片机得扩展,接键盘,显示器等相应得外围器件。在LED显 示器中分成静态显示与动态显示两类,在本设计中主要用了它得动态显示功能,动态显示利用了人视觉得短暂停留,在数据得传输中就是一个一个传输得,且先传输低位。键盘就是由若干个按键组成得开关矩阵,就是一种廉价得输入设备。键盘通常包括有数字键,字母键以及一些功能键。操作人员可以通过对键盘向计算机输入数据,地址,指令或其她得控制命令,实现简单得人机对话。这里采用非编码式键盘。通过51单片机得P1口扩展出独立连接式键盘。外围扩展复位,时钟电路,利用软件源程序代码实现相应得功能。 二.课程设计实现得功能: 1。能显示时时-分分-秒秒。 2、能够设定定时时间,修改定时时间。 3、定时时间到能发出警报声或者启动继电器,从而控制电器得起停. 三。设计方案? 使用就是单片机作为核心得控制元件,使得电路得可靠性比较高,功能也比较强大,而且可以随时得更新系统,进行不同状态得组合. 本系统采用单片机AT89C51作为本设计得核心元件,利用7段共阴LED作为显示器件。接入共阴LED显示器,可显示时,分钟,秒,单片机外围接有定时报警系统,定时时间到,扬声器发出报警声,提示预先设定时间电器得起停时间到,从而控制电器得起停。 电路由下列部分组成:时钟电路、复位电路、控制电路、LED显示,

单片机闹钟程序设计

单片机闹钟程序设计 这个是在之前的电子时钟上功能的扩展,主要加入闹钟模块。即到达预定时间响铃一分钟,一分钟后自动停止,也可以按下已设定的键实现手动停止。 数码管方面的学习就到此为此吧,下一步是对液晶显示的学习。 单片机闹钟程序设计如下: #i nclude;#define uchar unsigned charunsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数码管数字编码uchar i,j,k,second,tcount,minute,hour,tminute,thour,rin g;sbit beep=P2^6;sbit S2=P3^4;//---------------------------------------------------延时子程序,大约延时 n MSdelay(uchar n){for(j=n;j>;0;j--) for(k=125;k>;0;k--);}//---------------------------------------------------中断子程序void timer0() interrupt 1 using 0{TH0=(65536-50000)/256; //中断设置初始化

TL0=(65536-50000)%256; tcount++; if(tcount==20) //满1秒{tcount=0;second++;beep=0; //秒数加1 if(second==60) //满1分 {second=0;minute++; //分数加1,秒数归零 if(minute==60) //满1小时 { minute=0;hour++; //小时数加1,分数归零 if(hour==24) {hour=0;} } } }}void timer1() interrupt 3 using 1{TH1=0x3c; //中断设置初始化 TL1=0xb0;

单片机电子钟表、闹钟程序

51单片机电子日历程序代码: /****************************************************************************/ /* 电子日历,有时间显示、闹铃、日期、秒表及键盘设置功能*/ /* 功能键A: 设置位数字+1 闹钟模式下为闹钟开关秒表模式下为记时开关*/ /* 功能键B: 设置位数字-1 闹钟模式下为闹钟开关*/ /* 功能键C:正常模式及设置模式及设置位选择秒表模式下为清零键*/ /* 功能键D:在四种工作模式下切换设置闹钟开关*/ /* */ /* */ /****************************************************************************/ #include #include /*******这里设置程序初始化时显示的时钟时间*********/ #define SET_HOUR 12 /*设置初始化小时*/ #define SET_MINUTE 00 /*设置初始化分钟*/ #define SET_SECOND 00 /*设置初始化秒数*/ /*************************系统地址****************************/ #define BASE_PORT 0x8000 /*选通基地址*/ #define KEY_LINE BASE_PORT+1 /*键盘行线地址*/ #define KEY_COLUMN BASE_PORT+2 /*键盘列线地址*/ #define LED_SEG BASE_PORT+4 /*数码管段选地址*/ #define LED_BIT BASE_PORT+2 /*数码管位选地址*/ #define LED_ON(x) XBYTE[LED_BIT]=(0x01<#define LED_OFF XBYTE[LED_SEG]=0x00 /*LED显示空*/ /**************在设置模式下对秒分时的宏定义*****************/ #define SECOND 0 /*对应数码管右边两位*/ #define MINUTE 1 /*对应数码管中间两位*/ #define HOUR 2 /*对应数码管左边两位*/ /********************定义四种工作模式***********************/ #define CLOCK clockstr /*时钟模式*/ #define ALART alartstr /*闹钟模式*/ #define DATE datestr /*日期模式*/ #define TIMER timerstr /*秒表模式*/ /****************以下是所有子函数的声明*********************/ void sys_init(void); /*系统的初始化程序*/ void display(void); /*动态刷新一次数码管子程序*/ void clockplus(void); /*时间加1S的子程序*/ void update_clockstr(void); /*更新时间显示编码数组*/ void update_alartstr(void); /*更新闹钟时间的显示编码数组*/

C单片机实现电子闹钟

C单片机实现电子闹钟 The latest revision on November 22, 2020

课程名称:单片机原理与接口技术实践设计课题:基于MCS 51单片机实现电 子闹钟功能的设计 学院:电子与信息工程学院 专业:通信工程 小组成员: 电子闹钟在科学技术高度发展的今天,千家万户都少不了它,所以很多家庭个人都需要有一个电子闹钟,为人们提供报时方便,但普通电子闹钟不够方便实

用。本文给出了一种基于MCS51单片机实现电子闹钟功能的设计方法,从而给人们带来更为方便的工作与生活。 一.电子闹钟简介 我们设计的电子闹钟是以MCS 51单片机中的计时器作为时钟,用8位数码管显示当前时间,并且可以设置闹钟时间,并在设置的时间点发出闹铃。 简易闹钟具有以下功能: 1.时钟能准确地走时,并可以通过数码管进行显示 2.复位后可以进行当前时间的设置 3.可以随意设置闹钟时间,闹钟会在设置时间响铃 整个系统的任务要求: 1)输入数字按键的功能。 保证数字的输入。 2)复位电路的功能。 所有时间回到初始化状态,用于启动设定时间参数(调时或设定闹钟时间); 3)显示电路的功能。 当输入数字时显示24小时时间功能。 4)闹铃功能 设置闹铃的时间后.能按设置好的时间准时闹铃。 二.系统方案的设计要求 根据以上各模块并结合显示屏的功能及元器件材料的情况,决定采用AT89C51为内核显示设计方案。 先进行系统的整体规划确定整个系统的功能,然后按照每个功能的具体要求,进行各个模块的实物设计并逐个调试,待全部通过后,进行整个系统的联调,最终实现一个完整的系统。 整个系统的设计步骤如下: 在单片机最小系统的基础上,完成按键电路和复位电路的设计。 完成显示电路、数字按键、单片机时钟电路。 Ⅰ硬件设计

java闹钟程序设计

《JA V A程序设计》课程设计报告 班级软件1301班 姓名徐畅 学号13号 电子邮件849286847@https://www.sodocs.net/doc/e66665773.html, 指导教师张暑军 时间2014/2015学年第一学期第20周 承德石油高等专科学校计算机与信息工程系 二零一五年一月十二日

目录 一系统需求描述 (3) 二设计思路 (3) 三实现描述 (4) 四常见问题及解决方法 (6) 五总结 (6)

一系统需求描述 1.任务描述: 我国现在在各个方面发展迅猛,民众的生活质量得到极大的提高。与此同时,根据时代的要求,人们的生活节奏也随之加快。人们都要求自己在很短的时间尽量做到最多的事。所以开发一款能让人们能将其所有的事有序地组织起来,同时又能提醒在什么时间该做什么事的软件是很有必要的。虽然目前这样软件很多功能虽强大,但是用起来都很复杂,有些功能并不实用,操作也太麻烦。该课题的终极目标是开发一个实用,操作便捷的桌面闹钟应用程序,达到在日常生活工作中可以合理利用时间从而大大地提高人们的工作效率。用java语言实现时钟闹钟的设计,设计的时钟闹铃能够完成以下功能:正确的指针位置、日期、时间的数字显示;在设定的时间用铃声提醒,若当前时间为设置的时间时,会伴随着铃声,时间持续约1分钟。若关闭闹铃,则铃声停止。 2.需求分析: (1)该闹铃系统可用于到时响铃功能(可设置多组闹铃); (2)该闹铃系统只需要用户给其设置闹铃时间; (3)该闹铃系统与用户的交互完全靠按键实现; (4)该闹铃系统界面在外观上要求美观。其中最重要的是闹铃的可操作性强,能 够完成必要的功能; (5)该闹铃系统的相应时间0.1秒左右。 (6)该闹铃系统出现故障时,重启系统即可。 二设计思路 1.实验目的: 通过时钟闹铃的设计和实现,充分掌握java语言,提高对图形界面及小程序的设计和编程能力。学会时钟的制作方法;能够采用布局管理器来安排动态文字的位置;能够随机获取变动的系统时间等等。 2.实现功能: (1)正确的指针位置; (2)正确的日期、时间的数字显示; (3)在设定的时间用铃声提醒,若当前时间为设置的时间时,会伴随着铃声,无 控制的情况下,时间持续约1min,若关闭闹铃功能,则闹铃停止。 (4)动态时钟画面准确的显示当前时间。 3.程序设计:1)运用Swing组件实现对闹钟的外观设计。主要应用到标签(JLable)、文本域(JTextField)、按钮(JButton)等,采用网格式布局,由网格布局管理器(GridLayout)来实现。 2)创建线程来获取当前时间,主要通过Runnable接口,使用run()方法来实现当前时间的显示。 3)要使按“选择闹铃音乐”按钮时能够触发对音乐文件的选择,则对按钮添加监听器并采用实例化文件选择器。 4)为了能在输入定点时间后实现对闹钟时间的设定,则需要对“确定”按钮添加监听器。 4.主要用途及性能要求: 时钟闹铃在设置时间后能够及时准确的提醒时间,例如:设置起床闹铃,设

单片机万年历程序(带闹钟)

第一章设计方案 1.1.硬件设计 1.1.1设计要求 实现年月日、时分秒、星期的显示功能,用两个按键来实现日期和时间的调整功能,调整要求星期能自动更新,且能实现位调。显示格式:四位年,两位月,两位日,星期字母前三位,两位时,两位分,两位秒。比如: YYYY-MM-DD WEEK HH:MM:SS 1.1.2硬件框图 图1-1-硬件框图 日期时间由硬件软件结合产生;按键之间相互配合完成当前日期时间的调整功能。过程与结果由控制芯片分别输出到显示器上。 本设计附加了播放音乐的功能。音乐从蜂鸣器产生。 1.1.3硬件选择 1).显示模块 本设计具体选用与实际应用与消耗资源相关。万年历用到的地方大多都在室内。现市场上与许多显示器,在日常生活中最常见的有数码管,led点阵屏,lcd液晶显示器等。 八段数码管的优点:亮度高,显示大。驱动部份的软件简单;缺点:与液晶相比,耗电及体积大。数码管只能单纯的显示数字,不能生动的表达各个参数的信息,消耗电力也比led液晶显示器大。 LCD液晶显示器它是一种专门用来显示字母、数字、符号等的点阵型液晶模块,在单片机系统中应用晶液显示器作为输出器件有以下几个优点: 显示质量高,由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。 数字式接口,液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。 体积小、重量轻,液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。 功耗低,相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。Lcd液晶能一屏把本设计所要显示的信息表达完整。而且lcd耗电小,体积小很适合与室内使用。 本设计的要求日期时间以数字表示、星期用3位英文字符表示共21个字符,lcd1602能显示32个字

单片机汇编程序电子闹钟

电子闹钟课程设计

摘要:本课程设计主要是通过单片机系统,综合运用定时器、中断、数码显示等知识设计一个可定时的电子钟。它包括系统总体方案及硬件设计,软件设计,Proteus软件仿真等部分。 硬件设计的主要任务是根据总体设计要求,以及在所选机型的基础上,确定系统扩展所要用的存储器,I/O电路及有关外围电路等然后设计出系统的电路原理图。 合理的软件结构是设计出一个性能优良的单片机应用性系统软件的基础,因 此必须充分重视。编写完程序后在用Proteus软件仿真检查设计是否合理。 一.课程设计的概况 通过对51单片机的扩展,接键盘,显示器等相应的外围器件。在LED显示器中分成静态显示和动态显示两类,在本设计中主要用了它的动态显示功能,动态显示利用了人视觉的短暂停留,在数据的传输中是一个一个传输的,且先传输低位。键盘是由若干个按键组成的开关矩阵,是一种廉价的输入设备。键盘通常包括有数字键,字母键以及一些功能键。操作人员可以通过对键盘向计算机输入数据,地址,指令或其他的控制命令,实现简单的人机对话。这里采用非编码式键盘。通过51单片机的P1口扩展出独立连接式键盘。外围扩展复位,时钟电路,利用软件源程序代码实现相应的功能。 二.课程设计实现的功能: 1.能显示时时-分分-秒秒。 2.能够设定定时时间,修改定时时间。 3.定时时间到能发出警报声或者启动继电器,从而控制电器的起停。 三.设计方案 使用是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。 本系统采用单片机AT89C51作为本设计的核心元件,利用7段共阴LED作为显示器件。接入共阴LED显示器,可显示时,分钟,秒,单片机外围接有定时报警系统,定时时间到,扬声器发出报警声,提示预先设定时间电器的起停时间到,从而控制电器的起停。

51单片机电子闹钟程序(亲自编写,可用)

学校电子钟,有闹钟功能,按键可调时间,可调打铃时间,打铃时间长短显示,每个模块有功能注释。其中正常时间显示和闹钟时间显示可用一个开关来调整。 芯片选择STC89C52 程序: #include #include #define uchar unsigned char #define uint unsigned int //定义显示段码 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; uchar code bbtime[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar clock[]={0,0,0,0}; uchar clock1[]={12,30,0}; uchar weikong[6]; uchar bbduration=4; uchar lingtime=9; //学校打铃时间组 uchar shangwu1[]={8,30}; uchar shangwu2[]={10,0}; uchar shangwu3[]={10,20}; uchar shangwu4[]={11,50}; uchar xiawu1[]={13,30}; uchar xiawu2[]={15,00}; uchar xiawu3[]={15,15}; uchar xiawu4[]={16,45}; //按键定义 sbit mode=P1^7; sbit sec_clr=P1^0; sbit min_set_add=P1^3; sbit min_set_sub=P1^4; sbit hour_set_add=P1^1; sbit hour_set_sub=P1^2; sbit bb_set_add=P1^5; sbit bb_set_sub=P1^6; sbit speaker=P2^6; //延时函数 void delay(unsigned int t) { while(t--);

Android开发闹钟(详细开发步骤)

一、MainActivity中的代码: package https://www.sodocs.net/doc/e66665773.html,.daming; import java.util.Calendar; import android.app.Activity; import android.app.AlarmManager; import android.app.AlertDialog; import android.app.PendingIntent; import android.app.TimePickerDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.view.KeyEvent; import https://www.sodocs.net/doc/e66665773.html,youtInflater; import android.view.MotionEvent; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.TimePicker; import android.widget.Toast; public class MainActivity extends Activity { TextView setTime1; TextView setTime2; TextView setTime3; Button mButton1; Button mButton2; Button mButton3; Button mButton4;

相关主题