① 單片機電子表程序
匯編如下:
S_SET BIT P3.4 ;秒增加1按鈕位
M_SET BIT P3.5 ;分增加1按鈕位
H_SET BIT P3.7 ;小時增加1按鈕位
SECOND EQU 30H ;秒計數值變數
MINUTE EQU 31H ;分計數值變數
HOUR EQU 32H ;小時計數值變數
TCNT EQU 34H ; 1秒定時計數器
ORG 00H ;起始地址
JMP START
ORG 0BH ;Timer0中斷向量地址
JMP INT_T0
START:
MOV DPTR,#TABLE ;裝七段數碼管段碼數據表TABLE
MOV HOUR,#0 ;計數值全部清0
MOV MINUTE,#0
MOV SECOND,#0
MOV TCNT,#0
MOV TMOD,#01H ;Timer 0作定時器,模式1
MOV TH0,#(65536-50000)/256 ;定時50毫秒
MOV TL0,#(65536-50000)MOD 256
MOV IE,#82H ;中斷使能
SETB TR0 ;啟動Timer 0
;以下是判斷秒、分、小時增加1按鈕是否被按下
A1:
CALL DISPLAY
JNB S_SET,S1 ;判斷秒按鈕
JNB M_SET,S2 ;判斷分按鈕
JNB H_SET,S3 ;判斷小時按鈕
JMP A1 ;循環檢測
S1:
CALL DELAY ;去抖動
JB S_SET,A1
INC SECOND ;秒位計數值加1
MOV A,SECOND ;A=SECOND
CJNE A,#60,J0 ;判斷是否到60秒
MOV SECOND,#0 ;如果到了就清0秒位計數值
JMP K1 ;跳到K1段
S2:
CALL DELAY
JB M_SET,A1
K1:
INC MINUTE ;分位計數值加1
MOV A,MINUTE ;A=MINUTE
CJNE A,#60,J1 ;判斷是否到60分
MOV MINUTE,#0 ;如果到了就清0分位計數值
JMP K2
S3:
CALL DELAY
JB H_SET,A1
K2:
INC HOUR ;小時計數值加1
MOV A,HOUR ;A=HOUR
CJNE A,#24,J2 ;判斷是否到24小時
MOV HOUR,#0 ;如果到了就清0秒、分、小時位計數值
MOV MINUTE,#0
MOV SECOND,#0
JMP A1
;以下程序等待秒、分、小時按鈕放開
J0:
JB S_SET,A1
CALL DISPLAY
JMP J0
J1:
JB M_SET,A1
CALL DISPLAY
JMP J1
J2:
JB H_SET,A1
CALL DISPLAY
JMP J2
;Timer0中斷服務子程序, 進行秒、分、小時的計時
INT_T0:
MOV TH0,#(65536-50000)/256 ;裝計數初始值
MOV TL0,#(65536-50000)MOD 256
INC TCNT ;1秒計數器增加1
MOV A,TCNT ;A=TCNT
CJNE A,#20,RETUNE ;計時1秒
INC SECOND ;秒計數器增加1
MOV TCNT,#0 ;清零TCNT
MOV A,SECOND ;A=SECOND
CJNE A,#60,RETUNE ;計時60秒
INC MINUTE ;分計數器增加1
MOV SECOND,#0 ;清零秒
MOV A,MINUTE ;A=MINUTE
CJNE A,#60,RETUNE ;計時60分
INC HOUR ;小時計數器增加1
MOV MINUTE,#0 ;清零分
MOV A,HOUR ;A=HOUR
CJNE A,#24,RETUNE ;計時24小時
MOV HOUR,#0 ;秒、分、小時計數值清0
MOV MINUTE,#0
MOV SECOND,#0
MOV TCNT,#0
RETUNE:
RETI ; 中斷服務子程序結束
;以下為七段數碼管顯示的子程序
DISPLAY:
MOV A,SECOND ;A=SECOND,顯示秒
MOV B,#10 ;B=10
DIV AB ;A除以B
MOV P2,#00100000B ;使能秒的十位
MOVC A,@A+DPTR ;七段數碼管段碼數據裝入A
MOV P0,A ;從P0口輸出
CALL DELAY
ORL P2,#0FFH ;熄滅七段數碼管
MOV A,B ;A=B
MOV P2,#00000000B ;使能秒的個位
MOVC A,@A+DPTR ;七段數碼管段碼數據裝入A
MOV P0,A ;從P0口輸出
CALL DELAY
ORL P2,#0FFH ;熄滅七段數碼管
MOV A,MINUTE ;A=MINUTE,顯示分
MOV B,#10 ;B=10
DIV AB ;A除以B
MOV P2,#01100000B ;使能分的十位
MOVC A,@A+DPTR ;七段數碼管段碼數據裝入A
MOV P0,A ;從P0口輸出
CALL DELAY
ORL P2,#0FFH ;熄滅七段數碼管
MOV A,B ;A=B
MOV P2,#01000000B ;使能分的個位
MOVC A,@A+DPTR ;七段數碼管段碼數據裝入A
MOV P0,A ;從P0口輸出
CALL DELAY
ORL P2,#0FFH ;熄滅七段數碼管
MOV A,HOUR ;A=HOUR,顯示小時
MOV B,#10 ;B=10
DIV AB ;A除以B
MOV P2,#10100000B ;使能小時的十位
MOVC A,@A+DPTR ;七段數碼管段碼數據裝入A
MOV P0,A ;從P0口輸出
CALL DELAY
ORL P2,#0FFH ;熄滅七段數碼管
MOV A,B ;A=B
MOV P2,#10000000B ;使能小時的個位
MOVC A,@A+DPTR ;七段數碼管段碼數據裝入A
MOV P0,A ;從P0口輸出
CALL DELAY
ORL P2,#0FFH ;熄滅七段數碼管
RET
TABLE: ;七段數碼管顯示碼表
DB 40H,79H,24H,30H,19H
DB 12H,02H,78H,00H,10H
DELAY: ;延時子程序
MOV R6,#2
D1:
MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET
END
② 51單片機的4位數碼管做簡易秒錶C語言程序
#include"dz110306140.h"這是什麼頭文件
③ 單片機秒錶程序
以下程序使用定時器1計數,定時10ms,60H為妙計數單元,4FH單元為秒標示位,一秒時間到,置位4FH*********************************************************************************************************************** ORG 0000H ;程序從0地址開始
LJMP MAIN ;跳到STRAT處執行
ORG 001BH
LJMP JIA1
ORG 0030H
MAIN:MOV TMOD,#01H ;設置T1工作在模式1
MOV TH1,#068H ;賦初值,定時10ms
MOV TL1,#0F0H
MOV IE,#88H ;開CPU中斷,開定時器1中斷
SETB TR1 ;啟動T1定時器工作
MOV 60H,#100 ;給60H單元賦初值
CLR 4FH ;清零4FH單元
DISPLAY: ;顯示子程序
MOV DPTR,#TAB ;DPTR指向編碼表位置
MOV A,R3 ;將R3的內容復制到A
MOV B,#10
DIV AB ;A除B,商給A,余數給B
MOVC A,@A+DPTR ;根據A的值取出編碼表中的編碼
MOV P1,A ;由P1口輸出A的內容
SETB P2.0 ;置位P2.0
CLR P2.0 ;清零P2.0
MOV A,B
MOVC A,@A+DPTR ;根據A的值取出編碼表中的編碼
MOV P1,A ;由P1口輸出A的內容
SETB P2.1 ;置位P2.1
CLR P2.1 ;清零P2.1
JNB 4FH,DISPLAY ;判斷1秒時間是否到,沒有到,則跳轉到DIAPLAY處
CLR 4FH ;1秒到,清4FH
LJMP DISPLAY ;調用顯示子程序 JIA1:MOV TH1,#068H ;賦初值
MOV TL1,#0F0H
DJNZ 60H,TT ;60H單元自減1,判斷是否為0,不為0則跳轉到TT處
MOV 60H,#100 ;60H單元為0,則重新給其賦值100
SETB 4FH ;同時置位4FH單元
INC R3 ;R3自加1
CJNE R3,#60,TT ;判斷R3是否為60,否則跳轉TT處
MOV R3,#0 ;R3為60,則給R3賦0
TT:RETITAB: ;編碼表
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;編碼
END ;程序結束
④ 單片機查表程序編寫 急!
org 0000h
mov 30h, #1
mov 31h, #3
mov 32h, #5
mov 33h, #7
mov 34h, #9
mov 35h, #2
mov 36h, #4
mov 37h, #6
mov 38h, #8
mov 39h, #10
call SQRT
sjmp $
;查表法求平方的程序如下。
SQRT:
MOV R0, #30H
MOV R1, #40H
MOV R2, #10
LOOP:
MOV A, @R0
ADD A, #S_TAB - ($ + 4)
MOVC A, @A + PC
MOV @R1, A
INC R0
INC R1
DJNZ R2, LOOP
RET
S_TAB:
DB 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
;完
⑤ 單片機做時鍾程序
基於DS1302的日歷時鍾
#include<reg51.h> //包含單片機寄存器的頭文件
#include<intrins.h> //包含_nop_()函數定義的頭文件
/***********************************************************************
以下是DS1302晶元的操作程序
************************************************************************/
unsigned char code digit[10]={"0123456789"}; //定義字元數組顯示數字
sbit DATA=P1^1; //位定義1302晶元的介面,數據輸出端定義在P1.1引腳
sbit RST=P1^2; //位定義1302晶元的介面,復位埠定義在P1.1引腳
sbit SCLK=P1^0; //位定義1302晶元的介面,時鍾輸出埠定義在P1.1引腳
/*****************************************************
函數功能:延時若干微秒
入口參數:n
***************************************************/
void delaynus(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
;
}
/*****************************************************
函數功能:向1302寫一個位元組數據
入口參數:x
***************************************************/
void Write1302(unsigned char dat)
{
unsigned char i;
SCLK=0; //拉低SCLK,為脈沖上升沿寫入數據做好准備
delaynus(2); //稍微等待,使硬體做好准備
for(i=0;i<8;i++) //連續寫8個二進制位數據
{
DATA=dat&0x01; //取出dat的第0位數據寫入1302
delaynus(2); //稍微等待,使硬體做好准備
SCLK=1; //上升沿寫入數據
delaynus(2); //稍微等待,使硬體做好准備
SCLK=0; //重新拉低SCLK,形成脈沖
dat>>=1; //將dat的各數據位右移1位,准備寫入下一個數據位
}
}
/*****************************************************
函數功能:根據命令字,向1302寫一個位元組數據
入口參數:Cmd,儲存命令字;dat,儲存待寫的數據
***************************************************/
void WriteSet1302(unsigned char Cmd,unsigned char dat)
{
RST=0; //禁止數據傳遞
SCLK=0; //確保寫數居前SCLK被拉低
RST=1; //啟動數據傳輸
delaynus(2); //稍微等待,使硬體做好准備
Write1302(Cmd); //寫入命令字
Write1302(dat); //寫數據
SCLK=1; //將時鍾電平置於已知狀態
RST=0; //禁止數據傳遞
}
/*****************************************************
函數功能:從1302讀一個位元組數據
入口參數:x
***************************************************/
unsigned char Read1302(void)
{
unsigned char i,dat;
delaynus(2); //稍微等待,使硬體做好准備
for(i=0;i<8;i++) //連續讀8個二進制位數據
{
dat>>=1; //將dat的各數據位右移1位,因為先讀出的是位元組的最低位
if(DATA==1) //如果讀出的數據是1
dat|=0x80; //將1取出,寫在dat的最高位
SCLK=1; //將SCLK置於高電平,為下降沿讀出
delaynus(2); //稍微等待
SCLK=0; //拉低SCLK,形成脈沖下降沿
delaynus(2); //稍微等待
}
return dat; //將讀出的數據返回
}
/*****************************************************
函數功能:根據命令字,從1302讀取一個位元組數據
入口參數:Cmd
***************************************************/
unsigned char ReadSet1302(unsigned char Cmd)
{
unsigned char dat;
RST=0; //拉低RST
SCLK=0; //確保寫數居前SCLK被拉低
RST=1; //啟動數據傳輸
Write1302(Cmd); //寫入命令字
dat=Read1302(); //讀出數據
SCLK=1; //將時鍾電平置於已知狀態
RST=0; //禁止數據傳遞
return dat; //將讀出的數據返回
}
/*****************************************************
函數功能: 1302進行初始化設置
***************************************************/
void Init_DS1302(void)
{
WriteSet1302(0x8E,0x00); //根據寫狀態寄存器命令字,寫入不保護指令
WriteSet1302(0x80,((0/10)<<4|(0%10))); //根據寫秒寄存器命令字,寫入秒的初始值
WriteSet1302(0x82,((0/10)<<4|(0%10))); //根據寫分寄存器命令字,寫入分的初始值
WriteSet1302(0x84,((12/10)<<4|(12%10))); //根據寫小時寄存器命令字,寫入小時的初始值
WriteSet1302(0x86,((16/10)<<4|(16%10))); //根據寫日寄存器命令字,寫入日的初始值
WriteSet1302(0x88,((11/10)<<4|(11%10))); //根據寫月寄存器命令字,寫入月的初始值
WriteSet1302(0x8c,((8/10)<<4|(8%10))); //根據寫小時寄存器命令字,寫入小時的初始值
}
/*******************************************************************************
以下是對液晶模塊的操作程序
*******************************************************************************/
sbit RS=P2^0; //寄存器選擇位,將RS位定義為P2.0引腳
sbit RW=P2^1; //讀寫選擇位,將RW位定義為P2.1引腳
sbit E=P2^2; //使能信號位,將E位定義為P2.2引腳
sbit BF=P0^7; //忙碌標志位,,將BF位定義為P0.7引腳
/*****************************************************
函數功能:延時1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函數功能:延時若干毫秒
入口參數:n
***************************************************/
void delaynms(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*****************************************************
函數功能:判斷液晶模塊的忙碌狀態
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
bit BusyTest(void)
{
bit result;
RS=0; //根據規定,RS為低電平,RW為高電平時,可以讀狀態
RW=1;
E=1; //E=1,才允許讀寫
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
result=BF; //將忙碌標志電平賦給result
E=0; //將E恢復低電平
return result;
}
/*****************************************************
函數功能:將模式設置指令或顯示地址寫入液晶模塊
入口參數:dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
{
while(BusyTest()==1); //如果忙就等待
RS=0; //根據規定,RS和R/W同時為低電平時,可以寫入指令
RW=0;
E=0; //E置低電平(根據表8-6,寫指令時,E為高脈沖,
// 就是讓E從0到1發生正跳變,所以應先置"0"
_nop_();
_nop_(); //空操作兩個機器周期,給硬體反應時間
P0=dictate; //將數據送入P0口,即寫入指令或地址
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=1; //E置高電平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=0; //當E由高電平跳變成低電平時,液晶模塊開始執行命令
}
/*****************************************************
函數功能:指定字元顯示的實際地址
入口參數:x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80); //顯示位置的確定方法規定為"80H+地址碼x"
}
/*****************************************************
函數功能:將數據(字元的標准ASCII碼)寫入液晶模塊
入口參數:y(為字元常量)
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS為高電平,RW為低電平時,可以寫入數據
RW=0;
E=0; //E置低電平(根據表8-6,寫指令時,E為高脈沖,
// 就是讓E從0到1發生正跳變,所以應先置"0"
P0=y; //將數據送入P0口,即將數據寫入液晶模塊
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=1; //E置高電平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=0; //當E由高電平跳變成低電平時,液晶模塊開始執行命令
}
/*****************************************************
函數功能:對LCD的顯示模式進行初始化設置
***************************************************/
void LcdInitiate(void)
{
delaynms(15); //延時15ms,首次寫指令時應給LCD一段較長的反應時間
WriteInstruction(0x38); //顯示模式設置:16×2顯示,5×7點陣,8位數據介面
delaynms(5); //延時5ms,給硬體一點反應時間
WriteInstruction(0x38);
delaynms(5); //延時5ms,給硬體一點反應時間
WriteInstruction(0x38); //連續三次,確保初始化成功
delaynms(5); //延時5ms,給硬體一點反應時間
WriteInstruction(0x0c); //顯示模式設置:顯示開,無游標,游標不閃爍
delaynms(5); //延時5ms,給硬體一點反應時間
WriteInstruction(0x06); //顯示模式設置:游標右移,字元不移
delaynms(5); //延時5ms,給硬體一點反應時間
WriteInstruction(0x01); //清屏幕指令,將以前的顯示內容清除
delaynms(5); //延時5ms,給硬體一點反應時間
}
/**************************************************************
以下是1302數據的顯示程序
**************************************************************/
/*****************************************************
函數功能:顯示秒
入口參數:x
***************************************************/
void DisplaySecond(unsigned char x)
{
unsigned char i,j; //j,k,l分別儲存溫度的百位、十位和個位
i=x/10;//取十位
j=x%10;//取個位
WriteAddress(0x49); //寫顯示地址,將在第2行第7列開始顯示
WriteData(digit[i]); //將百位數字的字元常量寫入LCD
WriteData(digit[j]); //將十位數字的字元常量寫入LCD
delaynms(50); //延時1ms給硬體一點反應時間
}
/*****************************************************
函數功能:顯示分鍾
入口參數:x
***************************************************/
void DisplayMinute(unsigned char x)
{
unsigned char i,j; //j,k,l分別儲存溫度的百位、十位和個位
i=x/10;//取十位
j=x%10;//取個位
WriteAddress(0x46); //寫顯示地址,將在第2行第7列開始顯示
WriteData(digit[i]); //將百位數字的字元常量寫入LCD
WriteData(digit[j]); //將十位數字的字元常量寫入LCD
delaynms(50); //延時1ms給硬體一點反應時間
}
/*****************************************************
函數功能:顯示小時
入口參數:x
***************************************************/
void DisplayHour(unsigned char x)
{
unsigned char i,j; //j,k,l分別儲存溫度的百位、十位和個位
i=x/10;//取十位
j=x%10;//取個位
WriteAddress(0x43); //寫顯示地址,將在第2行第7列開始顯示
WriteData(digit[i]); //將百位數字的字元常量寫入LCD
WriteData(digit[j]); //將十位數字的字元常量寫入LCD
delaynms(50); //延時1ms給硬體一點反應時間
}
/*****************************************************
函數功能:顯示日
入口參數:x
***************************************************/
void DisplayDay(unsigned char x)
{
unsigned char i,j; //j,k,l分別儲存溫度的百位、十位和個位
i=x/10;//取十位
j=x%10;//取個位
WriteAddress(0x0c); //寫顯示地址,將在第2行第7列開始顯示
WriteData(digit[i]); //將百位數字的字元常量寫入LCD
WriteData(digit[j]); //將十位數字的字元常量寫入LCD
delaynms(50); //延時1ms給硬體一點反應時間
}
/*****************************************************
函數功能:顯示月
入口參數:x
***************************************************/
void DisplayMonth(unsigned char x)
{
unsigned char i,j; //j,k,l分別儲存溫度的百位、十位和個位
i=x/10;//取十位
j=x%10;//取個位
WriteAddress(0x09); //寫顯示地址,將在第2行第7列開始顯示
WriteData(digit[i]); //將百位數字的字元常量寫入LCD
WriteData(digit[j]); //將十位數字的字元常量寫入LCD
delaynms(50); //延時1ms給硬體一點反應時間
}
/*****************************************************
函數功能:顯示年
入口參數:x
***************************************************/
void DisplayYear(unsigned char x)
{
unsigned char i,j; //j,k,l分別儲存溫度的百位、十位和個位
i=x/10;//取十位
j=x%10;//取個位
WriteAddress(0x06); //寫顯示地址,將在第2行第7列開始顯示
WriteData(digit[i]); //將百位數字的字元常量寫入LCD
WriteData(digit[j]); //將十位數字的字元常量寫入LCD
delaynms(50); //延時1ms給硬體一點反應時間
}
/*****************************************************
函數功能:主函數
***************************************************/
void main(void)
{
unsigned char second,minute,hour,day,month,year; //分別儲存苗、分、小時,日,月,年
unsigned char ReadValue; //儲存從1302讀取的數據
LcdInitiate(); //將液晶初始化
WriteAddress(0x01); //寫Date的顯示地址,將在第1行第2列開始顯示
WriteData('D'); //將字元常量寫入LCD
WriteData('a'); //將字元常量寫入LCD
WriteData('t'); //將字元常量寫入LCD
WriteData('e'); //將字元常量寫入LCD
WriteData(':'); //將字元常量寫入LCD
WriteAddress(0x08); //寫年月分隔符的顯示地址, 顯示在第1行第9列
WriteData('-'); //將字元常量寫入LCD
WriteAddress(0x0b); //寫月日分隔符的顯示地址, 顯示在第1行第12列
WriteData('-'); //將字元常量寫入LCD
WriteAddress(0x45); //寫小時與分鍾分隔符的顯示地址, 顯示在第2行第6列
WriteData(':'); //將字元常量寫入LCD
WriteAddress(0x48); //寫分鍾與秒分隔符的顯示地址, 顯示在第2行第9列
WriteData(':'); //將字元常量寫入LCD
Init_DS1302(); //將1302初始化
while(1)
{
ReadValue = ReadSet1302(0x81); //從秒寄存器讀數據
second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//將讀出數據轉化
DisplaySecond(second); //顯示秒
ReadValue = ReadSet1302(0x83); //從分寄存器讀
minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //將讀出數據轉化
DisplayMinute(minute); //顯示分
ReadValue = ReadSet1302(0x85); //從分寄存器讀
hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //將讀出數據轉化
DisplayHour(hour); //顯示小時
ReadValue = ReadSet1302(0x87); //從分寄存器讀
day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //將讀出數據轉化
DisplayDay(day); //顯示日
ReadValue = ReadSet1302(0x89); //從分寄存器讀
month=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //將讀出數據轉化
DisplayMonth(month); //顯示月
ReadValue = ReadSet1302(0x8d); //從分寄存器讀
year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //將讀出數據轉化
DisplayYear(year); //顯示年
}
}
改改 就是你的了
⑥ 單片機 查表程序設計
LTB2:
;-------------------下面是R2R3乘以2
MOV A, R3
CLR C
RLC A
MOV R3, A
XCH A, R2
RLC A
XCH R2, A
;------------------下面是表首地址加上R2R3
MOV DPTR, #TAB2
ADD A, DPL ;(R2R3)+(DPTR)→(DPTR)
MOV DPL, A
MOV A, DPH
ADDC A, R2
MOV DPH, A
;------------------下面是查表,查出兩個位元組
CLR A
MOVC A, @A + DPTR
MOV R2,A
CLR A
INC DPTR
MOVC A, @A + DPTR
MOV R3,A
RET
----
這個程序,是根據兩個位元組的數據來查表,查出的,也是兩個位元組。
如果先弄懂了一個位元組的查表程序,看這個程序,也就沒有什麼難的了。
⑦ 單片機製作交流電壓表程序如何進行處理(匯編)
整流橋整流後濾波、再進行分壓、送入ADC0808、再由AT89C51處理調整
,和碰調整時鍵橘是否稿棚團要除根號2?
-----------------------------
如果分壓做得合適,AT89C51就沒有必要進行根號2的計算。
⑧ 單片機查表程序
// 希望能達到你的要求
ORG 0000H
LJMP MAIN
ORG 0003H
ORG 0030H
MAIN:
MOV SP,#30H ; 設置堆棧
MOV R2,#41H ;A的ASCII碼
MOV R3,#50H ;循環50次
MOV DPTR,#2000H ;表首地址
MOV A,#00H
GOTO:
PUSH ACC
MOVC A,@A+DPTR
XRL A,R2
JZ CONTROL ;如果是41H 則跳出保存
DJNZ R3,GOTO2 ;是否尋到了50H個地址 尋到了則退出(這時無有效的結果保存)_
LJMP EXIT
GOTO2:
POP ACC
INC A
AJMP GOTO
CONTROL:
POP ACC ;彈出A 即低位地址
MOV R1,A
MOV DPTR,#2051H
MOVX @DPTR,A ; 存放低位地址
INC DPTR
MOV A,#20H
MOVX @DPTR,A ; 存放高位地址
EXIT:
END
⑨ 求一個簡單的單片機時鍾程序
#include<reg51.h>
#defineucharunsignedchar
ucharcodeledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9
unsignedcharsec=0,min=0,hour=0,scanled;
unsignedcharkey,time;
unsignedchardisdat[6];
sbitK=P1^0;
voiddischg()
{
disdat[0]=sec%10;
disdat[1]=sec/10;
disdat[2]=min%10;
disdat[3]=min/10;
disdat[4]=hour%10;
disdat[5]=hour/10;
}
voidt0isr()interrupt1 //秒計時
{
TR0=0;
TH0=0x3c;
TL0=0xb0;
TR0=1;
time++;
if(time==20)
{
time=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59)
{
min=0;
hour++;
if(hour>23)hour=0;
}
}
}
dischg();
}
voidt1isr()interrupt3 //顯示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case0:
P2=0x01;
P0=~ledtab[disdat[5]];
break;
case1:
P2=0x02;
P0=~ledtab[disdat[4]]&0x7f;
break;
case2:
P2=0x04;
P0=~ledtab[disdat[3]];
break;
case3:
P2=0x08;
P0=~ledtab[disdat[2]]&0x7f;
break;
case4:
P2=0x10;
P0=~ledtab[disdat[1]];
break;
case5:
P2=0x20;
P0=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=6;
}
main()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=0xec;
TL1=0x78;
EA=1;
TR1=1;
ET0=1;
ET1=1;
sec=0;
min=0;
hour=0;
scanled=0;
time=0;
key=0;
dischg();
while(1)
{
if(K==0)
{
while(K==0);
key++;
key%=2;
}
switch(key)
{
case0:
TR0=1;
break;
case1:
TR0=0;
break;
}
}
}
⑩ 單片機秒錶計時器c語言程序圖 需要圖和程序
#include<reg51.h> // 時鍾與秒錶
#define uchar unsigned char
#define uint unsigned int
sbit qingling=P1^0; //清零
sbit tiaofen=P1^1; //調分
sbit tiaoshi=P1^2; //調時
sbit sounder=P1^7; //naozhong
uint a,b;
uchar hour,minu,sec, //時鍾
hour0,minu0,sec0, //秒錶
hour1,minu1,sec1;
h1,h2,m1,m2,s1,s2, //顯示位
k,s; //狀態轉換標志
uchar code select[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*****************函數聲明***********************/
void keyscan();
void init();
void delay(uchar z);
void display(uchar,uchar,uchar);
void sounde();
/*****************主函數*************************/
void main()
{
init();
while(1)
{
while(TR1)
{
keyscan(); // 掃描函數
while(s==1) // s是狀態標志,當s=0時,鬧鍾取消。s=1時,設定鬧鍾時間
//(也是通過調時,調分函數);
{ //s=2時,鬧鍾工作,時間與設定時刻一致時,鬧鍾響
// (一分鍾後自動關閉,可手動關閉)。再次切換,s=0.
keyscan(); //s狀態切換(0-》1-》2-》0)通過外部中斷1實現。
display(hour1,minu1,sec1); //鬧鍾時刻顯示
}
display(hour0,minu0,sec0);//時鍾表顯示
while(k) /*k是秒錶狀態(0-》1-》2-》0)通過外部中斷0實現。
0秒錶關;1秒錶從零計時;2秒錶停,顯示計時時間*/
{
display(hour,minu,sec); //秒錶顯示
}
}
}
}
/*****************初始化函數***********************/
void init()
{
a=0;
b=0;
k=0;
s=0;
hour0=0;
minu0=0;
sec0=0;
hour=0;
minu=0;
sec=0;
hour1=0;
minu1=0;
sec1=0;
TMOD=0x11; //定時器0,1工作於方式1;賦初值
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
EX0=1; //秒錶中斷
EX1=1; //鬧鍾設定中斷
ET0=1;
ET1=1;
IT0=1; //邊沿觸發方式
IT1=1;
PX0=1;
PX1=1;
TR0=0; //初始,秒錶不工作
TR1=1; //時鍾一開始工作
}
/*****************定時器0中斷*************/
void timer0_int() interrupt 1 //秒錶
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
a++;
if(a==2)
{
a=0;
sec++;
if(sec==100)
{
sec=0; //毫秒級
minu++;
if(minu==60)
{
minu=0; //秒
hour++;
if(hour==60) //分
{
hour=0;
}
}
}
}
}
/*************外部中斷0中斷函數************/
void ex0_int() interrupt 0
{
k++;
if(k==3)
k=0;
if(k==1)
{
TR0=~TR0;
if(TR0==1)
{
hour=0;
minu=0;
sec=0;
}
}
if(k==2)
{
TR0=~TR0;
}
}
/*************外部中斷1中斷函數************/
void ex1_int() interrupt 2
{
s++;
if(s==3)
s=0;
}
/*************定時器1中斷****************/
void timer1_int() interrupt 3 //控制時鍾工作
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(s==2)
{
if(hour1==hour0 && minu0==minu1)
sounde();
}
b++;
if(b==20)
{
b=0;
sec0++;
if(sec0==60)
{
sec0=0;
minu0++;
if(minu0==60)
{
minu0=0;
hour0++;
if(hour0==24)
hour0=0;
}
}
}
}
/*************鍵盤掃描****************/
void keyscan()
{
if(s==1)
{
if(qingling==0)
{
delay(10);
if(qingling==0)
{
sec1=0;
minu1=0;
hour1=0;
}
}
if(tiaofen==0)
{
delay(10);
if(tiaofen==0)
{
minu1++;
if(minu1==60)
{
minu1=0;
}
while(!tiaofen);
}
}
if(tiaoshi==0)
{
hour1++;
if(hour1==24)
{
hour1=0;
}
while(!tiaoshi);
}
}
else //調整時鍾時間
{
if(qingling==0)
{
delay(10);
if(qingling==0)
{
sec0=0;
minu0=0;
hour0=0;
}
}
if(tiaofen==0)
{
delay(10);
if(tiaofen==0)
{
minu0++;
if(minu0==60)
{
minu0=0;
}
while(!tiaofen);
}
}
if(tiaoshi==0)
{
hour0++;
if(hour0==24)
{
hour0=0;
}
while(!tiaoshi);
}
}
}
/*************顯示函數****************/
void display(uchar hour,uchar minu,uchar sec)
{
h1=hour/10;
h2=hour%10;
m1=minu/10;
m2=minu%10;
s1=sec/10;
s2=sec%10;
P0=0xff;
P2=table[h1];
P0=select[7];
delay(5);
P0=0xff;
P2=table[h2];
P0=select[6];
delay(5);
P0=0xff;
P2=0x40;;
P0=select[5];
delay(5);
P0=0xff;
P2=table[m1];
P0=select[4];
delay(5);
P0=0xff;
P2=table[m2];
P0=select[3];
delay(5);
P0=0xff;
P2=0x40;
P0=select[2];
delay(5);
P0=0xff;
P2=table[s1];
P0=select[1];
delay(5);
P0=0xff;
P2=table[s2];
P0=select[0];
delay(5);
}
/*************鬧鍾函數****************/
void sounde()
{
sounder=~sounder;
}
/*************延時函數****************/
void delay(uchar z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}