Assuming that each of your products is set up in your admin with "No, do not show quantity box", you could create the file /includes/extra_cart_actions/limit_to_one.php:
Code:
global $messageStack;
if (!defined(STOCK_LIMIT_TO_ONE)) {
define('STOCK_LIMIT_TO_ONE', 'Sorry, your purchase is limited to one of each product.');
}
if ($_GET['action'] == 'buy_now' || $_GET['action'] == 'add_product') {
$cart_qty = $_SESSION['cart']->in_cart_mixed($pID);
if ($cart_qty > 0) {
$messageStack->add_session('header', STOCK_LIMIT_TO_ONE, 'error');
zen_redirect(zen_href_link($goto, zen_get_all_get_params($parameters)));
}
}
That will "intercept" any changes (other than delete requests) to the cart, check to see if the product is already in the cart and, if so, display a message to let the customer know what's going on and negate that update.