1、CMS16C56B是什麼
是單片機。
2、單片機如何用一個定時器為時基,作出幾十個定時精度為1毫秒的?
是不是要這樣的效果
typedef struct {
int time_count;
char flag;
}timer_t;
timer_t timer1={10, false},timer2={100, false};
timer_interrupt()//將其初始化成1ms,或者其它最小時間粒度
{
if(timer1.time_count == 0){
timer1.flag = true;
timer1.time_count= 10;
} else{timer1.time_count--; }
if(timer2.time_count == 0){
timer2.flag = true;
timer2.time_count= 100;
}else{timer2.time_count--; }
}
void main(void)
{
while(1){
if(timer1.flag == true){
timer1.flag == false;
do something;
}
if(timer2.flag == true){
timer2.flag == false;
do something others;
}
}
}
3、DECMS在松翰單片機中表示什麼意思
自減,若為零,跳過下一條。
DECMS _TIME1
JMP NOTTIME
NOP ;time1=0
..
..
NOTTIME:
4、關於一個單片機匯編指令的問題
這個JMP $-2是跳到哪個位置?是DECMS 0x00 還是NOP呢?
----
是跳到:DECMS 0x00 的位置。
5、求一個51單片機數碼管實現電子鍾的程序,最好能帶寫了一天錯誤越寫越多心態已經炸了,求大神幫我T.T
;--------------------------------------------------------------
;-------------------簡易秒錶的製作----------------------------
;--------------------------------------------------------------
BANK0_REG EQU 00H ;選擇第0組寄存器
BANK1_REG EQU 08H ;選擇第1組寄存器
BANK2_REG EQU 10H ;選擇第2組寄存器
BANK3_REG EQU 18H ;選擇第3組寄存器
LED_MAX_BITS EQU 06H ;LED最大位數
LED_SCL EQU P1.0
LED_SDA EQU P1.1
HD_K0 EQU P1.2
HD_K1 EQU P1.3
HD_K2 EQU P1.4
HD_CBP EQU P1.5
K0_FLAG EQU 00H
K1_FLAG EQU 01H
K2_FLAG EQU 02H
SEC_FLAG EQU 03H ;定義各標識位符號地址
MIN_FLAG EQU 04H
HOUR_FLAG EQU 05H
RMIN_FLAG EQU 06H
RHOUR_FLAG EQU 07H
RTIM_FLAG EQU 08H
ARM_FLAG EQU 09H ;是否設定鬧鍾標識
TIMDATA EQU 30H ;時鍾修改記憶單元
RTIMDATA EQU 31H ;鬧鍾修改記憶單元清零
MSEC1 EQU 32H
MSEC2 EQU 33H
HOUR EQU 34H
MIN EQU 35H
SEC EQU 36H
RHOUR EQU 37H
RMIN EQU 38H
RSEC EQU 39H
COUNT EQU 3AH
LED_DIS_PTR EQU 3BH
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TIMER_INT ;定時器中斷服務程序
ORG 0100H
MAIN:
CLR EA
MOV PSW,#BANK0_REG
MOV SP,#0DFH
MOV R0,#20H
MOV R7,#80H-20H
LCALL PUB_CLEAR_RAM1 ;清0RAM單元
LCALL LED_CLR
MOV LED_DIS_PTR,#HOUR
LCALL LED_DISP_DATA
MOV TMOD,#02H ;定時器T0方式2,
MOV TL0,#06H ;定時250us初始值
MOV TH0,#06H
SETB EA ;中斷允許
SETB ET0
SETB TR0 ;啟動定時器
BEGIN:
LCALL KEY_TEST ;調用判別鍵入測試程序
JC RETEST ;有鍵輸入則轉去抖程序
JNB ARM_FLAG,BEGIN ;判別鬧鍾設定標識位,未設定則返回
LCALL ALARM ;調鬧鍾程序
LJMP BEGIN ;返回
RETEST:
LCALL KEY_SCAN
JB K0_FLAG,PRO_K0 ; 判別是否時鍾修改功能鍵
JB K1_FLAG,PRO_K1 ; 判別是否鬧鍾修改功能鍵
JB K2_FLAG,PRO_K2 ; 判別是否加1功能鍵
SJMP BEGIN
PRO_K0:
LCALL FTION0 ; 是時鍾參數修改功能鍵則調用時鍾修改程序
SJMP BEGIN
PRO_K1:
LCALL FTION1 ; 是鬧鍾參數修改功能鍵則調用鬧鍾設定程序
SJMP BEGIN
PRO_K2:
LCALL CUM ; 是加1功能鍵則調用加1修改程序
SJMP BEGIN
;--------------------------------------------------
;時鍾參數修改子程序FTION0
;功能:根據時鍾修改功能鍵按下的次數
;分別將時鍾修改標識位SECBIT, MIN_FLAG,HOURBIT置1
;入口:TIMDAT
;出口:TIMDAT
;--------------------------------------------------
FTION0:
JB RMIN_FLAG,BACK_B
JB RHOUR_FLAG,BACK_B ;當正在設置鬧鍾不能設置時間,需先結束鬧鍾設置狀態
CLR TR0 ;關定時器
CLR SEC_FLAG ;時鍾秒標識位清零
CLR MIN_FLAG ;時鍾分標識位清零
CLR HOUR_FLAG ;時鍾小時標識位清零
MOV LED_DIS_PTR,#HOUR ;將時鍾小時單元設為顯示首地址
MOV RTIMDATA,#00H ;清鬧鍾修改位置標識記錄
INC TIMDATA ;將時鍾修改記錄值加1
MOV A,TIMDATA
CJNE A,#01H,TW0 ;若記錄值為1則將時鍾秒修改標識置1
SETB SEC_FLAG ;時鍾秒標識位置1
SJMP BACK_C
TW0:
CJNE A,#02H,THREE0 ;若記錄值為2則將時鍾分修改標識置1
SETB MIN_FLAG ;時鍾分標識位置1
SJMP BACK_C
THREE0:
CJNE A,#03H,BACK_A ;若記錄值為3則將時鍾小時修改標識置1
SETB HOUR_FLAG ;時鍾小時標識位置1
SJMP BACK_C
BACK_A:
MOV TIMDATA,#00H ;若按4次則清時鍾單元修改位置記錄
SETB TR0 ;定時器重新啟動
BACK_B:
RET
BACK_C:
LCALL LED_DISP_DATA
RET
;--------------------------------------------------
;鬧鍾參數修改功能鍵設定子程序FTION1
;功能:根據鬧鍾修改功能鍵按下的次數
;分別將鬧鍾修改標識位RMINBIT ,RHOURBIT置1
;入口:RTIMDAT
;出口:RTIMDAT,ARM_FLAG,B
;--------------------------------------------------
FTION1:
JB SEC_FLAG,FTION1_A
JB MIN_FLAG,FTION1_A
JB HOUR_FLAG,FTION1_A ;當處於設置時間狀態時不能設置鬧鍾,需先結束時間設置狀態
CLR RMIN_FLAG ;將鬧鍾分單元修改標識位
CLR RHOUR_FLAG ;將鬧鍾小時單元修改標識位清零
MOV LED_DIS_PTR,#RHOUR ;將鬧鍾單元地址設為顯示首地址
MOV TIMDATA,#00H
INC RTIMDATA ;將鬧鍾修改記錄值加1
MOV A,RTIMDATA
CJNE A,#01H,TOW1
SETB RMIN_FLAG ;若記錄值為1則將鬧鍾分單元修改標識位
LJMP FTION1_B ;置1
TOW1:
CJNE A,#02H,THREE1
SETB RHOUR_FLAG ; 若記錄值為2,將鬧鍾小時單元修改標識位置1
LJMP FTION1_B
THREE1:
SETB ARM_FLAG ;F0標識位為1表示鬧鍾已設定
MOV LED_DIS_PTR,#HOUR ;恢復時鍾顯示單元首地址
MOV RTIMDATA,#00H ;將鬧鍾修改記錄值清零
FTION1_A:
RET
FTION1_B:
LCALL LED_DISP_DATA
RET
;---------------------------------------------------------------
;加1鍵修改子程序CUM
;功能:根據時鍾和鬧鍾修改標識位的狀態,將時鍾或鬧鍾對應RAM內容+1
;入口:SEC_FLAG, MIN_FLAG ,HOUR_FLAG,RSECBIT, RMIN_FLAG ,RHOUR_FLAG
;---------------------------------------------------------------
CUM:
JNB SEC_FLAG,CUM0 ;若時鍾秒修改標識位為1則秒單元內
MOV A,SEC ;容加1
ADD A,#01H
DA A
MOV SEC,A
CJNE A,#60H,CUMEND
MOV SEC,#00H
LJMP CUMEND
CUM0:
JNB MIN_FLAG,CUM1 ;若時鍾分修改標識位為1,則分單元
MOV A,MIN ;內容加1
ADD A,#01H
DA A
MOV MIN,A
CJNE A,#60H,CUMEND
MOV MIN,#00H
LJMP CUMEND
CUM1:
JNB HOUR_FLAG,CUM2 ;若時鍾小時修改標識位為1,則小時
MOV A,HOUR ;單元內容加1
ADD A,#01H
DA A
MOV HOUR,A
CJNE A,#24H,CUMEND
MOV HOUR,#00H
LJMP CUMEND
CUM2:
JNB RMIN_FLAG,CUM3 ;若鬧鍾分修改標識位為1,則分單元
MOV A,RMIN ;內容加1
ADD A,#01H
DA A
MOV RMIN,A
CJNE A,#60H,CUMEND
MOV RMIN,#00H
LJMP CUMEND
CUM3:
JNB RHOUR_FLAG,CUMEND ;若鬧鍾小時修改標識位為1,則小
MOV A,RHOUR ;時單元內容加1
ADD A,#01H
DA A
MOV RHOUR,A
CJNE A,#24H,CUMEND
MOV RHOUR,#00H
CUMEND:
LCALL LED_DISP_DATA
RET
;--------------------------------------------------
;鬧鍾判斷與啟動子程序ALARM
;功能:判斷鬧鍾是否設定,控制鬧鍾的啟,停
;入口:MIN ,RMIN ,HOUR ,RHOUR
;出口:HD_BP,ARM_FLAG
;--------------------------------------------------
ALARM:
MOV A,RMIN
CJNE A,MIN,DONT0 ;比較分單元內容,若相同則繼續比較小時單
MOV A,RHOUR ;元內容,否則返回
CJNE A,HOUR,DONT0
CLR HD_CBP ;啟動鬧鍾
SETB RTIM_FLAG ;設置鬧鍾計時標時,時鍾開始10秒計時
DONT0:
MOV A,COUNT ;取鬧鍾保持計時時間
CJNE A,#10,DONT ;判斷鬧鍾保持10秒時間到否
MOV COUNT,#00H ;清除鬧鍾保持10秒計時
SETB HD_CBP ;清除鬧鍾
CLR ARM_FLAG ;清鬧鍾標識,取消鬧鍾設置
CLR RTIM_FLAG ;清鬧鍾計時標識,
DONT:
RET
;--------------------------------------------------
;時鍾修正中斷服務子程序
;功能:通過定時器中斷,自動修改時鍾參數
;入口:MSEC1 ,MSEC2,,SEC,MIN,HOUR
;出口:MSEC1 ,MSEC2,,SEC,MIN,HOUR
;--------------------------------------------------
TIMER_INT:
CLR EA ; 關中斷
PUSH PSW ; 保護現場
PUSH ACC
MOV PSW,#BANK3_REG
INC MSEC1
MOV A,MSEC1
CJNE A,#28H,TIMER_INT_EXIT ;到10毫秒否
MOV MSEC1,#00H
INC MSEC2
MOV A,MSEC2
CJNE A,#64H,TIMER_INT_EXIT ;到1秒否
MOV MSEC2,#00H
JNB RTIM_FLAG,TIMER_INT_A ;由標識位判別鬧鍾啟動否
INC COUNT
TIMER_INT_A:
MOV A,SEC
ADD A,#01H ;時鍾秒單元內容加1
DA A
MOV SEC,A
CJNE A,#60H,TIMER_INT_B ;到1分鍾否
MOV SEC,#00H
MOV A,MIN
ADD A,#01H ;分單元內容加1
DA A
MOV MIN,A
CJNE A,#60H,TIMER_INT_B ;到1小時否
MOV MIN,#00H
MOV A,HOUR
ADD A,#01H ;小時單元內容加1
DA A
MOV HOUR,A
CJNE A,#24H,TIMER_INT_B ;到24小時否
MOV HOUR,#00H
TIMER_INT_B:
LCALL LED_DISP_DATA
TIMER_INT_EXIT:
POP ACC ;恢復現場
POP PSW
SETB EA ;開中斷
RETI ;中斷返回
;--------------------------------------------------
;測鍵入子程序
;功能:判斷是否有鍵輸入
;入口:按鍵
;出口:A
;--------------------------------------------------
KEY_TEST:
JNB P1.2,KEY_TEST_OK
JNB P1.3,KEY_TEST_OK
JNB P1.4,KEY_TEST_OK
CLR C
RET
KEY_TEST_OK:
SETB C
RET
;--------------------------------------------------
;鍵盤掃描程序
;--------------------------------------------------
KEY_SCAN:
CLR K0_FLAG
CLR K1_FLAG
CLR K2_FLAG
JNB P1.2,KEY_SCAN_K0
JNB P1.3,KEY_SCAN_K1
JNB P1.4,KEY_SCAN_K2
SJMP KEY_SCAN_END
KEY_SCAN_K0:
SETB K0_FLAG
JNB P1.2,$
SJMP KEY_SCAN_END
KEY_SCAN_K1:
SETB K1_FLAG
JNB P1.3,$
SJMP KEY_SCAN_END
KEY_SCAN_K2:
SETB K2_FLAG
JNB P1.4,$
SJMP KEY_SCAN_END
KEY_SCAN_END:
RET
;--------------------------------
;發送一位元組數據
;入口:ACC
;--------------------------------
LED_DISP_BYTE:
PUSH ACC
CLR LED_SCL
MOV R7,#8
LED_DISP_BYTE1:
RLC A
MOV LED_SDA,C
NOP
NOP
SETB LED_SCL
NOP
NOP
CLR LED_SCL
DJNZ R7,LED_DISP_BYTE1
POP ACC
RET
;-----------------------------------
;發送LED_MAX_BIT位元組
;入口:LED_DIS_PTR:起始地址
;-----------------------------------
LED_DISP_DATA:
PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
MOV PSW,#BANK2_REG
MOV A,LED_DIS_PTR
ADD A,#LED_MAX_BITS/2-1
MOV R0,A
MOV R6,#3
MOV DPTR,#DIS_TAB
LED_DISP_DATA_A:
MOV A,@R0
ANL A,#0FH
MOVC A,@A+DPTR
CJNE R6,#3,LED_DISP_DATA_B ;是在顯示秒嗎
JNB SEC_FLAG,LED_DISP_DATA_D
ANL A,#07FH ;設置顯示小數點 指示操作位置
SJMP LED_DISP_DATA_D
LED_DISP_DATA_B:
CJNE R6,#2,LED_DISP_DATA_C ;是在顯示分嗎
ANL A,#07FH
JB MIN_FLAG,LED_DISP_DATA_D
JB RMIN_FLAG,LED_DISP_DATA_D
ORL A,#80H
SJMP LED_DISP_DATA_D
LED_DISP_DATA_C:
ANL A,#07FH
JB HOUR_FLAG,LED_DISP_DATA_D
JB RHOUR_FLAG,LED_DISP_DATA_D
ORL A,#80H
LED_DISP_DATA_D:
LCALL LED_DISP_BYTE
MOV A,@R0
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
LCALL LED_DISP_BYTE
DEC R0
DJNZ R6,LED_DISP_DATA_A
POP DPL
POP DPH
POP ACC
POP PSW
RET
;------------------------------------
;清除LED上的顯示內容
;------------------------------------
LED_CLR:
PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
MOV PSW,#BANK2_REG
MOV R6,#6
LED_CLR_A:
MOV A,#0FFH
LCALL LED_DISP_BYTE
DJNZ R6,LED_CLR_A
POP DPL
POP DPH
POP ACC
POP PSW
RET
;----------------------------------------------------------------------
DIS_TAB: ;字形表
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH ;共陽極LED
NOP9:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
;------------------------------------
;清除指定的RAM單元
;入口: R0:源地址 R7:長度
;------------------------------------
PUB_CLEAR_RAM1:
CJNE R7,#0,PUB_CLEAR_RAM1_1
SJMP PUB_CLEAR_RAM1_E
PUB_CLEAR_RAM1_1:
MOV @R0,#0
INC R0
DJNZ R7,PUB_CLEAR_RAM1_1
PUB_CLEAR_RAM1_E:
RET
END
6、使用CMS66P23單片機的電磁爐是假九陽電磁爐,主要想搞清楚為什麼正牌電磁爐不使用該單片機
您好,很高興為您解答。
非常抱歉,九陽電磁爐是有使用單片機程序的,建議您到當地九陽售後服務部,讓工作人員幫您檢查一下機器真偽:http://kf.joyoung.com/netService.html這里可以查詢全國服務部的聯系方式,您可以就近選擇。 高仿的九陽,肉眼看不出來的,只能拿去售後拆機驗證,因為每個機器都有識別碼和一些生產相關的數據,可以辨別真偽。但也有不少做工質量差的仿貨,特別是那些賣的特別便宜的,和正品看起來都有很大工藝差別。
如仍有疑問,歡迎向九陽陽光服務提問。
7、單片機與VB的通信
Private Sub Form_Load()
MSComm1.Settings = "9600,n,8,1" ' 設置波特率和字元發送格式
MSComm1.CommPort = 1 ' 設置通信串口
MSComm1.InputLen = 0 ' 設置或返回一次從接收緩沖區中讀取位元組數,0表示一次讀取所有數據
MSComm1.InBufferSize = 1024 ' 設置接收緩沖區1024Byte
MSComm1.InBufferCount = 0 ' 返回接收緩沖區內的等待讀取的位元組個數,可通過設置該屬性為0來清除接收緩沖區。
MSComm1.OutBufferSize = 1024 ' 設置發送緩沖區1024Byte
MSComm1.OutBufferCount = 0 ' 返回發送緩沖區內等待發送的字元數,可用來清空緩沖區。
MSComm1.RThreshold = 1 ' 每個字元到接收緩沖區都觸發接收事件
MSComm1.SThreshold = 1
MSComm1.PortOpen = True '打開串口
End Sub
『接收
Private Sub MSComm1_OnComm()
Dim rec As String
Select Case MSComm1.CommEvent
Case comEvRecive
rec = MSComm1.Input
Text1.Text = rec
MSComm1.InBufferCount = 0
End Sub
8、STM8的初始化裡面 while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSE)這個什麼意思
首先,你要明白STM8的驅動時鍾可以採用外部晶振,也可採用STM8內部的RC振盪器,二者只能選其一。 三個語句中的HSI表明是採用內部RC振盪器。
你先看STM8內部的時鍾樹結構:

