久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
分享一個單片機可調鬧鈴 程序+仿真
[打印本頁]
作者:
50527978
時間:
2015-9-12 22:42
標題:
分享一個單片機可調鬧鈴 程序+仿真
可以顯示年月日、時間、鬧鈴,并可調。
自己也是剛學單片機,自己弄出這個不是很好,希望有大神能夠指正我做這個是否還有某些考慮不到位的地方!
13定時器實驗.rar
2015-9-12 22:42 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
185.91 KB, 下載次數: 50, 下載積分: 黑幣 -5
作者:
admin
時間:
2015-9-12 23:01
樓主的程序:
#include<reg51.h>
#include<INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit key5=P1^4;
sbit key6=P1^5;
sbit key7=P1^6;
sbit key8=P1^7;
sbit buzzer=P2^5; //蜂鳴器端口
sbit lcd_RS = P2^0; //1602數據/命令選擇端(H:數據寄存器L:指令寄存器)
sbit lcd_RW = P2^1; //1602讀/寫選擇端
sbit lcd_E = P2^2;//1602使能信號端
uchar time0[]="CLOCK 23:58";
uchar mark1[]="2015-01-01";
uchar mark2[]=" SET UP ";
uchar code tab[]={'0','1','2','3','4','5','6','7','8','9'};//液晶顯示
uchar code tab2[]={0x08,0x14,0x0A,0x15,0x0A,0x14,0x08,0x10}; //有鬧鈴聲響開關標示顯示
uchar alarm_on; //鬧鈴聲響級
uchar sound_on; //鬧鈴發聲標示
uchar display_alarm; //顯示鬧鈴標示
uchar num=0;
uchar flag_clock,flag_alarm,flag_year; //時鐘/鬧鈴設置模式標示
uchar second,minute,hour; //秒,分,時
uint nian,yue,ri; //年月日
uchar alarm_h,alarm_m; //鬧鈴的時,分
uchar clock[11]; //時間
uchar alarm[11]; //鬧鈴
uint year[10]; //年月日
void delay1(uint t)//短延時函數
{
while(t--);
}
void delay2(uint t) //長延時函數
{
uint x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
void WriteCommand(uchar com) //寫入指令
{
delay2(5);//操作前短暫延時,保證信號穩定
lcd_E=0;
lcd_RS=0;
lcd_RW=0;
P3=com;
lcd_E=1;
delay2(5);
lcd_E=0;
}
void WriteData(uchar dat) //寫數據
{
delay2(5); //操作前短暫延時,保證信號穩定
lcd_E=0;
lcd_RS=1;
lcd_RW=0;
P3=dat;
lcd_E=1;
delay2(5);
lcd_E=0;
}
void handle_time() //顯示時間
{
uchar i;
clock[0]='C';
clock[1]='L';
clock[2]='O';
clock[3]='C';
clock[4]='K';
clock[5]=0x20;//顯示為空
clock[6]=tab[hour/10];
clock[7]=tab[hour%10];
clock[8]=0x3a; //顯示冒號
clock[9]=tab[minute/10];
clock[10]=tab[minute%10];
WriteCommand(0x80+0x03);//光標指向第1行
for(i=0;i<11;i++)// 顯示
{
WriteData(clock[i]);
delay2(10);
}
}
void handle_year() //顯示年月日
{
uchar i;
year[0]=tab[nian/1000];
year[1]=tab[(nian%1000)/100];
year[2]=tab[((nian%1000)%100)/10];
year[3]=tab[((nian%1000)%100)%10];
year[4]='-';
year[5]=tab[yue/10];
year[6]=tab[yue%10];
year[7]='-';
year[8]=tab[ri/10];
year[9]=tab[ri%10];
WriteCommand(0x80+0x43); //第2行
for(i=0;i<10;i++)
{
WriteData(year[i]);
delay2(10);
}
}
void InitLcd1602() //lcd1602初始化
{
uchar i;
delay2(15);
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x06); //顯示光標移動位置
WriteCommand(0x0c); //顯示開及光標設置
WriteCommand(0x01); //顯示清屏
WriteCommand(0x80+0x03);//光標指向第一行
for(i=0;i<11;i++)// 顯示
{
WriteData(time0[i]);
delay2(10);
}
WriteCommand(0x80+0x43);//將光標移到第二行
for(i=0;i<10;i++)// 顯示
{
WriteData(mark1[i]);
delay2(10);
}
}
void handle_alarm() //顯示鬧鐘
{
uchar i;
alarm[0]='A';
alarm[1]='L';
alarm[2]='A';
alarm[3]='R';
alarm[4]='M';
alarm[5]=0x20;//顯示為空
alarm[6]=tab[alarm_h/10];
alarm[7]=tab[alarm_h%10];
alarm[8]=0x3a; //顯示冒號
alarm[9]=tab[alarm_m/10];
alarm[10]=tab[alarm_m%10];
WriteCommand(0x80+0x03);//光標指向第1行第一個字符
for(i=0;i<11;i++)// 顯示
{
WriteData(alarm[i]);
delay2(10);
}
}
void clock_set_up() //時鐘設置模式
{
while(flag_clock)
{
uchar i;
WriteCommand(0x80+0x43);
for(i=0;i<11;i++)// 顯示
{
WriteData(mark2[i]);
delay2(10);
}
if(key1==0) //時++
{
delay2(5);//延時消抖
if(key1==0)
{
hour++;
if(hour==24)
{
hour=0;
}
}
while(!key1);//松手檢測
}
if(key2==0)
{
delay2(5);//延時消抖
if(key2==0)
{
if(hour!=0) //時減
hour--;
}
while(!key2);//松手檢測
}
if(key3==0) //分++
{
delay2(5);
if(key3==0)
{
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
while(!key3);
}
if(key4==0) //分--
{
delay2(5);
if(key4==0)
{
if(minute!=0)
minute--;
}
while(!key4);
}
handle_time(); //顯示時間
if(key7==0) //結束時鐘設置
{
delay2(5);//延時消抖
while(!key7);//松手檢測
flag_clock=0;
}
}
}
void alarm_set_up() //鬧鈴設置模式
{
while(flag_alarm)
{
uchar i;
WriteCommand(0x80+0x43);
for(i=0;i<11;i++)// 顯示
{
WriteData(mark2[i]);
delay2(10);
}
if(key1==0) //時++
{
delay2(5);//延時消抖
if(key1==0)
{
alarm_h++;
if(alarm_h==24)
{
alarm_h=0;
}
}
while(!key1);//松手檢測
}
if(key2==0) //時--
{
delay2(5);
if(key2==0)
{
if(alarm_h!=0)
alarm_h--;
}
while(!key2);
}
if(key3==0) //分++
{
delay2(5);//延時消抖
if(key3==0)
{
alarm_m++;
if(alarm_m==60)
{
alarm_m=0;
alarm_h++;
if(alarm_h==24)
{
alarm_h=0;
}
}
}
while(!key3);//松手檢測
}
if(key4==0) //分--
{
delay2(5);
if(key4==0)
{
if(alarm_m!=0)
alarm_m--;
}
while(!key4);
}
handle_alarm(); //顯示鬧鈴
if(key7==0) //結束鬧鈴設置
{
delay2(5);//延時消抖
while(!key7);//松手檢測
flag_alarm=0;
}
}
}
void alarm_sound() //聲響
{
buzzer=0;
delay2(50);
buzzer=1;
delay2(50);
buzzer=0;
delay2(50);
buzzer=1;
delay2(50);
buzzer=0;
delay2(50);
}
void year_set_up() //key4年月日設置
{
while(flag_year)
{
uchar i;
WriteCommand(0x80+0x03);
for(i=0;i<11;i++)// 顯示
{
WriteData(mark2[i]);
delay2(10);
}
if(key1==0) //年+
{
delay2(5);
if(key1==0)
{
nian++;
}
while(!key1);
}
if(key2==0) //年--
{
delay2(5);
if(key2==0)
{
if(key2==0)
nian--;
}
while(!key2);
}
if(key3==0) //月+
{
delay2(5);
if(key3==0)
{
yue++;
if(yue==13)
yue=1;
}
while(!key3);
}
if(key4==0) //月--
{
delay2(5);
if(key4==0)
{
yue--;
if(yue==0)
yue=1;
}
while(!key4);
}
if(key5==0) //日++
{
delay2(5);
if(key5==0)
{
if(yue==2||yue==4||yue==6||yue==9||yue==11)
{
ri++;
if(yue==2)
{
if(ri==29)
{
if((nian%4==0&&nian%100!=0)||(nian%400==0));//閏年
else //平年
ri=1;
}
if(ri==30)
ri=1;
}
if(ri==31)
ri=1;
}
else
{
ri++;
if(ri==32)
ri=1;
}
}
while(!key5);
}
if(key6==0) //日—-
{
delay2(5);
if(key6==0)
{
ri--;
if(ri==0)
ri=1;
}
while(!key6);
}
handle_year();
if(key7==0)
{
delay2(5);
if(key7==0)
flag_year=0;
while(!key7);
}
}
}
void key7_set_up() //K7開關鬧鈴
{
uchar i;
alarm_on++;
if(alarm_on==2)
{
alarm_on=0;
}
if(alarm_on==1)
{
sound_on=1;
WriteCommand(0x40);//寫入自定義字符
for(i=0;i<8;i++)
{
WriteData(tab2[i]);
}
WriteCommand(0x80+0x40);//顯示自定義字符
WriteData(0x00);
delay2(10);
}
if(alarm_on==0)
{
sound_on=0;
buzzer=1;
WriteCommand(0x80+0x40);//顯示鬧鈴標示為空
WriteData(0x20);
delay2(10);
}
}
void main()
{
TMOD=0x10;
IE=0x88;
TH1=0x3c;
TL1=0xb0;
TR1=1;
nian=2015;
yue=1;
ri=1;
hour=23; //初始時間
minute=58;
second=0;
display_alarm=0; //開機不顯示鬧鈴
alarm_h=0; // 初始鬧鈴
alarm_m=0;
alarm_on=0;
sound_on=1; //開機默認無聲響
InitLcd1602();
while(1)
{
uchar i;
handle_year();
handle_time();
if(key1==0) //進入時鐘設置模式
{
delay2(5);//延時消抖
while(!key1);//松手檢測
flag_clock=1;
clock_set_up();
}
if(key2==0) //設置鬧鈴模式
{
delay2(5);//延時消抖
while(!key2);//松手檢測
flag_alarm=1;
alarm_set_up();
}
if(key3==0) //顯示鬧鈴,
{
delay2(5);//延時消抖
while(!key3);//松手檢測
display_alarm=1;
while(display_alarm)
{
handle_alarm();
if(key7==0)
{
delay2(5);
if(key7==0)
display_alarm=0;
while(!key7);
}
}
}
if(key4==0) //設置年月日模式
{
delay2(5);
while(!key4);
flag_year=1;
year_set_up();
}
if(key7==0) //鬧鈴開關啟
{
delay2(5);
while(!key7);
key7_set_up();
}
if((hour==alarm_h)&&(minute==alarm_m)) //鬧鈴時間是否到了
{
if(sound_on==1)
{
sound_on=0;
alarm_sound();
}
}
}
}
void ti_func() interrupt 3
{
TH1=0x3c;
TL1=0xb0;
if(num<20)
{
num=num+1;
}
if(num==20) //num為20時1S時間到
{
num=0;
second=second+1;
if(second==60) //1分鐘時間到
{
second=0;
minute=minute+1;
if(minute==60) //1小時時間到
{
minute=0;
hour=hour+1;
if(hour==24) // 24小時到
{
hour=0;
ri++;
if(yue==2||yue==4||yue==6||yue==9||yue==11)
{
if(yue==2)
{
if(ri==29)
{
if((nian%4==0&&nian%100!=0)||(nian%400==0));//閏年
else
{
ri=1;
yue++;
}
}
if(ri==30)
{
ri=1;
yue++;
}
}
if(ri==31)
{
ri=1;
yue++;
}
}
else
{
if(ri==32)
{
ri=1;
yue++;
if(yue==13)
{
nian++;
yue=1;
}
}
}
}
}
}
}
}
復制代碼
作者:
yingkuix
時間:
2015-9-13 17:04
很好,有機會試試
作者:
漫長的歲月
時間:
2018-11-4 17:42
有仿真電路圖嗎
作者:
YeeeJ
時間:
2020-3-19 11:01
你好 我下載了為什么打不開仿真圖啊?是文件損壞了嗎?
作者:
張張不會單片機
時間:
2020-8-10 15:32
請問這個代碼我要是在keil里面運行選STC15可以么
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
少妇诱惑av
|
又黑又粗又长的欧美一区
|
欧美视频二区
|
91精品国产91久久久久久不卞
|
日本在线中文
|
日韩欧美国产精品
|
九九热在线精品视频
|
亚洲成人一级片
|
久久精品亚洲一区
|
毛片网站免费观看
|
欧美久久视频
|
欧美精品国产精品
|
成人影院av
|
久久精品视频一区二区三区
|
国产在线精品一区二区
|
欧美精品99
|
国产一区二区三区在线
|
亚洲欧洲成人在线
|
久久久久九九九女人毛片
|
国产欧美一区二区三区国产幕精品
|
狠狠av
|
99热都是精品
|
成人免费视频
|
在线观看中文字幕亚洲
|
午夜免费观看体验区
|
欧美自拍第一页
|
亚洲aⅴ
|
国产精品久久久久久久毛片
|
国产免费一区二区三区免费视频
|
国产精品伦一区二区三级视频
|
超碰成人免费
|
伊人网综合在线观看
|
99re国产视频
|
自拍视频网站
|
日本黄色一级视频
|
91成人午夜性a一级毛片
|
草草草影院
|
成人三区
|
a在线视频
|
国产精品区二区三区日本
|
一级片av
|