2023年12月11日发(作者:)
解决STC8G1K08程序不能运行的问题和端口配置
前一段时间我拿到一些样片,然后去打板测试
上电后自动运行IO轮流输出的程序,也就是出厂程序。这证明打的板子没有问题,可以正常使用。
但是问题就来了,我发现我自己的程序跑不起来。比如这么一个最简单的点灯程序。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "reg51.h"
#include "intrins.h"
sbit led1 = P1^1;
sbit led2 = P1^2;
sbit led3 = P1^3;
sbit led4 = P1^4;
void delay(int tim) //@11.0592MHz
{
unsigned char i, j;
i = 20;
j = 109;
for(i=0;i { do { while (--j); } while (--i); } } void main() { while(1) { led2 = 1; delay(200); led2 = 0; delay(200); } } 之后就找原因,先是看说3.0 3.1 3.2 必须至少有一个引脚是上拉,那我就上拉,接了一个10k电阻在VCC和P3.0之间。 结果就是,还是不行,那这个算是什么情况呢? 后面我看了一下手册,发现这样一段话,IO口在这一代(STC-Y6)中是必须要手动进行配置的,不能沿用以前C51单片机的开发思维,直 接赋值。 那么如何配置输入输出呢,这个在STC-ISP软件上的范例程序这一窗口里就有了,直接抄一下 所以代码修改为这样,大致就是增加了点儿端口模式设置1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 #include "reg51.h" #include "intrins.h" sbit led1 = P1^1; sbit led2 = P1^2; sbit led3 = P1^3; sbit led4 = P1^4; sfr P0M0 = 0x94; sfr P0M1 = 0x93; sfr P1M0 = 0x92; sfr P1M1 = 0x91; sfr P2M0 = 0x96; sfr P2M1 = 0x95; sfr P3M0 = 0xb2; sfr P3M1 = 0xb1; sfr P4M0 = 0xb4; sfr P4M1 = 0xb3; sfr P5M0 = 0xca; sfr P5M1 = 0xc9; sfr P6M0 = 0xcc; sfr P6M1 = 0xcb; sfr P7M0 = 0xe2; sfr P7M1 = 0xe1; void delay(int tim) //@11.0592MHz { unsigned char i, j; i = 20; j = 109; for(i=0;i { do { while (--j); } while (--i); } } void main() { P1M0 = 0x00; //Set P1 OUTPUT P1M1 = 0x00; while(1) { led1 = 1; delay(200); led1 = 0; delay(200); } } 官方的教程中也有类似的,比如这样的配置双向口读写操作。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include "reg51.h" #include "intrins.h" sfr P0M0 = 0x94; sfr P0M1 = 0x93; sbit P00 = P0^0; void main() { P0M0 = 0x00; //设置P0.0~P0.7为双向口模式 P0M1 = 0x00; P00 = 1; //P0.0口输出高电平 P00 = 0; //P0.0口输出低电平 P00 = 1; //读取端口前先使能内部弱上拉电阻 _nop_(); //等待两个时钟 _nop_(); // CY = P00; //读取端口状态 while (1); } 我看了下才知道,嚯,原来是头文件现在也变成新的了,以前时候开发,都是使用#include "reg51.h" 现在这句话变成了#include "STC8.h" , 而我没有用对所以就没法让LED亮起来。8293031323334#include "intrins.h"#include "STC8.h" void Delay300ms() //@24.000MHz{ unsigned char i, j, k; _nop_(); _nop_(); i = 37; j = 135; k = 138; do { do { while (--k); } while (--j); } while (--i);} void main(){ P1M0=0x00; P1M1=0x00; while(1) { P11=0; Delay300ms(); P11=1; Delay300ms(); }} 修改一下自己的代码,主要就改了头文件,因为新的头文件基本把一些定义都定好了,所以很多不需要在main文件里再写 #include "STC8.h"#include "intrins.h"sbit led1 = P1^1;sbit led2 = P1^2;sbit led3 = P1^3;sbit led4 = P1^4; void delay(int tim) //@11.0592MHz11{12 unsigned char i, j;13 int k;14 i = 15;15 j = 90;16 for(k=0;k 24}25 26 27void main()28{29 P1M0 = 0x00; //Set P1 OUTPUT30 P1M1 = 0x00;31 P1 = 0x00;32 while(1)33 {34 delay(10);35 P1 = P1<<1;36 delay(10);37 if(P1==0)38 {39 P1 = 0x01;40 }41 if(P1>0x0F)42 {43 P1 = 0x00;44 }45 }46} OK,现在测试成功 端口的配置 所有的 I/O 口均有 4 种工作模式:准双向口/弱上拉(标准 8051 输出口模式)、推挽输出/强上拉、高 阻输入(电流既不能流入也不能流 出)、开漏输出。可使用软件对 I/O 口的工作模式进行容易配置 除 P3.0 和 P3.1 外,其余所有 I/O 口上电后的状态均为高阻输入状态,用户在使 用 I/O 口时必须先设置 I/O 口模式 1 2 3 4 5 6 7 8 P0M0 = 0x00; //设置P0.0~P0.7为双向口模式 P0M1 = 0x00; P1M0 = 0xff; //设置P1.0~P1.7为推挽输出模式 P1M1 = 0x00; P2M0 = 0x00; //设置P2.0~P2.7为高阻输入模式 P2M1 = 0xff; P3M0 = 0xff; //设置P3.0~P3.7为开漏模式 P3M1 = 0xff; 如何设置,比如说要把所有P1和P3接口设置为双向模式,此时电流比较弱 1 2 3 4 P1M0 = 0x00; //Set P1 OUTPUT P1M1 = 0x00; P3M0 = 0x00; //Set P3 OUTPUT P3M1 = 0x00; 然后我需要用一下P37作为推挽输出,这时候用这一句就可以(需要头文件包含STC8.h) P3PU = 0x40;初次之外还有施密特触发控制寄存器PxNCS,电平速率转换PxSR,电流控制寄存器PxDR,输入使能寄存器PxIE (x=0,1,2,3,) STC8GK01的电气特性


发布评论