其中HSI RC 16MHz就是其內部含有的RC振盪器,是ST晶元在出廠前就經過校正的但有一定誤差的振盪器。時鍾經過HSIDIV[1:0]這個分頻器,可以獲得16MHz、8MHz、4MHz、2MHz的輸出tHsiDIV,該輸出經過Master Clock Switch(通過配置來選擇外部晶振還是內部晶振)後,再分配到CPU時鍾和外圍設備時鍾。
因此,STM8可以運行的時鍾頻率最大可以達到16MHz,你也可以讓它低於這個頻率運行(有利於低功耗設計)。搞清楚了以上幾點,可以知道第一句是配置STM8,讓它知道用內部RC振盪器,不要用外部晶振,這樣省了一個晶振的錢[成本降低了嘛:)],第二句是讓內部振盪器的輸出進行8分頻,你也可以讓它1分頻、2分頻、4分頻,但不能3分頻、5分頻,因為它內部只設計了這幾種分頻,況且奇數分頻很難實現,你學過數字電路就應該知道。然後第三句話你要看一下庫函數的定義
CLK_Source_TypeDef CLK_GetSYSCLKSource(void)
{
return((CLK_Source_TypeDef)CLK->CMSR);
}
意思是返回寄存器CMSR的值,這個你就要參考一下《STM8S中文參考手冊》了,裡面搜索CMSR這個詞,我的是在第54頁,

