標題: 數碼管電子鐘不能調時,咋整啊! [打印本頁]
作者: lsy531 時間: 2017-7-20 20:54
標題: 數碼管電子鐘不能調時,咋整啊!
程序如下:
#include <STC12C2052AD.H> //STC頭文件
/**********************************************************************************************/
//“程序開發調試設置項”
#define DY_LI 9 //設置LED顯示的亮度(值域:1~9)
#define DY_DELAY 12 //設置每一個點顯示的時間長度(1~20)
/**********************************************************************************************/
sbit DY_KEY = P3 ^ 7; //按鍵1
sbit DY_LED1_L1 =P3 ^ 0; //設置LED點陣屏連接的I/O口
sbit DY_LED1_L2 =P3 ^ 1; //設置LED點陣屏連接的I/O口
sbit DY_LED1_L3 =P3 ^ 2; //設置LED點陣屏連接的I/O口
sbit DY_LED1_L4 =P3 ^ 3; //設置LED點陣屏連接的I/O口
sbit DY_LED1_H1 =P1 ^ 0; //設置LED點陣屏連接的I/O口
sbit DY_LED1_H2 =P1 ^ 1; //設置LED點陣屏連接的I/O口
sbit DY_LED1_H3 =P1 ^ 2; //設置LED點陣屏連接的I/O口
sbit DY_LED1_H4 =P1 ^ 3; //設置LED點陣屏連接的I/O口
sbit DY_LED1_H5 =P1 ^ 4; //設置LED點陣屏連接的I/O口
sbit DY_LED1_H6 =P1 ^ 5; //設置LED點陣屏連接的I/O口
sbit DY_LED1_H7 =P1 ^ 6; //設置LED點陣屏連接的I/O口
sbit DY_LED1_H8 =P1 ^ 7; //設置LED點陣屏連接的I/O口
#define DY_P1M0SET 0x00 //設置I/O口工作方式//00000000(左到右,高到低位)
#define DY_P1M1SET 0xff //設置I/O口工作方式//00101000
#define DY_P3M0SET 0x00 //設置I/O口工作方式//00000000
#define DY_P3M1SET 0x00 //設置I/O口工作方式//10010100
bit PD;//秒點顯示標志
unsigned char MENU;//菜單切換標志位
data unsigned char DY_PWM,bn, cou = 0, TIME_YY,TIME_MO,TIME_DD,TIME_WW,TIME_HH,TIME_MM,TIME_SS;//設置時、分、秒存放區
data bit DAY_BIT = 0;//天數增加標志位(用于日期進位的啟動)
unsigned int aa;
unsigned char code disdata[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40 //無小數點數碼管段碼表(0~9)
};
/*********************************************************************************************/
void delay (unsigned int a){ // 用于點掃描的延時
unsigned int i;
while( a-- != 0){
for(i = 0; i < DY_DELAY; i++);
}
}
/*********************************************************************************************/
/*****************************************************************************/
void dis_off (void){
P1 = ~DY_P1M1SET; //關所有顯示
P3 = ~DY_P3M1SET;
delay(10-DY_PWM);
}
/*********************************************************************************************/
void displayHH1 (unsigned char d){ //第1列橫向顯示程序
unsigned char i;
i = d & 0x01;
if(i == 0x01){
DY_LED1_L1 = 0;DY_LED1_H1 = 1;}delay(DY_PWM);dis_off();
i = d & 0x02;
if(i == 0x02){
DY_LED1_L1 = 0;DY_LED1_H2 = 1;}delay(DY_PWM);dis_off();
i = d & 0x04;
if(i == 0x04){
DY_LED1_L1 = 0;DY_LED1_H3 = 1;}delay(DY_PWM);dis_off();
i = d & 0x08;
if(i == 0x08){
DY_LED1_L1 = 0;DY_LED1_H4 = 1;}delay(DY_PWM);dis_off();
i = d & 0x10;
if(i == 0x10){
DY_LED1_L1 = 0;DY_LED1_H5 = 1;}delay(DY_PWM);dis_off();
i = d & 0x20;
if(i == 0x20){
DY_LED1_L1 = 0;DY_LED1_H6 = 1;}delay(DY_PWM);dis_off();
i = d & 0x40;
if(i == 0x40){
DY_LED1_L1 = 0;DY_LED1_H7 = 1;}delay(DY_PWM);dis_off();
i = d & 0x80;
if(i == 0x80){
DY_LED1_L1 = 0;DY_LED1_H8 = 1;}delay(DY_PWM);dis_off();
}
/*********************************************************************************************/
void displayHH2 (unsigned char d){ //第2列橫向顯示程序
unsigned char i;
i = d & 0x01;
if(i == 0x01){
DY_LED1_L2 = 0;DY_LED1_H1 = 1;}delay(DY_PWM);dis_off();
i = d & 0x02;
if(i == 0x02){
DY_LED1_L2 = 0;DY_LED1_H2 = 1;}delay(DY_PWM);dis_off();
i = d & 0x04;
if(i == 0x04){
DY_LED1_L2 = 0;DY_LED1_H3 = 1;}delay(DY_PWM);dis_off();
i = d & 0x08;
if(i == 0x08){
DY_LED1_L2 = 0;DY_LED1_H4 = 1;}delay(DY_PWM);dis_off();
i = d & 0x10;
if(i == 0x10){
DY_LED1_L2 = 0;DY_LED1_H5 = 1;}delay(DY_PWM);dis_off();
i = d & 0x20;
if(i == 0x20){
DY_LED1_L2 = 0;DY_LED1_H6 = 1;}delay(DY_PWM);dis_off();
i = d & 0x40;
if(i == 0x40){
DY_LED1_L2 = 0;DY_LED1_H7 = 1;}delay(DY_PWM);dis_off();
i = d & 0x80;
if(i == 0x80){
DY_LED1_L2 = 0;DY_LED1_H8 = 1;}delay(DY_PWM);dis_off();
}
/*********************************************************************************************/
void displayHH3 (unsigned char d){ //第3列橫向顯示程序
unsigned char i;
i = d & 0x01;
if(i == 0x01){
DY_LED1_L3 = 0;DY_LED1_H1 = 1;}delay(DY_PWM);dis_off();
i = d & 0x02;
if(i == 0x02){
DY_LED1_L3 = 0;DY_LED1_H2 = 1;}delay(DY_PWM);dis_off();
i = d & 0x04;
if(i == 0x04){
DY_LED1_L3 = 0;DY_LED1_H3 = 1;}delay(DY_PWM);dis_off();
i = d & 0x08;
if(i == 0x08){
DY_LED1_L3 = 0;DY_LED1_H4 = 1;}delay(DY_PWM);dis_off();
i = d & 0x10;
if(i == 0x10){
DY_LED1_L3 = 0;DY_LED1_H5 = 1;}delay(DY_PWM);dis_off();
i = d & 0x20;
if(i == 0x20){
DY_LED1_L3 = 0;DY_LED1_H6 = 1;}delay(DY_PWM);dis_off();
i = d & 0x40;
if(i == 0x40){
DY_LED1_L3 = 0;DY_LED1_H7 = 1;}delay(DY_PWM);dis_off();
i = d & 0x80;
if(i == 0x80){
DY_LED1_L3 = 0;DY_LED1_H8 = 1;}delay(DY_PWM);dis_off();
}
/*********************************************************************************************/
void displayHH4 (unsigned char d){ //第4列橫向顯示程序
unsigned char i;
i = d & 0x01;
if(i == 0x01){
DY_LED1_L4 = 0;DY_LED1_H1 = 1;}delay(DY_PWM);dis_off();
i = d & 0x02;
if(i == 0x02){
DY_LED1_L4 = 0;DY_LED1_H2 = 1;}delay(DY_PWM);dis_off();
i = d & 0x04;
if(i == 0x04){
DY_LED1_L4 = 0;DY_LED1_H3 = 1;}delay(DY_PWM);dis_off();
i = d & 0x08;
if(i == 0x08){
DY_LED1_L4 = 0;DY_LED1_H4 = 1;}delay(DY_PWM);dis_off();
i = d & 0x10;
if(i == 0x10){
DY_LED1_L4 = 0;DY_LED1_H5 = 1;}delay(DY_PWM);dis_off();
i = d & 0x20;
if(i == 0x20){
DY_LED1_L4 = 0;DY_LED1_H6 = 1;}delay(DY_PWM);dis_off();
i = d & 0x40;
if(i == 0x40){
DY_LED1_L4 = 0;DY_LED1_H7 = 1;}delay(DY_PWM);dis_off();
i = d & 0x80;
if(i == 0x80){
DY_LED1_L4 = 0;DY_LED1_H8 = 1;}delay(DY_PWM);dis_off();
}
/*********************************************************************************************/
void diplay_data (unsigned char l,unsigned char d){
switch (l){//顯示的列位置
case 1://
displayHH1(d); //將顯示數據送入
break;//
case 2://
displayHH2(d); //將顯示數據送入
break;//
case 3://
displayHH3(d); //將顯示數據送入
break;//
case 4://
displayHH4(d); //將顯示數據送入
break;//
}
}
/*********************************************************************************************/
bit IsLeapYear(void){ //計算本年是否是潤年
unsigned int a;
a = 2000+TIME_YY;//加2000表示成完整的年
if((a%4==0 && a%100!=0)||(a%400==0)){ //潤年的計算公式
return 1;//是潤年返回1
}else{
return 0;//不是潤年返回0
}
}
/**********************************************************************************************/
void month_day(void){
unsigned char mon_day[]={31,28,31,30,31,30,31,31,30,31,30,31};
TIME_DD++;//天加1
TIME_WW++;//星期值加1
if(TIME_WW > 7){
TIME_WW = 1;//時期值限定
}
if(TIME_DD > mon_day[TIME_MO-1]){//檢查天是否大于當月的最大值
if(IsLeapYear()&&TIME_MO==2){ //計算本月是否是潤年的2月份
TIME_DD = 29;//如果是潤年又是2月,則天為29
}else{
TIME_DD = 1; //否則就等于1
TIME_MO++;//月加1
if(TIME_MO > 12){
TIME_MO = 1; //如果月大于12則月等于1
TIME_YY++;//年加1 (公歷年無限積加)
}
}
}
}
/*********************************************************************************************/
void xianshi() {
for(aa=0;aa<1000;aa++){
diplay_data (3,disdata[TIME_MM/10]);
diplay_data (4,disdata[TIME_MM%10]);
if(PD){
diplay_data (1,disdata[TIME_HH/10]);
diplay_data (2,disdata[TIME_HH%10]);
}else{
diplay_data (1,disdata[TIME_HH/10]);
diplay_data (2,disdata[TIME_HH%10]+0x80);
}
}
for(aa=1000;aa<2000;aa++){
diplay_data (1,disdata[TIME_MO/10]);
diplay_data (2,disdata[TIME_MO%10]);
diplay_data (3,disdata[TIME_DD/10]);
diplay_data (4,disdata[TIME_DD%10]);
}
for(aa=2000;aa<3000;aa++){
diplay_data (2,disdata[10]);
diplay_data (3,disdata[TIME_WW]);
diplay_data (4,disdata[10]);
if(aa==3000)
aa=0;
}
}
/*********************************************************************************************/
void init (void){ //上電初始化
P1M0 = DY_P1M0SET;
P1M1 = DY_P1M1SET;
P3M0 = DY_P3M0SET;
P3M1 = DY_P3M1SET;
dis_off();
DY_PWM = DY_LI;
TMOD = 0x11; // 定時/計數器0,1工作于方式1
TH0 = 0x3c; // 預置產生50ms時基信號
TL0 = 0xb0;
TH1=0x3c;
TL1=0xb0;
EA = 1; //中斷總開關
ET0 = 1; // 定時/計數器0允許中斷
TR0 = 1; // 開閉定時/計數器0
ET1 = 1; // 定時/計數器0允許中斷
TR1 = 1; // 開閉定時/計數器0
TIME_DD = 19; //時間在首次使用的值,之后會在EEPROM自動記錄上一天的值
TIME_MO = 7; //初始時間:2009年5月18日周一,20時13分40秒
TIME_YY = 17;
TIME_WW = 3;
TIME_HH = 22;
TIME_MM = 40;
TIME_SS = 0;
}
/*********************************************************************************************/
void main (void){ //主程序
unsigned char s;
init();
MENU=0;
s=0;
aa=0;
while (1){
if(DAY_BIT == 1){ //檢查天數是否更新,是則計算公歷
month_day();//計算公歷日期
DAY_BIT = 0;//計算完成后將日期變更標志位置0
}
if(MENU==0) //顯示正常走時主界面
xianshi();
if(DY_KEY==0){
EA = 0; //中斷總開關
TR1 = 0; // 關閉定時/計數器
s++;
if(s>200){
s=0;MENU++;
while(DY_KEY==0){
diplay_data (1,disdata[TIME_HH/10]);
diplay_data (2,disdata[TIME_HH%10]);
}
}
}//長短按鍵處理//長按轉到MENU1
if(DY_KEY==1 && s>10 && s<200){s=0;DY_PWM++;if(DY_PWM>4)DY_PWM=1;}//短按設置亮度
}
if(MENU==1){//設置時間:小時
diplay_data (1,disdata[TIME_HH/10]);
diplay_data (2,disdata[TIME_HH%10]);
diplay_data (3,0x80);
diplay_data (4,0x80);
if(DY_KEY==0){
s++;
if(s>200){
s=0;MENU++;
while(DY_KEY==0){
diplay_data (3,disdata[TIME_MM/10]);
diplay_data (4,disdata[TIME_MM%10]);
}
}
}//長短按鍵處理//長按轉到MENU1
if(DY_KEY==1 && s>10 && s<200){s=0;TIME_HH++;if(TIME_HH>23)TIME_HH=0;}//短按設置亮度
}
if(MENU==2){//設置時間:分鐘
diplay_data (3,disdata[TIME_MM/10]+0x80);
diplay_data (4,disdata[TIME_MM%10]+0x80);
if(DY_KEY==0){
s++;
if(s>200){
s=0;MENU=0;
while(DY_KEY==0){
diplay_data (1,disdata[TIME_HH/10]);
diplay_data (2,disdata[TIME_HH%10]);
diplay_data (3,disdata[TIME_MM/10]);
diplay_data (4,disdata[TIME_MM%10]);
}
}
}//長短按鍵處理//長按轉到MENU1
if(DY_KEY==1 && s>10 && s<200){s=0;TIME_MM++;TIME_SS=0;if(TIME_MM>59)TIME_MM=0;}//短按設置亮度
}
}
/**********************************************************************************************/
void tiem0(void) interrupt 1{ // T/C0中斷服務程序(產生50ms時基信號)
cou++; // 軟計數器加1
if(cou > 19){ // 計數值到100(1s)
cou = 0; // 軟計數器清零
TIME_SS++; // 秒計數器加1(進位10ms*100=1s)
PD =~ PD; //秒點閃爍
if(TIME_SS > 59){ // 秒計數值到60
TIME_SS = 0; // 秒計數器清零
TIME_MM++; // 分計數器加1(進位60s=1m)
if(TIME_MM > 59){ // 分計數到60
TIME_MM = 0; // 分計數器清零
TIME_HH++; // 時計數器加1(進位60m=1h)
if(TIME_HH > 23){ // 時計數到23
TIME_HH = 0; // 時計數器清零
DAY_BIT = 1; //天增加標志位
}
}
}
}
TH0 = 0x3c; // 重置定時常數
TL0 = 0xb0;
}
/**********************************************************************************************/
void tiem1(void) interrupt 3{ // T/C0中斷服務程序(產生50ms時基信號)
TH1=0x3c;
TL1=0xb0;
aa++ ;
}
作者: zl2168 時間: 2017-7-20 21:57
本帖最后由 zl2168 于 2017-7-21 21:24 編輯
實例91 具有校正功能的時鐘1302(LCD1602顯示)
實例91 帶校正時鐘1302(LCD1602顯示).rar
(52.68 KB, 下載次數: 4)
2017-7-21 21:23 上傳
點擊文件名下載附件
具有校正功能的時鐘1302.jpg (201.72 KB, 下載次數: 67)
下載附件
2017-7-21 21:24 上傳
先Proteus仿真,確認有效。
以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil C和Proteus》清華大學出版社ISBN 978-7-302-41682-1,書中電路和程序設計有詳細說明,程序語句條條有注解。仿真電路和Hex文件能在清華出版社網站免費下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網上書店打折購買。
作者: zl2168 時間: 2017-7-20 21:58
本帖最后由 zl2168 于 2017-7-20 23:00 編輯
實例93 具有校正功能的時鐘1302(LED數碼管顯示)
實例93 帶校正時分秒的時鐘1302(6位LED數碼管顯示).rar
(732.75 KB, 下載次數: 4)
2017-7-20 22:59 上傳
點擊文件名下載附件
開機顯示PC機時分秒的時鐘(6位LED數碼管顯示).jpg (219.73 KB, 下載次數: 45)
下載附件
2017-7-20 22:59 上傳
先Proteus仿真一下,確認有效。
以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil C和Proteus》清華大學出版社ISBN 978-7-302-41682-1,內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行。仿真電路和Hex文件能在清華出版社網站免費下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網上書店打折購買。
作者: zl2168 時間: 2017-7-20 21:59
本帖最后由 zl2168 于 2017-7-20 22:58 編輯
實例94 模擬電子鐘(由80C51定時器產生秒時基)
實例94 模擬電子鐘(由80C51定時器產生秒時基).rar
(43.05 KB, 下載次數: 4)
2017-7-20 22:57 上傳
點擊文件名下載附件
模擬電子鐘.jpg (306.12 KB, 下載次數: 62)
下載附件
2017-7-20 22:58 上傳
先Proteus仿真一下,確認有效。
以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil C和Proteus》清華大學出版社ISBN 978-7-302-41682-1,內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行。書中電路和程序設計有詳細說明,程序語句條條有注解。仿真電路和Hex文件能在清華出版社網站免費下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網上書店打折購買。
作者: lsy531 時間: 2017-7-20 23:47
謝謝!我去參考下,我的那個程序哪里有沖突,能幫忙看看嘛?謝謝!
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
久久久精品网站
|
久久精品91久久久久久再现
|
国产免费观看一级国产
|
91精品国产综合久久久久久首页
|
狠狠干av|
日本福利视频免费观看
|
亚洲永久
|
av黄色在线播放
|
我我色综合
|
av超碰|
日日干夜夜操天天操
|
中文字幕亚洲欧美
|
毛片高清|
国产精品一区久久久
|
视频一区在线
|
国产精品中文字幕一区二区三区
|
亚洲精品免费在线观看
|
欧美一区二区三区大片
|
免费视频99
|
婷婷成人在线
|
日韩中文一区二区
|
精品视频一区二区三区四区
|
四虎影院久久
|
电影午夜精品一区二区三区
|
在线免费观看日本视频
|
97碰碰碰
|
伊人色综合久久久天天蜜桃
|
久久久精品国产
|
免费国产视频
|
亚洲精品久久
|
久久久精|
国产在线精品一区二区
|
免费在线观看一区二区三区
|
国产天天操
|
草久久免费视频
|
成人av免费
|
在线一级片
|
亚洲国产精品久久久久
|
91大神新作在线观看
|
亚洲国产aⅴ成人精品无吗
欧美激情欧美激情在线五月
|
一区二区三区在线观看免费视频
|