STC89C52单片机C程序求解(有完整程序)

2024-11-07 11:39:00
推荐回答(4个)
回答1:

我给你解释一下吧 希望帮得上你

#include // 头文件

#define uint unsigned int //宏定义 把uint 等价为 unsigned int
#define uchar unsigned char

sbit CS = P2^0; //定义三个特殊功能位, 我感觉应该是驱动一个东西吧,CS
sbit CLK = P2^1; 是片选 高选中或者低选中, CLK是通信的时钟线,
sbit SDO = P2^2; SDO应该是驱动芯片的数据输出口, 不过应该有输入口的??
怎么没看到程序里有????
void DELAY(void) //简单的延时子程序
{
uint x,y;
for(y = 5;y > 0;y--)
for(x = 110;x > 0;x--);
}

void main(void)
{
uint i = 0;
uint j = 0;
uint k = 0; 定义三个变量
TMOD = 0X20;
TH1 = 0XF3; 定时器工作方式 和初值
TL1 = 0XF3;
TR1 = 1; 打开定时器
REN = 1; REN SM0 SM1 是串口这里的设置 具体的你自己看文档 我就不
SM0 = 0; 细说了
SM1 = 1;

while(1)
{
CLK = 0;
CS = 1;
SDO = 0;

DELAY();

for(i=0;i<16;i++) 循环16次 应该是要传输2个字节的数据吧吧
{
CS = 0; 这个片选貌似应该放在循环外面
CLK = 1; 时钟线的控制
DELAY();
k = SDO; 把驱动芯片输出的数据赋值给K
j = j + k;
j = j << 1; 刚才的K 只是一个位, 这里两句是要把它整理成uint型的即16位的,
DELAY();
CLK = 0; 进行延时 和CLK时钟控制,即模拟驱动芯片的驱动时序
DELAY();
DELAY();
}

CS = 1; 选中或者取消片选 我感觉应该是取消

SBUF = (j >> 8) & 0XFF; 把刚才从驱动芯片里读出的uint 16位数据 取高八位 送入
while(!TI); 串口的SBUF 寄存器 貌似是要传给电脑 或者上位机软件
TI = 0; 等待传输完成 清 标志位

SBUF = j & 0XFF; 把刚才从驱动芯片里读出的uint 16位数据 取低八位 送入
while(!TI); 串口的SBUF 寄存器 貌似是要传给电脑 或者上位机软件
TI = 0; 等待传输完成 清 标志位

上面这次 正好把 UINT型的 16位 2个字节全部传输到上位机

SBUF = 0XFF; 最后在传输0xff 这个数据给上位机
while(!TI);
TI = 0;
}
}

好了 回答完了 , 希望能帮得上你。

回答2:

蜂鸣器唱《祝你平安》 *
; *
;********************************************************************************/
SPK bit P2.3

ORG 0000H
LJMP START
ORG 000BH
INC 20H ;中断服务,中断计数器加1
MOV TH0,#0D8H
MOV TL0,#0EFH ;12M晶振,形成10毫秒中断
RETI

START:
MOV SP,#50H
MOV TH0,#0D8H
MOV TL0,#0EFH
MOV TMOD,#01H
MOV IE,#82H
MUSIC0:
NOP
MOV DPTR,#DAT ;表头地址送DPTR
MOV 20H,#00H ;中断计数器清0
MOV B,#00H ;表序号清0
MUSIC1:
NOP
CLR A
MOVC A,@A+DPTR ;查表取代码
JZ END0 ;是00H,则结束
CJNE A,#0FFH,MUSIC5
LJMP MUSIC3
MUSIC5:
NOP
MOV R6,A
INC DPTR
MOV A,B
MOVC A,@A+DPTR ;取节拍代码送R7
MOV R7,A
SETB TR0 ;启动计数
MUSIC2:
NOP
CPL SPK
MOV A,R6
MOV R3,A
LCALL DEL
MOV A,R7
CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?
;不等,则继续循环
MOV 20H,#00H ;等于,则取下一代码
INC DPTR
; INC B
LJMP MUSIC1
MUSIC3:
NOP
CLR TR0 ;休止100毫秒
MOV R2,#0DH
MUSIC4:
NOP
MOV R3,#0FFH
LCALL DEL
DJNZ R2,MUSIC4
INC DPTR
LJMP MUSIC1
END0:
NOP
MOV R2,#64H ;歌曲结束,延时1秒后继续
MUSIC6:
MOV R3,#00H
LCALL DEL
DJNZ R2,MUSIC6
LJMP MUSIC0
DEL:
NOP
DEL3:
MOV R4,#02H
DEL4:
NOP
DJNZ R4,DEL4
NOP
DJNZ R3,DEL3
RET
NOP
DAT:
db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h
db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h
db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h
db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h
db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h
db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
db 20h,10h,2bh,10h,26h,30h,30h,80h,00H

END

回答3:

这应该是一个某芯片的驱动程序,在一芯片或端口读入数据再利用单片机串口将数据输出到另一芯片或端口,此程序从严格的意义上看有不妥之处且运行效率不高,有较大优化空间。具体动作较明显恕不赘述

回答4:

你只要了解了这块芯片的工作方式,基本上这个代码就可以理解了。自己慢慢理解。多看芯片资料。