main.c,加入工程组。硬件连接
点灯示例(C51)
#include <REGX51.H>
void delay_ms(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 110; j++) {
;
}
}
}
void main(void) {
while (1) {
P1_0 = 0; // 低电平点亮
delay_ms(500);
P1_0 = 1; // 高电平熄灭
delay_ms(500);
}
}
#include <REGX51.H>
sbit KEY = P3^2; // INT0 引脚
sbit LED = P1^0;
void delay_ms(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 110; j++) { ; }
}
}
void main(void) {
LED = 1;
while (1) {
if (KEY == 0) { // 按下为低
delay_ms(20); // 消抖
if (KEY == 0) {
LED = ~LED;
while (KEY == 0); // 等待松手
}
}
}
}
示例:每 1ms 进入中断,用于软件定时。
#include <REGX51.H>
unsigned int ms = 0;
void Timer0_Init(void) {
TMOD &= 0xF0; // 选择定时器0
TMOD |= 0x01; // 模式1(16位)
TH0 = 0xFC; // 11.0592MHz 下 1ms
TL0 = 0x18;
ET0 = 1; // 允许T0中断
EA = 1; // 总中断开
TR0 = 1; // 启动T0
}
void Timer0_ISR(void) interrupt 1 {
TH0 = 0xFC;
TL0 = 0x18;
ms++;
}
void main(void) {
Timer0_Init();
while (1) {
// 主循环
}
}
#include <REGX51.H>
void INT0_Init(void) {
IT0 = 1; // 下降沿触发
EX0 = 1; // 使能外部中断0
EA = 1; // 总中断开
}
void INT0_ISR(void) interrupt 0 {
// 外部中断响应
}
void main(void) {
INT0_Init();
while (1) {}
}
示例:9600bps,8N1,定时器1作为波特率发生器。
#include <REGX51.H>
void UART_Init(void) {
SCON = 0x50; // 8位UART, 允许接收
TMOD |= 0x20; // 定时器1模式2
TH1 = 0xFD; // 11.0592MHz, 9600
TL1 = 0xFD;
TR1 = 1; // 启动T1
EA = 1;
ES = 1; // 开启串口中断
}
void UART_Send(char c) {
SBUF = c;
while (TI == 0);
TI = 0;
}
void UART_ISR(void) interrupt 4 {
if (RI) {
RI = 0;
// 处理接收
}
}
void main(void) {
UART_Init();
UART_Send('H');
UART_Send('i');
while (1) {}
}
#include <REGX51.H>
unsigned char seg_code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void main(void) {
while (1) {
P0 = seg_code[3]; // 显示“3”
}
}
#include <REGX51.H>
sbit BEEP = P1^5;
void delay_us(unsigned int us) {
while (us--) { ; }
}
void main(void) {
while (1) {
BEEP = 0;
delay_us(200);
BEEP = 1;
delay_us(200);
}
}
#include <REGX51.H>
unsigned char seg_code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char disp[6] = {0,0,0,0,0,0};
unsigned char idx = 0;
unsigned int ms = 0;
unsigned char hour=12, min=0, sec=0;
void Timer0_Init(void) {
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = 0xFC; // 1ms
TL0 = 0x18;
ET0 = 1; EA = 1; TR0 = 1;
}
void Timer0_ISR(void) interrupt 1 {
TH0 = 0xFC; TL0 = 0x18;
ms++;
if (ms >= 1000) {
ms = 0;
sec++;
if (sec >= 60) { sec=0; min++; }
if (min >= 60) { min=0; hour++; }
if (hour >= 24) { hour=0; }
}
// 动态扫描 6 位
P2 = 0xFF; // 关位选
P0 = seg_code[disp[idx]];
P2 = ~(1 << idx); // 低有效位选
idx = (idx + 1) % 6;
}
void update_display(void) {
disp[0] = hour / 10;
disp[1] = hour % 10;
disp[2] = min / 10;
disp[3] = min % 10;
disp[4] = sec / 10;
disp[5] = sec % 10;
}
void main(void) {
Timer0_Init();
while (1) {
update_display();
}
}
#include <REGX51.H>
sbit DQ = P3^7;
unsigned char seg_code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void delay_us(unsigned int us){ while(us--); }
bit ds18b20_reset(void){
bit presence;
DQ = 1; delay_us(5);
DQ = 0; delay_us(500);
DQ = 1; delay_us(60);
presence = DQ; // 0 means present
delay_us(240);
return presence;
}
void ds18b20_write(unsigned char dat){
unsigned char i;
for(i=0;i<8;i++){
DQ=0; delay_us(2);
DQ = dat & 0x01; delay_us(60);
DQ=1; dat >>=1;
}
}
unsigned char ds18b20_read(void){
unsigned char i, dat=0;
for(i=0;i<8;i++){
DQ=0; delay_us(2);
DQ=1; delay_us(8);
dat >>=1;
if(DQ) dat |= 0x80;
delay_us(50);
}
return dat;
}
int ds18b20_get_temp(void){
unsigned char low, high;
ds18b20_reset();
ds18b20_write(0xCC); // Skip ROM
ds18b20_write(0x44); // Convert T
delay_us(50000);
ds18b20_reset();
ds18b20_write(0xCC);
ds18b20_write(0xBE); // Read Scratchpad
low = ds18b20_read();
high = ds18b20_read();
return (high<<8) | low; // raw
}
void main(void){
int raw;
unsigned char temp, tens, ones;
while(1){
raw = ds18b20_get_temp();
temp = (unsigned char)(raw / 16); // 12-bit -> integer
tens = temp / 10;
ones = temp % 10;
P0 = seg_code[tens]; // 简化演示,仅显示两位
P2 = 0xFE;
delay_us(2000);
P0 = seg_code[ones];
P2 = 0xFD;
delay_us(2000);
}
}
#include <REGX51.H>
void UART_Init(void) {
SCON = 0x50; // 8位UART, 允许接收
TMOD |= 0x20; // 定时器1模式2
TH1 = 0xFD; // 9600bps
TL1 = 0xFD;
TR1 = 1; EA = 1; ES = 1;
}
void UART_Send(char c) {
SBUF = c;
while (TI == 0);
TI = 0;
}
void UART_SendStr(char *s){
while(*s){ UART_Send(*s++); }
}
void UART_ISR(void) interrupt 4 {
char c;
if (RI) {
RI = 0;
c = SBUF;
if (c == 'L') { // 点亮
P1_0 = 0;
UART_SendStr("LED ON
");
} else if (c == 'O') { // 熄灭
P1_0 = 1;
UART_SendStr("LED OFF
");
}
}
}
void main(void) {
P1_0 = 1;
UART_Init();
UART_SendStr("Ready
");
while(1){}
}
器件清单
简单接线示意(ASCII)
P1.0 ----[1k]----|> LED ---- GND
P3.0 (RXD) -------------- TX (USB-串口)
P3.1 (TXD) -------------- RX (USB-串口)
P3.7 (DQ) ---[4.7k]--- VCC (DS18B20)
|
DS18B20