看到了嗎?它是表明時鍾准備好了沒有的狀態標志,就像你去叫別人辦事,別人要經過考慮,這就需要等待,同理,你在STM8S內部配置好了時鍾後,內部需要產生一定的延遲,而且受各種狀況的影響,比如外部供電電壓變化、引腳干擾等,有可能導致配置時鍾失敗,這就要經過查詢這個寄存器的值來看是否配置好時鍾沒有,如果這個寄存器不等於0,則配置成功,否則失敗。第三句的while里的意思就是不斷地取CMSR的值,看是否等於宏定義CLK_SOURCE_HSI(OXE1),如果相等了,則跳過循環,繼續執行以後的語句。
9、CMS69F23B用什麼可讀寫
中微公司的單片機。專用的燒寫器。
10、單片機工作為什麼加晶振
晶振是給單片機提供工作信號脈沖的.這個脈沖就是單片機的工作速度.比如 12M晶振.單片機工作速度就是每秒 12M.單片機內部也有晶振,接外部晶振可以或得更穩定的頻率。因為晶振與單片機的腳XTAL0和腳XTAL1構成的振盪電路中會產生偕波(也就是不希望存在的其他頻率的波),這個波對電路的影響不大,但會降低電路的時鍾振盪器的穩定性.
為了電路的穩定性起見,ATMEL公司只是建議在晶振的兩引腳處接入兩個10pf-50pf的瓷片電容接地來削減偕波對電路的穩定性的影響,所以晶振所配的電容在10pf-50pf之間都可以的。